blob: 439da8f2512ef22cb585c0ffd59f8c3514978eca [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;
Brandt Bucher145bf262021-02-26 14:51:55 -080094 PyObject *MatchAs_type;
95 PyObject *MatchOr_type;
96 PyObject *Match_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070097 PyObject *Mod_singleton;
98 PyObject *Mod_type;
99 PyObject *Module_type;
100 PyObject *Mult_singleton;
101 PyObject *Mult_type;
102 PyObject *Name_type;
103 PyObject *NamedExpr_type;
104 PyObject *Nonlocal_type;
105 PyObject *NotEq_singleton;
106 PyObject *NotEq_type;
107 PyObject *NotIn_singleton;
108 PyObject *NotIn_type;
109 PyObject *Not_singleton;
110 PyObject *Not_type;
111 PyObject *Or_singleton;
112 PyObject *Or_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700113 PyObject *Pass_type;
114 PyObject *Pow_singleton;
115 PyObject *Pow_type;
116 PyObject *RShift_singleton;
117 PyObject *RShift_type;
118 PyObject *Raise_type;
119 PyObject *Return_type;
120 PyObject *SetComp_type;
121 PyObject *Set_type;
122 PyObject *Slice_type;
123 PyObject *Starred_type;
124 PyObject *Store_singleton;
125 PyObject *Store_type;
126 PyObject *Sub_singleton;
127 PyObject *Sub_type;
128 PyObject *Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700129 PyObject *Try_type;
130 PyObject *Tuple_type;
131 PyObject *TypeIgnore_type;
132 PyObject *UAdd_singleton;
133 PyObject *UAdd_type;
134 PyObject *USub_singleton;
135 PyObject *USub_type;
136 PyObject *UnaryOp_type;
137 PyObject *While_type;
138 PyObject *With_type;
139 PyObject *YieldFrom_type;
140 PyObject *Yield_type;
141 PyObject *__dict__;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300142 PyObject *__doc__;
Brandt Bucher145bf262021-02-26 14:51:55 -0800143 PyObject *__match_args__;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700144 PyObject *__module__;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700145 PyObject *_attributes;
146 PyObject *_fields;
147 PyObject *alias_type;
148 PyObject *annotation;
149 PyObject *arg;
150 PyObject *arg_type;
151 PyObject *args;
152 PyObject *argtypes;
153 PyObject *arguments_type;
154 PyObject *asname;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200155 PyObject *ast;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700156 PyObject *attr;
157 PyObject *bases;
158 PyObject *body;
159 PyObject *boolop_type;
Brandt Bucher145bf262021-02-26 14:51:55 -0800160 PyObject *cases;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700161 PyObject *cause;
162 PyObject *cmpop_type;
163 PyObject *col_offset;
164 PyObject *comparators;
165 PyObject *comprehension_type;
166 PyObject *context_expr;
167 PyObject *conversion;
168 PyObject *ctx;
169 PyObject *decorator_list;
170 PyObject *defaults;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700171 PyObject *elt;
172 PyObject *elts;
173 PyObject *end_col_offset;
174 PyObject *end_lineno;
175 PyObject *exc;
176 PyObject *excepthandler_type;
177 PyObject *expr_context_type;
178 PyObject *expr_type;
179 PyObject *finalbody;
180 PyObject *format_spec;
181 PyObject *func;
182 PyObject *generators;
Brandt Bucher145bf262021-02-26 14:51:55 -0800183 PyObject *guard;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700184 PyObject *handlers;
185 PyObject *id;
186 PyObject *ifs;
187 PyObject *is_async;
188 PyObject *items;
189 PyObject *iter;
190 PyObject *key;
191 PyObject *keys;
192 PyObject *keyword_type;
193 PyObject *keywords;
194 PyObject *kind;
195 PyObject *kw_defaults;
196 PyObject *kwarg;
197 PyObject *kwonlyargs;
198 PyObject *left;
199 PyObject *level;
200 PyObject *lineno;
201 PyObject *lower;
Brandt Bucher145bf262021-02-26 14:51:55 -0800202 PyObject *match_case_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700203 PyObject *mod_type;
204 PyObject *module;
205 PyObject *msg;
206 PyObject *name;
207 PyObject *names;
208 PyObject *op;
209 PyObject *operand;
210 PyObject *operator_type;
211 PyObject *ops;
212 PyObject *optional_vars;
213 PyObject *orelse;
Brandt Bucher145bf262021-02-26 14:51:55 -0800214 PyObject *pattern;
215 PyObject *patterns;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700216 PyObject *posonlyargs;
217 PyObject *returns;
218 PyObject *right;
219 PyObject *simple;
220 PyObject *slice;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700221 PyObject *step;
222 PyObject *stmt_type;
Brandt Bucher145bf262021-02-26 14:51:55 -0800223 PyObject *subject;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700224 PyObject *tag;
225 PyObject *target;
226 PyObject *targets;
227 PyObject *test;
228 PyObject *type;
229 PyObject *type_comment;
230 PyObject *type_ignore_type;
231 PyObject *type_ignores;
232 PyObject *unaryop_type;
233 PyObject *upper;
234 PyObject *value;
235 PyObject *values;
236 PyObject *vararg;
237 PyObject *withitem_type;
Victor Stinner5cf47822020-11-02 22:03:28 +0100238};
239#endif // Py_BUILD_CORE
Dino Viehlandac46eb42019-09-11 10:16:34 -0700240
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200241// Forward declaration
Victor Stinner5cf47822020-11-02 22:03:28 +0100242static int init_types(struct ast_state *state);
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200243
Victor Stinner5cf47822020-11-02 22:03:28 +0100244#ifdef Py_BUILD_CORE
245static struct ast_state*
246get_ast_state(void)
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +0200247{
Victor Stinner5cf47822020-11-02 22:03:28 +0100248 PyInterpreterState *interp = _PyInterpreterState_GET();
249 struct ast_state *state = &interp->ast;
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200250 if (!init_types(state)) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +0200251 return NULL;
252 }
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +0200253 return state;
Victor Stinner74419f02020-07-03 11:35:37 +0200254}
Victor Stinner5cf47822020-11-02 22:03:28 +0100255#else
256static struct ast_state global_ast_state;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700257
Victor Stinner5cf47822020-11-02 22:03:28 +0100258static struct ast_state*
259get_ast_state(void)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700260{
Victor Stinner5cf47822020-11-02 22:03:28 +0100261 struct ast_state *state = &global_ast_state;
262 if (!init_types(state)) {
263 return NULL;
264 }
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200265 return state;
266}
Victor Stinner5cf47822020-11-02 22:03:28 +0100267#endif // Py_BUILD_CORE
268
269// Include Python-ast.h after pycore_interp.h to avoid conflicts
270// with the Yield macro redefined by <winbase.h>
271#include "Python-ast.h"
272#include "structmember.h"
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200273
Victor Stinnerfd957c12020-11-03 18:07:15 +0100274void _PyAST_Fini(PyInterpreterState *interp)
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200275{
Victor Stinner5cf47822020-11-02 22:03:28 +0100276#ifdef Py_BUILD_CORE
Victor Stinnerfd957c12020-11-03 18:07:15 +0100277 struct ast_state *state = &interp->ast;
Victor Stinner5cf47822020-11-02 22:03:28 +0100278#else
279 struct ast_state *state = &global_ast_state;
280#endif
281
Victor Stinner74419f02020-07-03 11:35:37 +0200282 Py_CLEAR(state->AST_type);
283 Py_CLEAR(state->Add_singleton);
284 Py_CLEAR(state->Add_type);
285 Py_CLEAR(state->And_singleton);
286 Py_CLEAR(state->And_type);
287 Py_CLEAR(state->AnnAssign_type);
288 Py_CLEAR(state->Assert_type);
289 Py_CLEAR(state->Assign_type);
290 Py_CLEAR(state->AsyncFor_type);
291 Py_CLEAR(state->AsyncFunctionDef_type);
292 Py_CLEAR(state->AsyncWith_type);
293 Py_CLEAR(state->Attribute_type);
294 Py_CLEAR(state->AugAssign_type);
295 Py_CLEAR(state->Await_type);
296 Py_CLEAR(state->BinOp_type);
297 Py_CLEAR(state->BitAnd_singleton);
298 Py_CLEAR(state->BitAnd_type);
299 Py_CLEAR(state->BitOr_singleton);
300 Py_CLEAR(state->BitOr_type);
301 Py_CLEAR(state->BitXor_singleton);
302 Py_CLEAR(state->BitXor_type);
303 Py_CLEAR(state->BoolOp_type);
304 Py_CLEAR(state->Break_type);
305 Py_CLEAR(state->Call_type);
306 Py_CLEAR(state->ClassDef_type);
307 Py_CLEAR(state->Compare_type);
308 Py_CLEAR(state->Constant_type);
309 Py_CLEAR(state->Continue_type);
310 Py_CLEAR(state->Del_singleton);
311 Py_CLEAR(state->Del_type);
312 Py_CLEAR(state->Delete_type);
313 Py_CLEAR(state->DictComp_type);
314 Py_CLEAR(state->Dict_type);
315 Py_CLEAR(state->Div_singleton);
316 Py_CLEAR(state->Div_type);
317 Py_CLEAR(state->Eq_singleton);
318 Py_CLEAR(state->Eq_type);
319 Py_CLEAR(state->ExceptHandler_type);
320 Py_CLEAR(state->Expr_type);
321 Py_CLEAR(state->Expression_type);
322 Py_CLEAR(state->FloorDiv_singleton);
323 Py_CLEAR(state->FloorDiv_type);
324 Py_CLEAR(state->For_type);
325 Py_CLEAR(state->FormattedValue_type);
326 Py_CLEAR(state->FunctionDef_type);
327 Py_CLEAR(state->FunctionType_type);
328 Py_CLEAR(state->GeneratorExp_type);
329 Py_CLEAR(state->Global_type);
330 Py_CLEAR(state->GtE_singleton);
331 Py_CLEAR(state->GtE_type);
332 Py_CLEAR(state->Gt_singleton);
333 Py_CLEAR(state->Gt_type);
334 Py_CLEAR(state->IfExp_type);
335 Py_CLEAR(state->If_type);
336 Py_CLEAR(state->ImportFrom_type);
337 Py_CLEAR(state->Import_type);
338 Py_CLEAR(state->In_singleton);
339 Py_CLEAR(state->In_type);
340 Py_CLEAR(state->Interactive_type);
341 Py_CLEAR(state->Invert_singleton);
342 Py_CLEAR(state->Invert_type);
343 Py_CLEAR(state->IsNot_singleton);
344 Py_CLEAR(state->IsNot_type);
345 Py_CLEAR(state->Is_singleton);
346 Py_CLEAR(state->Is_type);
347 Py_CLEAR(state->JoinedStr_type);
348 Py_CLEAR(state->LShift_singleton);
349 Py_CLEAR(state->LShift_type);
350 Py_CLEAR(state->Lambda_type);
351 Py_CLEAR(state->ListComp_type);
352 Py_CLEAR(state->List_type);
353 Py_CLEAR(state->Load_singleton);
354 Py_CLEAR(state->Load_type);
355 Py_CLEAR(state->LtE_singleton);
356 Py_CLEAR(state->LtE_type);
357 Py_CLEAR(state->Lt_singleton);
358 Py_CLEAR(state->Lt_type);
359 Py_CLEAR(state->MatMult_singleton);
360 Py_CLEAR(state->MatMult_type);
Brandt Bucher145bf262021-02-26 14:51:55 -0800361 Py_CLEAR(state->MatchAs_type);
362 Py_CLEAR(state->MatchOr_type);
363 Py_CLEAR(state->Match_type);
Victor Stinner74419f02020-07-03 11:35:37 +0200364 Py_CLEAR(state->Mod_singleton);
365 Py_CLEAR(state->Mod_type);
366 Py_CLEAR(state->Module_type);
367 Py_CLEAR(state->Mult_singleton);
368 Py_CLEAR(state->Mult_type);
369 Py_CLEAR(state->Name_type);
370 Py_CLEAR(state->NamedExpr_type);
371 Py_CLEAR(state->Nonlocal_type);
372 Py_CLEAR(state->NotEq_singleton);
373 Py_CLEAR(state->NotEq_type);
374 Py_CLEAR(state->NotIn_singleton);
375 Py_CLEAR(state->NotIn_type);
376 Py_CLEAR(state->Not_singleton);
377 Py_CLEAR(state->Not_type);
378 Py_CLEAR(state->Or_singleton);
379 Py_CLEAR(state->Or_type);
380 Py_CLEAR(state->Pass_type);
381 Py_CLEAR(state->Pow_singleton);
382 Py_CLEAR(state->Pow_type);
383 Py_CLEAR(state->RShift_singleton);
384 Py_CLEAR(state->RShift_type);
385 Py_CLEAR(state->Raise_type);
386 Py_CLEAR(state->Return_type);
387 Py_CLEAR(state->SetComp_type);
388 Py_CLEAR(state->Set_type);
389 Py_CLEAR(state->Slice_type);
390 Py_CLEAR(state->Starred_type);
391 Py_CLEAR(state->Store_singleton);
392 Py_CLEAR(state->Store_type);
393 Py_CLEAR(state->Sub_singleton);
394 Py_CLEAR(state->Sub_type);
395 Py_CLEAR(state->Subscript_type);
396 Py_CLEAR(state->Try_type);
397 Py_CLEAR(state->Tuple_type);
398 Py_CLEAR(state->TypeIgnore_type);
399 Py_CLEAR(state->UAdd_singleton);
400 Py_CLEAR(state->UAdd_type);
401 Py_CLEAR(state->USub_singleton);
402 Py_CLEAR(state->USub_type);
403 Py_CLEAR(state->UnaryOp_type);
404 Py_CLEAR(state->While_type);
405 Py_CLEAR(state->With_type);
406 Py_CLEAR(state->YieldFrom_type);
407 Py_CLEAR(state->Yield_type);
408 Py_CLEAR(state->__dict__);
409 Py_CLEAR(state->__doc__);
Brandt Bucher145bf262021-02-26 14:51:55 -0800410 Py_CLEAR(state->__match_args__);
Victor Stinner74419f02020-07-03 11:35:37 +0200411 Py_CLEAR(state->__module__);
412 Py_CLEAR(state->_attributes);
413 Py_CLEAR(state->_fields);
414 Py_CLEAR(state->alias_type);
415 Py_CLEAR(state->annotation);
416 Py_CLEAR(state->arg);
417 Py_CLEAR(state->arg_type);
418 Py_CLEAR(state->args);
419 Py_CLEAR(state->argtypes);
420 Py_CLEAR(state->arguments_type);
421 Py_CLEAR(state->asname);
422 Py_CLEAR(state->ast);
423 Py_CLEAR(state->attr);
424 Py_CLEAR(state->bases);
425 Py_CLEAR(state->body);
426 Py_CLEAR(state->boolop_type);
Brandt Bucher145bf262021-02-26 14:51:55 -0800427 Py_CLEAR(state->cases);
Victor Stinner74419f02020-07-03 11:35:37 +0200428 Py_CLEAR(state->cause);
429 Py_CLEAR(state->cmpop_type);
430 Py_CLEAR(state->col_offset);
431 Py_CLEAR(state->comparators);
432 Py_CLEAR(state->comprehension_type);
433 Py_CLEAR(state->context_expr);
434 Py_CLEAR(state->conversion);
435 Py_CLEAR(state->ctx);
436 Py_CLEAR(state->decorator_list);
437 Py_CLEAR(state->defaults);
438 Py_CLEAR(state->elt);
439 Py_CLEAR(state->elts);
440 Py_CLEAR(state->end_col_offset);
441 Py_CLEAR(state->end_lineno);
442 Py_CLEAR(state->exc);
443 Py_CLEAR(state->excepthandler_type);
444 Py_CLEAR(state->expr_context_type);
445 Py_CLEAR(state->expr_type);
446 Py_CLEAR(state->finalbody);
447 Py_CLEAR(state->format_spec);
448 Py_CLEAR(state->func);
449 Py_CLEAR(state->generators);
Brandt Bucher145bf262021-02-26 14:51:55 -0800450 Py_CLEAR(state->guard);
Victor Stinner74419f02020-07-03 11:35:37 +0200451 Py_CLEAR(state->handlers);
452 Py_CLEAR(state->id);
453 Py_CLEAR(state->ifs);
454 Py_CLEAR(state->is_async);
455 Py_CLEAR(state->items);
456 Py_CLEAR(state->iter);
457 Py_CLEAR(state->key);
458 Py_CLEAR(state->keys);
459 Py_CLEAR(state->keyword_type);
460 Py_CLEAR(state->keywords);
461 Py_CLEAR(state->kind);
462 Py_CLEAR(state->kw_defaults);
463 Py_CLEAR(state->kwarg);
464 Py_CLEAR(state->kwonlyargs);
465 Py_CLEAR(state->left);
466 Py_CLEAR(state->level);
467 Py_CLEAR(state->lineno);
468 Py_CLEAR(state->lower);
Brandt Bucher145bf262021-02-26 14:51:55 -0800469 Py_CLEAR(state->match_case_type);
Victor Stinner74419f02020-07-03 11:35:37 +0200470 Py_CLEAR(state->mod_type);
471 Py_CLEAR(state->module);
472 Py_CLEAR(state->msg);
473 Py_CLEAR(state->name);
474 Py_CLEAR(state->names);
475 Py_CLEAR(state->op);
476 Py_CLEAR(state->operand);
477 Py_CLEAR(state->operator_type);
478 Py_CLEAR(state->ops);
479 Py_CLEAR(state->optional_vars);
480 Py_CLEAR(state->orelse);
Brandt Bucher145bf262021-02-26 14:51:55 -0800481 Py_CLEAR(state->pattern);
482 Py_CLEAR(state->patterns);
Victor Stinner74419f02020-07-03 11:35:37 +0200483 Py_CLEAR(state->posonlyargs);
484 Py_CLEAR(state->returns);
485 Py_CLEAR(state->right);
486 Py_CLEAR(state->simple);
487 Py_CLEAR(state->slice);
488 Py_CLEAR(state->step);
489 Py_CLEAR(state->stmt_type);
Brandt Bucher145bf262021-02-26 14:51:55 -0800490 Py_CLEAR(state->subject);
Victor Stinner74419f02020-07-03 11:35:37 +0200491 Py_CLEAR(state->tag);
492 Py_CLEAR(state->target);
493 Py_CLEAR(state->targets);
494 Py_CLEAR(state->test);
495 Py_CLEAR(state->type);
496 Py_CLEAR(state->type_comment);
497 Py_CLEAR(state->type_ignore_type);
498 Py_CLEAR(state->type_ignores);
499 Py_CLEAR(state->unaryop_type);
500 Py_CLEAR(state->upper);
501 Py_CLEAR(state->value);
502 Py_CLEAR(state->values);
503 Py_CLEAR(state->vararg);
504 Py_CLEAR(state->withitem_type);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700505
Victor Stinnerfd957c12020-11-03 18:07:15 +0100506#if defined(Py_BUILD_CORE) && !defined(NDEBUG)
507 state->initialized = -1;
508#else
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200509 state->initialized = 0;
Victor Stinnerfd957c12020-11-03 18:07:15 +0100510#endif
Dino Viehlandac46eb42019-09-11 10:16:34 -0700511}
512
Victor Stinner5cf47822020-11-02 22:03:28 +0100513static int init_identifiers(struct ast_state *state)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700514{
Dino Viehlandac46eb42019-09-11 10:16:34 -0700515 if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300516 if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800517 if ((state->__match_args__ = PyUnicode_InternFromString("__match_args__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700518 if ((state->__module__ = PyUnicode_InternFromString("__module__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700519 if ((state->_attributes = PyUnicode_InternFromString("_attributes")) == NULL) return 0;
520 if ((state->_fields = PyUnicode_InternFromString("_fields")) == NULL) return 0;
521 if ((state->annotation = PyUnicode_InternFromString("annotation")) == NULL) return 0;
522 if ((state->arg = PyUnicode_InternFromString("arg")) == NULL) return 0;
523 if ((state->args = PyUnicode_InternFromString("args")) == NULL) return 0;
524 if ((state->argtypes = PyUnicode_InternFromString("argtypes")) == NULL) return 0;
525 if ((state->asname = PyUnicode_InternFromString("asname")) == NULL) return 0;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200526 if ((state->ast = PyUnicode_InternFromString("ast")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700527 if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0;
528 if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0;
529 if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800530 if ((state->cases = PyUnicode_InternFromString("cases")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700531 if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0;
532 if ((state->col_offset = PyUnicode_InternFromString("col_offset")) == NULL) return 0;
533 if ((state->comparators = PyUnicode_InternFromString("comparators")) == NULL) return 0;
534 if ((state->context_expr = PyUnicode_InternFromString("context_expr")) == NULL) return 0;
535 if ((state->conversion = PyUnicode_InternFromString("conversion")) == NULL) return 0;
536 if ((state->ctx = PyUnicode_InternFromString("ctx")) == NULL) return 0;
537 if ((state->decorator_list = PyUnicode_InternFromString("decorator_list")) == NULL) return 0;
538 if ((state->defaults = PyUnicode_InternFromString("defaults")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700539 if ((state->elt = PyUnicode_InternFromString("elt")) == NULL) return 0;
540 if ((state->elts = PyUnicode_InternFromString("elts")) == NULL) return 0;
541 if ((state->end_col_offset = PyUnicode_InternFromString("end_col_offset")) == NULL) return 0;
542 if ((state->end_lineno = PyUnicode_InternFromString("end_lineno")) == NULL) return 0;
543 if ((state->exc = PyUnicode_InternFromString("exc")) == NULL) return 0;
544 if ((state->finalbody = PyUnicode_InternFromString("finalbody")) == NULL) return 0;
545 if ((state->format_spec = PyUnicode_InternFromString("format_spec")) == NULL) return 0;
546 if ((state->func = PyUnicode_InternFromString("func")) == NULL) return 0;
547 if ((state->generators = PyUnicode_InternFromString("generators")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800548 if ((state->guard = PyUnicode_InternFromString("guard")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700549 if ((state->handlers = PyUnicode_InternFromString("handlers")) == NULL) return 0;
550 if ((state->id = PyUnicode_InternFromString("id")) == NULL) return 0;
551 if ((state->ifs = PyUnicode_InternFromString("ifs")) == NULL) return 0;
552 if ((state->is_async = PyUnicode_InternFromString("is_async")) == NULL) return 0;
553 if ((state->items = PyUnicode_InternFromString("items")) == NULL) return 0;
554 if ((state->iter = PyUnicode_InternFromString("iter")) == NULL) return 0;
555 if ((state->key = PyUnicode_InternFromString("key")) == NULL) return 0;
556 if ((state->keys = PyUnicode_InternFromString("keys")) == NULL) return 0;
557 if ((state->keywords = PyUnicode_InternFromString("keywords")) == NULL) return 0;
558 if ((state->kind = PyUnicode_InternFromString("kind")) == NULL) return 0;
559 if ((state->kw_defaults = PyUnicode_InternFromString("kw_defaults")) == NULL) return 0;
560 if ((state->kwarg = PyUnicode_InternFromString("kwarg")) == NULL) return 0;
561 if ((state->kwonlyargs = PyUnicode_InternFromString("kwonlyargs")) == NULL) return 0;
562 if ((state->left = PyUnicode_InternFromString("left")) == NULL) return 0;
563 if ((state->level = PyUnicode_InternFromString("level")) == NULL) return 0;
564 if ((state->lineno = PyUnicode_InternFromString("lineno")) == NULL) return 0;
565 if ((state->lower = PyUnicode_InternFromString("lower")) == NULL) return 0;
566 if ((state->module = PyUnicode_InternFromString("module")) == NULL) return 0;
567 if ((state->msg = PyUnicode_InternFromString("msg")) == NULL) return 0;
568 if ((state->name = PyUnicode_InternFromString("name")) == NULL) return 0;
569 if ((state->names = PyUnicode_InternFromString("names")) == NULL) return 0;
570 if ((state->op = PyUnicode_InternFromString("op")) == NULL) return 0;
571 if ((state->operand = PyUnicode_InternFromString("operand")) == NULL) return 0;
572 if ((state->ops = PyUnicode_InternFromString("ops")) == NULL) return 0;
573 if ((state->optional_vars = PyUnicode_InternFromString("optional_vars")) == NULL) return 0;
574 if ((state->orelse = PyUnicode_InternFromString("orelse")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800575 if ((state->pattern = PyUnicode_InternFromString("pattern")) == NULL) return 0;
576 if ((state->patterns = PyUnicode_InternFromString("patterns")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700577 if ((state->posonlyargs = PyUnicode_InternFromString("posonlyargs")) == NULL) return 0;
578 if ((state->returns = PyUnicode_InternFromString("returns")) == NULL) return 0;
579 if ((state->right = PyUnicode_InternFromString("right")) == NULL) return 0;
580 if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return 0;
581 if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return 0;
582 if ((state->step = PyUnicode_InternFromString("step")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800583 if ((state->subject = PyUnicode_InternFromString("subject")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700584 if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return 0;
585 if ((state->target = PyUnicode_InternFromString("target")) == NULL) return 0;
586 if ((state->targets = PyUnicode_InternFromString("targets")) == NULL) return 0;
587 if ((state->test = PyUnicode_InternFromString("test")) == NULL) return 0;
588 if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0;
589 if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0;
590 if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0;
591 if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0;
592 if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0;
593 if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0;
594 if ((state->vararg = PyUnicode_InternFromString("vararg")) == NULL) return 0;
595 return 1;
596};
597
Pablo Galindoa5634c42020-09-16 19:42:00 +0100598GENERATE_ASDL_SEQ_CONSTRUCTOR(mod, mod_ty)
599GENERATE_ASDL_SEQ_CONSTRUCTOR(stmt, stmt_ty)
600GENERATE_ASDL_SEQ_CONSTRUCTOR(expr, expr_ty)
601GENERATE_ASDL_SEQ_CONSTRUCTOR(comprehension, comprehension_ty)
602GENERATE_ASDL_SEQ_CONSTRUCTOR(excepthandler, excepthandler_ty)
603GENERATE_ASDL_SEQ_CONSTRUCTOR(arguments, arguments_ty)
604GENERATE_ASDL_SEQ_CONSTRUCTOR(arg, arg_ty)
605GENERATE_ASDL_SEQ_CONSTRUCTOR(keyword, keyword_ty)
606GENERATE_ASDL_SEQ_CONSTRUCTOR(alias, alias_ty)
607GENERATE_ASDL_SEQ_CONSTRUCTOR(withitem, withitem_ty)
Brandt Bucher145bf262021-02-26 14:51:55 -0800608GENERATE_ASDL_SEQ_CONSTRUCTOR(match_case, match_case_ty)
Pablo Galindoa5634c42020-09-16 19:42:00 +0100609GENERATE_ASDL_SEQ_CONSTRUCTOR(type_ignore, type_ignore_ty)
610
Victor Stinner5cf47822020-11-02 22:03:28 +0100611static PyObject* ast2obj_mod(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300612static const char * const Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200613 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800614 "type_ignores",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000615};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300616static const char * const Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200617 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000618};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300619static const char * const Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200620 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000621};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300622static const char * const FunctionType_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800623 "argtypes",
624 "returns",
625};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300626static const char * const stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200627 "lineno",
628 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000629 "end_lineno",
630 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000631};
Victor Stinner5cf47822020-11-02 22:03:28 +0100632static PyObject* ast2obj_stmt(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300633static const char * const FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200634 "name",
635 "args",
636 "body",
637 "decorator_list",
638 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800639 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000640};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300641static const char * const AsyncFunctionDef_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400642 "name",
643 "args",
644 "body",
645 "decorator_list",
646 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800647 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400648};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300649static const char * const ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200650 "name",
651 "bases",
652 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200653 "body",
654 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000655};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300656static const char * const Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200657 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000658};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300659static const char * const Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200660 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000661};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300662static const char * const Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200663 "targets",
664 "value",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800665 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000666};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300667static const char * const AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200668 "target",
669 "op",
670 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000671};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300672static const char * const AnnAssign_fields[]={
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700673 "target",
674 "annotation",
675 "value",
676 "simple",
677};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300678static const char * const For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200679 "target",
680 "iter",
681 "body",
682 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800683 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000684};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300685static const char * const AsyncFor_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400686 "target",
687 "iter",
688 "body",
689 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800690 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400691};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300692static const char * const While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200693 "test",
694 "body",
695 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000696};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300697static const char * const If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200698 "test",
699 "body",
700 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000701};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300702static const char * const With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200703 "items",
704 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800705 "type_comment",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000706};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300707static const char * const AsyncWith_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400708 "items",
709 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800710 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400711};
Brandt Bucher145bf262021-02-26 14:51:55 -0800712static const char * const Match_fields[]={
713 "subject",
714 "cases",
715};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300716static const char * const Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200717 "exc",
718 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000719};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300720static const char * const Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200721 "body",
722 "handlers",
723 "orelse",
724 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000725};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300726static const char * const Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200727 "test",
728 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000729};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300730static const char * const Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200731 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000732};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300733static const char * const ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200734 "module",
735 "names",
736 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000737};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300738static const char * const Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200739 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000740};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300741static const char * const Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200742 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000743};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300744static const char * const Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200745 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000746};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300747static const char * const expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200748 "lineno",
749 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000750 "end_lineno",
751 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000752};
Victor Stinner5cf47822020-11-02 22:03:28 +0100753static PyObject* ast2obj_expr(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300754static const char * const BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200755 "op",
756 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000757};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300758static const char * const NamedExpr_fields[]={
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700759 "target",
760 "value",
761};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300762static const char * const BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200763 "left",
764 "op",
765 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000766};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300767static const char * const UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200768 "op",
769 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000770};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300771static const char * const Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200772 "args",
773 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000774};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300775static const char * const IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200776 "test",
777 "body",
778 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000779};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300780static const char * const Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200781 "keys",
782 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000783};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300784static const char * const Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200785 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000786};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300787static const char * const ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200788 "elt",
789 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000790};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300791static const char * const SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200792 "elt",
793 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000794};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300795static const char * const DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200796 "key",
797 "value",
798 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000799};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300800static const char * const GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200801 "elt",
802 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000803};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300804static const char * const Await_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400805 "value",
806};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300807static const char * const Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200808 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500809};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300810static const char * const YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200811 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000812};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300813static const char * const Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200814 "left",
815 "ops",
816 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000817};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300818static const char * const Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200819 "func",
820 "args",
821 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000822};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300823static const char * const FormattedValue_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400824 "value",
825 "conversion",
826 "format_spec",
827};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300828static const char * const JoinedStr_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400829 "values",
830};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300831static const char * const Constant_fields[]={
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100832 "value",
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700833 "kind",
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100834};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300835static const char * const Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200836 "value",
837 "attr",
838 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000839};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300840static const char * const Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200841 "value",
842 "slice",
843 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000844};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300845static const char * const Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200846 "value",
847 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000848};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300849static const char * const Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200850 "id",
851 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000852};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300853static const char * const List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200854 "elts",
855 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000856};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300857static const char * const Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200858 "elts",
859 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000860};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300861static const char * const Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200862 "lower",
863 "upper",
864 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000865};
Brandt Bucher145bf262021-02-26 14:51:55 -0800866static const char * const MatchAs_fields[]={
867 "pattern",
868 "name",
869};
870static const char * const MatchOr_fields[]={
871 "patterns",
872};
Victor Stinner5cf47822020-11-02 22:03:28 +0100873static PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty);
874static PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty);
875static PyObject* ast2obj_operator(struct ast_state *state, operator_ty);
876static PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty);
877static PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty);
878static PyObject* ast2obj_comprehension(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300879static const char * const comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200880 "target",
881 "iter",
882 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700883 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000884};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300885static const char * const excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200886 "lineno",
887 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000888 "end_lineno",
889 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000890};
Victor Stinner5cf47822020-11-02 22:03:28 +0100891static PyObject* ast2obj_excepthandler(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300892static const char * const ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200893 "type",
894 "name",
895 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000896};
Victor Stinner5cf47822020-11-02 22:03:28 +0100897static PyObject* ast2obj_arguments(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300898static const char * const arguments_fields[]={
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100899 "posonlyargs",
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200900 "args",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200901 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200902 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200903 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200904 "kwarg",
905 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000906};
Victor Stinner5cf47822020-11-02 22:03:28 +0100907static PyObject* ast2obj_arg(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300908static const char * const arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200909 "lineno",
910 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000911 "end_lineno",
912 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700913};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300914static const char * const arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200915 "arg",
916 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800917 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +0000918};
Victor Stinner5cf47822020-11-02 22:03:28 +0100919static PyObject* ast2obj_keyword(struct ast_state *state, void*);
Pablo Galindo168660b2020-04-02 00:47:39 +0100920static const char * const keyword_attributes[] = {
921 "lineno",
922 "col_offset",
923 "end_lineno",
924 "end_col_offset",
925};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300926static const char * const keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200927 "arg",
928 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000929};
Victor Stinner5cf47822020-11-02 22:03:28 +0100930static PyObject* ast2obj_alias(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300931static const char * const alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200932 "name",
933 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000934};
Victor Stinner5cf47822020-11-02 22:03:28 +0100935static PyObject* ast2obj_withitem(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300936static const char * const withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200937 "context_expr",
938 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500939};
Brandt Bucher145bf262021-02-26 14:51:55 -0800940static PyObject* ast2obj_match_case(struct ast_state *state, void*);
941static const char * const match_case_fields[]={
942 "pattern",
943 "guard",
944 "body",
945};
Victor Stinner5cf47822020-11-02 22:03:28 +0100946static PyObject* ast2obj_type_ignore(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300947static const char * const TypeIgnore_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800948 "lineno",
Michael J. Sullivan933e1502019-05-22 07:54:20 -0700949 "tag",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800950};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000951
952
INADA Naokifc489082017-01-25 22:33:43 +0900953
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700954typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100955 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700956 PyObject *dict;
957} AST_object;
958
Benjamin Peterson1767e022012-03-14 21:50:29 -0500959static void
960ast_dealloc(AST_object *self)
961{
INADA Naokia6296d32017-08-24 14:55:17 +0900962 /* bpo-31095: UnTrack is needed before calling any callbacks */
Eddie Elizondo0247e802019-09-14 09:38:17 -0400963 PyTypeObject *tp = Py_TYPE(self);
INADA Naokia6296d32017-08-24 14:55:17 +0900964 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500965 Py_CLEAR(self->dict);
Eddie Elizondo0247e802019-09-14 09:38:17 -0400966 freefunc free_func = PyType_GetSlot(tp, Py_tp_free);
967 assert(free_func != NULL);
968 free_func(self);
969 Py_DECREF(tp);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500970}
971
Neal Norwitz207c9f32008-03-31 04:42:11 +0000972static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700973ast_traverse(AST_object *self, visitproc visit, void *arg)
974{
Pablo Galindo1cf15af2020-05-27 10:03:38 +0100975 Py_VISIT(Py_TYPE(self));
Benjamin Peterson81071762012-07-08 11:03:46 -0700976 Py_VISIT(self->dict);
977 return 0;
978}
979
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300980static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700981ast_clear(AST_object *self)
982{
983 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300984 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700985}
986
987static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000988ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
989{
Victor Stinner5cf47822020-11-02 22:03:28 +0100990 struct ast_state *state = get_ast_state();
Victor Stinner1f764532020-07-04 23:18:15 +0200991 if (state == NULL) {
992 return -1;
993 }
994
Neal Norwitz207c9f32008-03-31 04:42:11 +0000995 Py_ssize_t i, numfields = 0;
996 int res = -1;
997 PyObject *key, *value, *fields;
Victor Stinner74419f02020-07-03 11:35:37 +0200998 if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200999 goto cleanup;
1000 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001001 if (fields) {
1002 numfields = PySequence_Size(fields);
Rémi Lapeyrec73914a2020-05-24 23:12:57 +02001003 if (numfields == -1) {
Neal Norwitz207c9f32008-03-31 04:42:11 +00001004 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +02001005 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001006 }
INADA Naoki4c78c522017-02-24 02:48:17 +09001007
Neal Norwitz207c9f32008-03-31 04:42:11 +00001008 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +09001009 if (numfields < PyTuple_GET_SIZE(args)) {
1010 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
1011 "%zd positional argument%s",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001012 _PyType_Name(Py_TYPE(self)),
INADA Naoki4c78c522017-02-24 02:48:17 +09001013 numfields, numfields == 1 ? "" : "s");
1014 res = -1;
1015 goto cleanup;
1016 }
1017 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
1018 /* cannot be reached when fields is NULL */
1019 PyObject *name = PySequence_GetItem(fields, i);
1020 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +00001021 res = -1;
1022 goto cleanup;
1023 }
INADA Naoki4c78c522017-02-24 02:48:17 +09001024 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
1025 Py_DECREF(name);
Rémi Lapeyrec73914a2020-05-24 23:12:57 +02001026 if (res < 0) {
INADA Naoki4c78c522017-02-24 02:48:17 +09001027 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +02001028 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001029 }
1030 if (kw) {
1031 i = 0; /* needed by PyDict_Next */
1032 while (PyDict_Next(kw, &i, &key, &value)) {
Rémi Lapeyrec73914a2020-05-24 23:12:57 +02001033 int contains = PySequence_Contains(fields, key);
1034 if (contains == -1) {
1035 res = -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001036 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +02001037 } else if (contains == 1) {
1038 Py_ssize_t p = PySequence_Index(fields, key);
1039 if (p == -1) {
1040 res = -1;
1041 goto cleanup;
1042 }
1043 if (p < PyTuple_GET_SIZE(args)) {
1044 PyErr_Format(PyExc_TypeError,
1045 "%.400s got multiple values for argument '%U'",
1046 Py_TYPE(self)->tp_name, key);
1047 res = -1;
1048 goto cleanup;
1049 }
1050 }
1051 res = PyObject_SetAttr(self, key, value);
1052 if (res < 0) {
1053 goto cleanup;
1054 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001055 }
1056 }
1057 cleanup:
1058 Py_XDECREF(fields);
1059 return res;
1060}
1061
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001062/* Pickling support */
1063static PyObject *
1064ast_type_reduce(PyObject *self, PyObject *unused)
1065{
Victor Stinner5cf47822020-11-02 22:03:28 +01001066 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02001067 if (state == NULL) {
1068 return NULL;
1069 }
1070
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001071 PyObject *dict;
Victor Stinner74419f02020-07-03 11:35:37 +02001072 if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001073 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001074 }
1075 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001076 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001077 }
1078 return Py_BuildValue("O()", Py_TYPE(self));
1079}
1080
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001081static PyMemberDef ast_type_members[] = {
1082 {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY},
1083 {NULL} /* Sentinel */
1084};
1085
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001086static PyMethodDef ast_type_methods[] = {
1087 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
1088 {NULL}
1089};
1090
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001091static PyGetSetDef ast_type_getsets[] = {
1092 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
1093 {NULL}
1094};
1095
Dino Viehlandac46eb42019-09-11 10:16:34 -07001096static PyType_Slot AST_type_slots[] = {
1097 {Py_tp_dealloc, ast_dealloc},
1098 {Py_tp_getattro, PyObject_GenericGetAttr},
1099 {Py_tp_setattro, PyObject_GenericSetAttr},
1100 {Py_tp_traverse, ast_traverse},
1101 {Py_tp_clear, ast_clear},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001102 {Py_tp_members, ast_type_members},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001103 {Py_tp_methods, ast_type_methods},
1104 {Py_tp_getset, ast_type_getsets},
1105 {Py_tp_init, ast_type_init},
1106 {Py_tp_alloc, PyType_GenericAlloc},
1107 {Py_tp_new, PyType_GenericNew},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001108 {Py_tp_free, PyObject_GC_Del},
1109 {0, 0},
1110};
1111
1112static PyType_Spec AST_type_spec = {
Serhiy Storchakabace59d2020-03-22 20:33:34 +02001113 "ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001114 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +00001115 0,
Dino Viehlandac46eb42019-09-11 10:16:34 -07001116 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1117 AST_type_slots
Neal Norwitz207c9f32008-03-31 04:42:11 +00001118};
1119
Dino Viehlandac46eb42019-09-11 10:16:34 -07001120static PyObject *
Victor Stinner5cf47822020-11-02 22:03:28 +01001121make_type(struct ast_state *state, const char *type, PyObject* base,
Victor Stinner74419f02020-07-03 11:35:37 +02001122 const char* const* fields, int num_fields, const char *doc)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001123{
1124 PyObject *fnames, *result;
1125 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001126 fnames = PyTuple_New(num_fields);
1127 if (!fnames) return NULL;
1128 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001129 PyObject *field = PyUnicode_InternFromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001130 if (!field) {
1131 Py_DECREF(fnames);
1132 return NULL;
1133 }
1134 PyTuple_SET_ITEM(fnames, i, field);
1135 }
Brandt Bucher145bf262021-02-26 14:51:55 -08001136 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOOOs}",
INADA Naokifc489082017-01-25 22:33:43 +09001137 type, base,
Victor Stinner74419f02020-07-03 11:35:37 +02001138 state->_fields, fnames,
Brandt Bucher145bf262021-02-26 14:51:55 -08001139 state->__match_args__, fnames,
Victor Stinner74419f02020-07-03 11:35:37 +02001140 state->__module__,
1141 state->ast,
1142 state->__doc__, doc);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001143 Py_DECREF(fnames);
Dino Viehlandac46eb42019-09-11 10:16:34 -07001144 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001145}
1146
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001147static int
Victor Stinner5cf47822020-11-02 22:03:28 +01001148add_attributes(struct ast_state *state, PyObject *type, const char * const *attrs, int num_fields)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001149{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001150 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001151 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +00001152 if (!l)
1153 return 0;
1154 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001155 s = PyUnicode_InternFromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001156 if (!s) {
1157 Py_DECREF(l);
1158 return 0;
1159 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001160 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001161 }
Victor Stinner74419f02020-07-03 11:35:37 +02001162 result = PyObject_SetAttr(type, state->_attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001163 Py_DECREF(l);
1164 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001165}
1166
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001167/* Conversion AST -> Python */
1168
Victor Stinner5cf47822020-11-02 22:03:28 +01001169static 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 +00001170{
Benjamin Peterson77fa9372012-05-15 10:10:27 -07001171 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001172 PyObject *result = PyList_New(n);
1173 PyObject *value;
1174 if (!result)
1175 return NULL;
1176 for (i = 0; i < n; i++) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01001177 value = func(state, asdl_seq_GET_UNTYPED(seq, i));
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001178 if (!value) {
1179 Py_DECREF(result);
1180 return NULL;
1181 }
1182 PyList_SET_ITEM(result, i, value);
1183 }
1184 return result;
1185}
1186
Victor Stinner5cf47822020-11-02 22:03:28 +01001187static PyObject* ast2obj_object(struct ast_state *Py_UNUSED(state), void *o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001188{
1189 if (!o)
1190 o = Py_None;
1191 Py_INCREF((PyObject*)o);
1192 return (PyObject*)o;
1193}
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001194#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001195#define ast2obj_identifier ast2obj_object
1196#define ast2obj_string ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001197
Victor Stinner5cf47822020-11-02 22:03:28 +01001198static PyObject* ast2obj_int(struct ast_state *Py_UNUSED(state), long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001199{
Christian Heimes217cfd12007-12-02 14:31:20 +00001200 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001201}
1202
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001203/* Conversion Python -> AST */
1204
Victor Stinner5cf47822020-11-02 22:03:28 +01001205static int obj2ast_object(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001206{
1207 if (obj == Py_None)
1208 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +02001209 if (obj) {
1210 if (PyArena_AddPyObject(arena, obj) < 0) {
1211 *out = NULL;
1212 return -1;
1213 }
1214 Py_INCREF(obj);
1215 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001216 *out = obj;
1217 return 0;
1218}
1219
Victor Stinner5cf47822020-11-02 22:03:28 +01001220static int obj2ast_constant(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001221{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001222 if (PyArena_AddPyObject(arena, obj) < 0) {
1223 *out = NULL;
1224 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001225 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001226 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001227 *out = obj;
1228 return 0;
1229}
1230
Victor Stinner5cf47822020-11-02 22:03:28 +01001231static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001232{
Benjamin Peterson180e6352011-07-22 11:09:07 -05001233 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
1234 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001235 return 1;
1236 }
Victor Stinner74419f02020-07-03 11:35:37 +02001237 return obj2ast_object(state, obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001238}
1239
Victor Stinner5cf47822020-11-02 22:03:28 +01001240static int obj2ast_string(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001241{
1242 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
1243 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
1244 return 1;
1245 }
Victor Stinner74419f02020-07-03 11:35:37 +02001246 return obj2ast_object(state, obj, out, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001247}
1248
Victor Stinner5cf47822020-11-02 22:03:28 +01001249static int obj2ast_int(struct ast_state* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001250{
1251 int i;
1252 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +01001253 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001254 return 1;
1255 }
1256
Serhiy Storchaka56f6e762015-09-06 21:25:30 +03001257 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001258 if (i == -1 && PyErr_Occurred())
1259 return 1;
1260 *out = i;
1261 return 0;
1262}
1263
Victor Stinner5cf47822020-11-02 22:03:28 +01001264static int add_ast_fields(struct ast_state *state)
Benjamin Petersonce825f12008-10-24 23:11:02 +00001265{
Dino Viehlandac46eb42019-09-11 10:16:34 -07001266 PyObject *empty_tuple;
Benjamin Petersonce825f12008-10-24 23:11:02 +00001267 empty_tuple = PyTuple_New(0);
1268 if (!empty_tuple ||
Victor Stinner74419f02020-07-03 11:35:37 +02001269 PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 ||
Brandt Bucher145bf262021-02-26 14:51:55 -08001270 PyObject_SetAttrString(state->AST_type, "__match_args__", empty_tuple) < 0 ||
Victor Stinner74419f02020-07-03 11:35:37 +02001271 PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +00001272 Py_XDECREF(empty_tuple);
1273 return -1;
1274 }
1275 Py_DECREF(empty_tuple);
1276 return 0;
1277}
1278
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001279
Victor Stinnerfd957c12020-11-03 18:07:15 +01001280
1281static int
1282init_types(struct ast_state *state)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001283{
Victor Stinnerfd957c12020-11-03 18:07:15 +01001284 // init_types() must not be called after _PyAST_Fini()
1285 // has been called
1286 assert(state->initialized >= 0);
1287
1288 if (state->initialized) {
1289 return 1;
1290 }
1291 if (init_identifiers(state) < 0) {
1292 return 0;
1293 }
Dino Viehlandac46eb42019-09-11 10:16:34 -07001294 state->AST_type = PyType_FromSpec(&AST_type_spec);
Victor Stinnerfd957c12020-11-03 18:07:15 +01001295 if (!state->AST_type) {
1296 return 0;
1297 }
1298 if (add_ast_fields(state) < 0) {
1299 return 0;
1300 }
Victor Stinner74419f02020-07-03 11:35:37 +02001301 state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001302 "mod = Module(stmt* body, type_ignore* type_ignores)\n"
1303 " | Interactive(stmt* body)\n"
1304 " | Expression(expr body)\n"
1305 " | FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001306 if (!state->mod_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001307 if (!add_attributes(state, state->mod_type, NULL, 0)) return 0;
1308 state->Module_type = make_type(state, "Module", state->mod_type,
1309 Module_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001310 "Module(stmt* body, type_ignore* type_ignores)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001311 if (!state->Module_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001312 state->Interactive_type = make_type(state, "Interactive", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001313 Interactive_fields, 1,
1314 "Interactive(stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001315 if (!state->Interactive_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001316 state->Expression_type = make_type(state, "Expression", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001317 Expression_fields, 1,
1318 "Expression(expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001319 if (!state->Expression_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001320 state->FunctionType_type = make_type(state, "FunctionType",
1321 state->mod_type, FunctionType_fields,
1322 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001323 "FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001324 if (!state->FunctionType_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001325 state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001326 "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1327 " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1328 " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n"
1329 " | Return(expr? value)\n"
1330 " | Delete(expr* targets)\n"
1331 " | Assign(expr* targets, expr value, string? type_comment)\n"
1332 " | AugAssign(expr target, operator op, expr value)\n"
1333 " | AnnAssign(expr target, expr annotation, expr? value, int simple)\n"
1334 " | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1335 " | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1336 " | While(expr test, stmt* body, stmt* orelse)\n"
1337 " | If(expr test, stmt* body, stmt* orelse)\n"
1338 " | With(withitem* items, stmt* body, string? type_comment)\n"
1339 " | AsyncWith(withitem* items, stmt* body, string? type_comment)\n"
Brandt Bucher145bf262021-02-26 14:51:55 -08001340 " | Match(expr subject, match_case* cases)\n"
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001341 " | Raise(expr? exc, expr? cause)\n"
1342 " | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n"
1343 " | Assert(expr test, expr? msg)\n"
1344 " | Import(alias* names)\n"
1345 " | ImportFrom(identifier? module, alias* names, int? level)\n"
1346 " | Global(identifier* names)\n"
1347 " | Nonlocal(identifier* names)\n"
1348 " | Expr(expr value)\n"
1349 " | Pass\n"
1350 " | Break\n"
1351 " | Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001352 if (!state->stmt_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001353 if (!add_attributes(state, state->stmt_type, stmt_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001354 if (PyObject_SetAttr(state->stmt_type, state->end_lineno, Py_None) == -1)
1355 return 0;
1356 if (PyObject_SetAttr(state->stmt_type, state->end_col_offset, Py_None) ==
1357 -1)
1358 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001359 state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001360 FunctionDef_fields, 6,
1361 "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001362 if (!state->FunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001363 if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) ==
1364 -1)
1365 return 0;
1366 if (PyObject_SetAttr(state->FunctionDef_type, state->type_comment, Py_None)
1367 == -1)
1368 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001369 state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001370 state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001371 AsyncFunctionDef_fields, 6,
1372 "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001373 if (!state->AsyncFunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001374 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None)
1375 == -1)
1376 return 0;
1377 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->type_comment,
1378 Py_None) == -1)
1379 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001380 state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001381 ClassDef_fields, 5,
1382 "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001383 if (!state->ClassDef_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001384 state->Return_type = make_type(state, "Return", state->stmt_type,
1385 Return_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001386 "Return(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001387 if (!state->Return_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001388 if (PyObject_SetAttr(state->Return_type, state->value, Py_None) == -1)
1389 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001390 state->Delete_type = make_type(state, "Delete", state->stmt_type,
1391 Delete_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001392 "Delete(expr* targets)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001393 if (!state->Delete_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001394 state->Assign_type = make_type(state, "Assign", state->stmt_type,
1395 Assign_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001396 "Assign(expr* targets, expr value, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001397 if (!state->Assign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001398 if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) ==
1399 -1)
1400 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001401 state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001402 AugAssign_fields, 3,
1403 "AugAssign(expr target, operator op, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001404 if (!state->AugAssign_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001405 state->AnnAssign_type = make_type(state, "AnnAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001406 AnnAssign_fields, 4,
1407 "AnnAssign(expr target, expr annotation, expr? value, int simple)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001408 if (!state->AnnAssign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001409 if (PyObject_SetAttr(state->AnnAssign_type, state->value, Py_None) == -1)
1410 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001411 state->For_type = make_type(state, "For", state->stmt_type, For_fields, 5,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001412 "For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001413 if (!state->For_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001414 if (PyObject_SetAttr(state->For_type, state->type_comment, Py_None) == -1)
1415 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001416 state->AsyncFor_type = make_type(state, "AsyncFor", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001417 AsyncFor_fields, 5,
1418 "AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001419 if (!state->AsyncFor_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001420 if (PyObject_SetAttr(state->AsyncFor_type, state->type_comment, Py_None) ==
1421 -1)
1422 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001423 state->While_type = make_type(state, "While", state->stmt_type,
1424 While_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001425 "While(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001426 if (!state->While_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001427 state->If_type = make_type(state, "If", state->stmt_type, If_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001428 "If(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001429 if (!state->If_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001430 state->With_type = make_type(state, "With", state->stmt_type, With_fields,
1431 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001432 "With(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001433 if (!state->With_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001434 if (PyObject_SetAttr(state->With_type, state->type_comment, Py_None) == -1)
1435 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001436 state->AsyncWith_type = make_type(state, "AsyncWith", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001437 AsyncWith_fields, 3,
1438 "AsyncWith(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001439 if (!state->AsyncWith_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001440 if (PyObject_SetAttr(state->AsyncWith_type, state->type_comment, Py_None)
1441 == -1)
1442 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08001443 state->Match_type = make_type(state, "Match", state->stmt_type,
1444 Match_fields, 2,
1445 "Match(expr subject, match_case* cases)");
1446 if (!state->Match_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001447 state->Raise_type = make_type(state, "Raise", state->stmt_type,
1448 Raise_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001449 "Raise(expr? exc, expr? cause)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001450 if (!state->Raise_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001451 if (PyObject_SetAttr(state->Raise_type, state->exc, Py_None) == -1)
1452 return 0;
1453 if (PyObject_SetAttr(state->Raise_type, state->cause, Py_None) == -1)
1454 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001455 state->Try_type = make_type(state, "Try", state->stmt_type, Try_fields, 4,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001456 "Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001457 if (!state->Try_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001458 state->Assert_type = make_type(state, "Assert", state->stmt_type,
1459 Assert_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001460 "Assert(expr test, expr? msg)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001461 if (!state->Assert_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001462 if (PyObject_SetAttr(state->Assert_type, state->msg, Py_None) == -1)
1463 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001464 state->Import_type = make_type(state, "Import", state->stmt_type,
1465 Import_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001466 "Import(alias* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001467 if (!state->Import_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001468 state->ImportFrom_type = make_type(state, "ImportFrom", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001469 ImportFrom_fields, 3,
1470 "ImportFrom(identifier? module, alias* names, int? level)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001471 if (!state->ImportFrom_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001472 if (PyObject_SetAttr(state->ImportFrom_type, state->module, Py_None) == -1)
1473 return 0;
1474 if (PyObject_SetAttr(state->ImportFrom_type, state->level, Py_None) == -1)
1475 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001476 state->Global_type = make_type(state, "Global", state->stmt_type,
1477 Global_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001478 "Global(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001479 if (!state->Global_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001480 state->Nonlocal_type = make_type(state, "Nonlocal", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001481 Nonlocal_fields, 1,
1482 "Nonlocal(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001483 if (!state->Nonlocal_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001484 state->Expr_type = make_type(state, "Expr", state->stmt_type, Expr_fields,
1485 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001486 "Expr(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001487 if (!state->Expr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001488 state->Pass_type = make_type(state, "Pass", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001489 "Pass");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001490 if (!state->Pass_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001491 state->Break_type = make_type(state, "Break", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001492 "Break");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001493 if (!state->Break_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001494 state->Continue_type = make_type(state, "Continue", state->stmt_type, NULL,
1495 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001496 "Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001497 if (!state->Continue_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001498 state->expr_type = make_type(state, "expr", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001499 "expr = BoolOp(boolop op, expr* values)\n"
1500 " | NamedExpr(expr target, expr value)\n"
1501 " | BinOp(expr left, operator op, expr right)\n"
1502 " | UnaryOp(unaryop op, expr operand)\n"
1503 " | Lambda(arguments args, expr body)\n"
1504 " | IfExp(expr test, expr body, expr orelse)\n"
1505 " | Dict(expr* keys, expr* values)\n"
1506 " | Set(expr* elts)\n"
1507 " | ListComp(expr elt, comprehension* generators)\n"
1508 " | SetComp(expr elt, comprehension* generators)\n"
1509 " | DictComp(expr key, expr value, comprehension* generators)\n"
1510 " | GeneratorExp(expr elt, comprehension* generators)\n"
1511 " | Await(expr value)\n"
1512 " | Yield(expr? value)\n"
1513 " | YieldFrom(expr value)\n"
1514 " | Compare(expr left, cmpop* ops, expr* comparators)\n"
1515 " | Call(expr func, expr* args, keyword* keywords)\n"
1516 " | FormattedValue(expr value, int? conversion, expr? format_spec)\n"
1517 " | JoinedStr(expr* values)\n"
1518 " | Constant(constant value, string? kind)\n"
1519 " | Attribute(expr value, identifier attr, expr_context ctx)\n"
1520 " | Subscript(expr value, expr slice, expr_context ctx)\n"
1521 " | Starred(expr value, expr_context ctx)\n"
1522 " | Name(identifier id, expr_context ctx)\n"
1523 " | List(expr* elts, expr_context ctx)\n"
1524 " | Tuple(expr* elts, expr_context ctx)\n"
Brandt Bucher145bf262021-02-26 14:51:55 -08001525 " | Slice(expr? lower, expr? upper, expr? step)\n"
1526 " | MatchAs(expr pattern, identifier name)\n"
1527 " | MatchOr(expr* patterns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001528 if (!state->expr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001529 if (!add_attributes(state, state->expr_type, expr_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001530 if (PyObject_SetAttr(state->expr_type, state->end_lineno, Py_None) == -1)
1531 return 0;
1532 if (PyObject_SetAttr(state->expr_type, state->end_col_offset, Py_None) ==
1533 -1)
1534 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001535 state->BoolOp_type = make_type(state, "BoolOp", state->expr_type,
1536 BoolOp_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001537 "BoolOp(boolop op, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001538 if (!state->BoolOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001539 state->NamedExpr_type = make_type(state, "NamedExpr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001540 NamedExpr_fields, 2,
1541 "NamedExpr(expr target, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001542 if (!state->NamedExpr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001543 state->BinOp_type = make_type(state, "BinOp", state->expr_type,
1544 BinOp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001545 "BinOp(expr left, operator op, expr right)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001546 if (!state->BinOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001547 state->UnaryOp_type = make_type(state, "UnaryOp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001548 UnaryOp_fields, 2,
1549 "UnaryOp(unaryop op, expr operand)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001550 if (!state->UnaryOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001551 state->Lambda_type = make_type(state, "Lambda", state->expr_type,
1552 Lambda_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001553 "Lambda(arguments args, expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001554 if (!state->Lambda_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001555 state->IfExp_type = make_type(state, "IfExp", state->expr_type,
1556 IfExp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001557 "IfExp(expr test, expr body, expr orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001558 if (!state->IfExp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001559 state->Dict_type = make_type(state, "Dict", state->expr_type, Dict_fields,
1560 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001561 "Dict(expr* keys, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001562 if (!state->Dict_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001563 state->Set_type = make_type(state, "Set", state->expr_type, Set_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001564 "Set(expr* elts)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001565 if (!state->Set_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001566 state->ListComp_type = make_type(state, "ListComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001567 ListComp_fields, 2,
1568 "ListComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001569 if (!state->ListComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001570 state->SetComp_type = make_type(state, "SetComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001571 SetComp_fields, 2,
1572 "SetComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001573 if (!state->SetComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001574 state->DictComp_type = make_type(state, "DictComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001575 DictComp_fields, 3,
1576 "DictComp(expr key, expr value, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001577 if (!state->DictComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001578 state->GeneratorExp_type = make_type(state, "GeneratorExp",
1579 state->expr_type, GeneratorExp_fields,
1580 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001581 "GeneratorExp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001582 if (!state->GeneratorExp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001583 state->Await_type = make_type(state, "Await", state->expr_type,
1584 Await_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001585 "Await(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001586 if (!state->Await_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001587 state->Yield_type = make_type(state, "Yield", state->expr_type,
1588 Yield_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001589 "Yield(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001590 if (!state->Yield_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001591 if (PyObject_SetAttr(state->Yield_type, state->value, Py_None) == -1)
1592 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001593 state->YieldFrom_type = make_type(state, "YieldFrom", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001594 YieldFrom_fields, 1,
1595 "YieldFrom(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001596 if (!state->YieldFrom_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001597 state->Compare_type = make_type(state, "Compare", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001598 Compare_fields, 3,
1599 "Compare(expr left, cmpop* ops, expr* comparators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001600 if (!state->Compare_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001601 state->Call_type = make_type(state, "Call", state->expr_type, Call_fields,
1602 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001603 "Call(expr func, expr* args, keyword* keywords)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001604 if (!state->Call_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001605 state->FormattedValue_type = make_type(state, "FormattedValue",
1606 state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001607 FormattedValue_fields, 3,
1608 "FormattedValue(expr value, int? conversion, expr? format_spec)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001609 if (!state->FormattedValue_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001610 if (PyObject_SetAttr(state->FormattedValue_type, state->conversion,
1611 Py_None) == -1)
1612 return 0;
1613 if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec,
1614 Py_None) == -1)
1615 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001616 state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001617 JoinedStr_fields, 1,
1618 "JoinedStr(expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001619 if (!state->JoinedStr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001620 state->Constant_type = make_type(state, "Constant", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001621 Constant_fields, 2,
1622 "Constant(constant value, string? kind)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001623 if (!state->Constant_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001624 if (PyObject_SetAttr(state->Constant_type, state->kind, Py_None) == -1)
1625 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001626 state->Attribute_type = make_type(state, "Attribute", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001627 Attribute_fields, 3,
1628 "Attribute(expr value, identifier attr, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001629 if (!state->Attribute_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001630 state->Subscript_type = make_type(state, "Subscript", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001631 Subscript_fields, 3,
1632 "Subscript(expr value, expr slice, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001633 if (!state->Subscript_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001634 state->Starred_type = make_type(state, "Starred", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001635 Starred_fields, 2,
1636 "Starred(expr value, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001637 if (!state->Starred_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001638 state->Name_type = make_type(state, "Name", state->expr_type, Name_fields,
1639 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001640 "Name(identifier id, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001641 if (!state->Name_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001642 state->List_type = make_type(state, "List", state->expr_type, List_fields,
1643 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001644 "List(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001645 if (!state->List_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001646 state->Tuple_type = make_type(state, "Tuple", state->expr_type,
1647 Tuple_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001648 "Tuple(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001649 if (!state->Tuple_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001650 state->Slice_type = make_type(state, "Slice", state->expr_type,
1651 Slice_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001652 "Slice(expr? lower, expr? upper, expr? step)");
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001653 if (!state->Slice_type) return 0;
1654 if (PyObject_SetAttr(state->Slice_type, state->lower, Py_None) == -1)
1655 return 0;
1656 if (PyObject_SetAttr(state->Slice_type, state->upper, Py_None) == -1)
1657 return 0;
1658 if (PyObject_SetAttr(state->Slice_type, state->step, Py_None) == -1)
1659 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08001660 state->MatchAs_type = make_type(state, "MatchAs", state->expr_type,
1661 MatchAs_fields, 2,
1662 "MatchAs(expr pattern, identifier name)");
1663 if (!state->MatchAs_type) return 0;
1664 state->MatchOr_type = make_type(state, "MatchOr", state->expr_type,
1665 MatchOr_fields, 1,
1666 "MatchOr(expr* patterns)");
1667 if (!state->MatchOr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001668 state->expr_context_type = make_type(state, "expr_context",
1669 state->AST_type, NULL, 0,
Serhiy Storchaka6b975982020-03-17 23:41:08 +02001670 "expr_context = Load | Store | Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001671 if (!state->expr_context_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001672 if (!add_attributes(state, state->expr_context_type, NULL, 0)) return 0;
1673 state->Load_type = make_type(state, "Load", state->expr_context_type, NULL,
1674 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001675 "Load");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001676 if (!state->Load_type) return 0;
1677 state->Load_singleton = PyType_GenericNew((PyTypeObject *)state->Load_type,
1678 NULL, NULL);
1679 if (!state->Load_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001680 state->Store_type = make_type(state, "Store", state->expr_context_type,
1681 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001682 "Store");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001683 if (!state->Store_type) return 0;
1684 state->Store_singleton = PyType_GenericNew((PyTypeObject
1685 *)state->Store_type, NULL, NULL);
1686 if (!state->Store_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001687 state->Del_type = make_type(state, "Del", state->expr_context_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001688 "Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001689 if (!state->Del_type) return 0;
1690 state->Del_singleton = PyType_GenericNew((PyTypeObject *)state->Del_type,
1691 NULL, NULL);
1692 if (!state->Del_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001693 state->boolop_type = make_type(state, "boolop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001694 "boolop = And | Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001695 if (!state->boolop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001696 if (!add_attributes(state, state->boolop_type, NULL, 0)) return 0;
1697 state->And_type = make_type(state, "And", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001698 "And");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001699 if (!state->And_type) return 0;
1700 state->And_singleton = PyType_GenericNew((PyTypeObject *)state->And_type,
1701 NULL, NULL);
1702 if (!state->And_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001703 state->Or_type = make_type(state, "Or", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001704 "Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001705 if (!state->Or_type) return 0;
1706 state->Or_singleton = PyType_GenericNew((PyTypeObject *)state->Or_type,
1707 NULL, NULL);
1708 if (!state->Or_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001709 state->operator_type = make_type(state, "operator", state->AST_type, NULL,
1710 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001711 "operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001712 if (!state->operator_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001713 if (!add_attributes(state, state->operator_type, NULL, 0)) return 0;
1714 state->Add_type = make_type(state, "Add", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001715 "Add");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001716 if (!state->Add_type) return 0;
1717 state->Add_singleton = PyType_GenericNew((PyTypeObject *)state->Add_type,
1718 NULL, NULL);
1719 if (!state->Add_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001720 state->Sub_type = make_type(state, "Sub", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001721 "Sub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001722 if (!state->Sub_type) return 0;
1723 state->Sub_singleton = PyType_GenericNew((PyTypeObject *)state->Sub_type,
1724 NULL, NULL);
1725 if (!state->Sub_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001726 state->Mult_type = make_type(state, "Mult", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001727 "Mult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001728 if (!state->Mult_type) return 0;
1729 state->Mult_singleton = PyType_GenericNew((PyTypeObject *)state->Mult_type,
1730 NULL, NULL);
1731 if (!state->Mult_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001732 state->MatMult_type = make_type(state, "MatMult", state->operator_type,
1733 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001734 "MatMult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001735 if (!state->MatMult_type) return 0;
1736 state->MatMult_singleton = PyType_GenericNew((PyTypeObject
1737 *)state->MatMult_type, NULL,
1738 NULL);
1739 if (!state->MatMult_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001740 state->Div_type = make_type(state, "Div", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001741 "Div");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001742 if (!state->Div_type) return 0;
1743 state->Div_singleton = PyType_GenericNew((PyTypeObject *)state->Div_type,
1744 NULL, NULL);
1745 if (!state->Div_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001746 state->Mod_type = make_type(state, "Mod", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001747 "Mod");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001748 if (!state->Mod_type) return 0;
1749 state->Mod_singleton = PyType_GenericNew((PyTypeObject *)state->Mod_type,
1750 NULL, NULL);
1751 if (!state->Mod_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001752 state->Pow_type = make_type(state, "Pow", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001753 "Pow");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001754 if (!state->Pow_type) return 0;
1755 state->Pow_singleton = PyType_GenericNew((PyTypeObject *)state->Pow_type,
1756 NULL, NULL);
1757 if (!state->Pow_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001758 state->LShift_type = make_type(state, "LShift", state->operator_type, NULL,
1759 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001760 "LShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001761 if (!state->LShift_type) return 0;
1762 state->LShift_singleton = PyType_GenericNew((PyTypeObject
1763 *)state->LShift_type, NULL,
1764 NULL);
1765 if (!state->LShift_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001766 state->RShift_type = make_type(state, "RShift", state->operator_type, NULL,
1767 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001768 "RShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001769 if (!state->RShift_type) return 0;
1770 state->RShift_singleton = PyType_GenericNew((PyTypeObject
1771 *)state->RShift_type, NULL,
1772 NULL);
1773 if (!state->RShift_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001774 state->BitOr_type = make_type(state, "BitOr", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001775 "BitOr");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001776 if (!state->BitOr_type) return 0;
1777 state->BitOr_singleton = PyType_GenericNew((PyTypeObject
1778 *)state->BitOr_type, NULL, NULL);
1779 if (!state->BitOr_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001780 state->BitXor_type = make_type(state, "BitXor", state->operator_type, NULL,
1781 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001782 "BitXor");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001783 if (!state->BitXor_type) return 0;
1784 state->BitXor_singleton = PyType_GenericNew((PyTypeObject
1785 *)state->BitXor_type, NULL,
1786 NULL);
1787 if (!state->BitXor_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001788 state->BitAnd_type = make_type(state, "BitAnd", state->operator_type, NULL,
1789 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001790 "BitAnd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001791 if (!state->BitAnd_type) return 0;
1792 state->BitAnd_singleton = PyType_GenericNew((PyTypeObject
1793 *)state->BitAnd_type, NULL,
1794 NULL);
1795 if (!state->BitAnd_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001796 state->FloorDiv_type = make_type(state, "FloorDiv", state->operator_type,
1797 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001798 "FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001799 if (!state->FloorDiv_type) return 0;
1800 state->FloorDiv_singleton = PyType_GenericNew((PyTypeObject
1801 *)state->FloorDiv_type, NULL,
1802 NULL);
1803 if (!state->FloorDiv_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001804 state->unaryop_type = make_type(state, "unaryop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001805 "unaryop = Invert | Not | UAdd | USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001806 if (!state->unaryop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001807 if (!add_attributes(state, state->unaryop_type, NULL, 0)) return 0;
1808 state->Invert_type = make_type(state, "Invert", state->unaryop_type, NULL,
1809 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001810 "Invert");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001811 if (!state->Invert_type) return 0;
1812 state->Invert_singleton = PyType_GenericNew((PyTypeObject
1813 *)state->Invert_type, NULL,
1814 NULL);
1815 if (!state->Invert_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001816 state->Not_type = make_type(state, "Not", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001817 "Not");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001818 if (!state->Not_type) return 0;
1819 state->Not_singleton = PyType_GenericNew((PyTypeObject *)state->Not_type,
1820 NULL, NULL);
1821 if (!state->Not_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001822 state->UAdd_type = make_type(state, "UAdd", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001823 "UAdd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001824 if (!state->UAdd_type) return 0;
1825 state->UAdd_singleton = PyType_GenericNew((PyTypeObject *)state->UAdd_type,
1826 NULL, NULL);
1827 if (!state->UAdd_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001828 state->USub_type = make_type(state, "USub", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001829 "USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001830 if (!state->USub_type) return 0;
1831 state->USub_singleton = PyType_GenericNew((PyTypeObject *)state->USub_type,
1832 NULL, NULL);
1833 if (!state->USub_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001834 state->cmpop_type = make_type(state, "cmpop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001835 "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001836 if (!state->cmpop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001837 if (!add_attributes(state, state->cmpop_type, NULL, 0)) return 0;
1838 state->Eq_type = make_type(state, "Eq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001839 "Eq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001840 if (!state->Eq_type) return 0;
1841 state->Eq_singleton = PyType_GenericNew((PyTypeObject *)state->Eq_type,
1842 NULL, NULL);
1843 if (!state->Eq_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001844 state->NotEq_type = make_type(state, "NotEq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001845 "NotEq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001846 if (!state->NotEq_type) return 0;
1847 state->NotEq_singleton = PyType_GenericNew((PyTypeObject
1848 *)state->NotEq_type, NULL, NULL);
1849 if (!state->NotEq_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001850 state->Lt_type = make_type(state, "Lt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001851 "Lt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001852 if (!state->Lt_type) return 0;
1853 state->Lt_singleton = PyType_GenericNew((PyTypeObject *)state->Lt_type,
1854 NULL, NULL);
1855 if (!state->Lt_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001856 state->LtE_type = make_type(state, "LtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001857 "LtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001858 if (!state->LtE_type) return 0;
1859 state->LtE_singleton = PyType_GenericNew((PyTypeObject *)state->LtE_type,
1860 NULL, NULL);
1861 if (!state->LtE_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001862 state->Gt_type = make_type(state, "Gt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001863 "Gt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001864 if (!state->Gt_type) return 0;
1865 state->Gt_singleton = PyType_GenericNew((PyTypeObject *)state->Gt_type,
1866 NULL, NULL);
1867 if (!state->Gt_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001868 state->GtE_type = make_type(state, "GtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001869 "GtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001870 if (!state->GtE_type) return 0;
1871 state->GtE_singleton = PyType_GenericNew((PyTypeObject *)state->GtE_type,
1872 NULL, NULL);
1873 if (!state->GtE_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001874 state->Is_type = make_type(state, "Is", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001875 "Is");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001876 if (!state->Is_type) return 0;
1877 state->Is_singleton = PyType_GenericNew((PyTypeObject *)state->Is_type,
1878 NULL, NULL);
1879 if (!state->Is_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001880 state->IsNot_type = make_type(state, "IsNot", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001881 "IsNot");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001882 if (!state->IsNot_type) return 0;
1883 state->IsNot_singleton = PyType_GenericNew((PyTypeObject
1884 *)state->IsNot_type, NULL, NULL);
1885 if (!state->IsNot_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001886 state->In_type = make_type(state, "In", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001887 "In");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001888 if (!state->In_type) return 0;
1889 state->In_singleton = PyType_GenericNew((PyTypeObject *)state->In_type,
1890 NULL, NULL);
1891 if (!state->In_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001892 state->NotIn_type = make_type(state, "NotIn", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001893 "NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001894 if (!state->NotIn_type) return 0;
1895 state->NotIn_singleton = PyType_GenericNew((PyTypeObject
1896 *)state->NotIn_type, NULL, NULL);
1897 if (!state->NotIn_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001898 state->comprehension_type = make_type(state, "comprehension",
1899 state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001900 comprehension_fields, 4,
1901 "comprehension(expr target, expr iter, expr* ifs, int is_async)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001902 if (!state->comprehension_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001903 if (!add_attributes(state, state->comprehension_type, NULL, 0)) return 0;
1904 state->excepthandler_type = make_type(state, "excepthandler",
1905 state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001906 "excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001907 if (!state->excepthandler_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001908 if (!add_attributes(state, state->excepthandler_type,
1909 excepthandler_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001910 if (PyObject_SetAttr(state->excepthandler_type, state->end_lineno, Py_None)
1911 == -1)
1912 return 0;
1913 if (PyObject_SetAttr(state->excepthandler_type, state->end_col_offset,
1914 Py_None) == -1)
1915 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001916 state->ExceptHandler_type = make_type(state, "ExceptHandler",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001917 state->excepthandler_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001918 ExceptHandler_fields, 3,
1919 "ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001920 if (!state->ExceptHandler_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001921 if (PyObject_SetAttr(state->ExceptHandler_type, state->type, Py_None) == -1)
1922 return 0;
1923 if (PyObject_SetAttr(state->ExceptHandler_type, state->name, Py_None) == -1)
1924 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001925 state->arguments_type = make_type(state, "arguments", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001926 arguments_fields, 7,
1927 "arguments(arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001928 if (!state->arguments_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001929 if (!add_attributes(state, state->arguments_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001930 if (PyObject_SetAttr(state->arguments_type, state->vararg, Py_None) == -1)
1931 return 0;
1932 if (PyObject_SetAttr(state->arguments_type, state->kwarg, Py_None) == -1)
1933 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001934 state->arg_type = make_type(state, "arg", state->AST_type, arg_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001935 "arg(identifier arg, expr? annotation, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001936 if (!state->arg_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001937 if (!add_attributes(state, state->arg_type, arg_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001938 if (PyObject_SetAttr(state->arg_type, state->annotation, Py_None) == -1)
1939 return 0;
1940 if (PyObject_SetAttr(state->arg_type, state->type_comment, Py_None) == -1)
1941 return 0;
1942 if (PyObject_SetAttr(state->arg_type, state->end_lineno, Py_None) == -1)
1943 return 0;
1944 if (PyObject_SetAttr(state->arg_type, state->end_col_offset, Py_None) == -1)
1945 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001946 state->keyword_type = make_type(state, "keyword", state->AST_type,
1947 keyword_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001948 "keyword(identifier? arg, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001949 if (!state->keyword_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001950 if (!add_attributes(state, state->keyword_type, keyword_attributes, 4))
1951 return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001952 if (PyObject_SetAttr(state->keyword_type, state->arg, Py_None) == -1)
1953 return 0;
Pablo Galindo168660b2020-04-02 00:47:39 +01001954 if (PyObject_SetAttr(state->keyword_type, state->end_lineno, Py_None) == -1)
1955 return 0;
1956 if (PyObject_SetAttr(state->keyword_type, state->end_col_offset, Py_None)
1957 == -1)
1958 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001959 state->alias_type = make_type(state, "alias", state->AST_type,
1960 alias_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001961 "alias(identifier name, identifier? asname)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001962 if (!state->alias_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001963 if (!add_attributes(state, state->alias_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001964 if (PyObject_SetAttr(state->alias_type, state->asname, Py_None) == -1)
1965 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001966 state->withitem_type = make_type(state, "withitem", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001967 withitem_fields, 2,
1968 "withitem(expr context_expr, expr? optional_vars)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001969 if (!state->withitem_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001970 if (!add_attributes(state, state->withitem_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001971 if (PyObject_SetAttr(state->withitem_type, state->optional_vars, Py_None)
1972 == -1)
1973 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08001974 state->match_case_type = make_type(state, "match_case", state->AST_type,
1975 match_case_fields, 3,
1976 "match_case(expr pattern, expr? guard, stmt* body)");
1977 if (!state->match_case_type) return 0;
1978 if (!add_attributes(state, state->match_case_type, NULL, 0)) return 0;
1979 if (PyObject_SetAttr(state->match_case_type, state->guard, Py_None) == -1)
1980 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001981 state->type_ignore_type = make_type(state, "type_ignore", state->AST_type,
1982 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001983 "type_ignore = TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001984 if (!state->type_ignore_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001985 if (!add_attributes(state, state->type_ignore_type, NULL, 0)) return 0;
1986 state->TypeIgnore_type = make_type(state, "TypeIgnore",
1987 state->type_ignore_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001988 TypeIgnore_fields, 2,
1989 "TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001990 if (!state->TypeIgnore_type) return 0;
Victor Stinnerfd957c12020-11-03 18:07:15 +01001991
Dino Viehlandac46eb42019-09-11 10:16:34 -07001992 state->initialized = 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001993 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001994}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001995
Victor Stinner5cf47822020-11-02 22:03:28 +01001996static int obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001997 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001998static int obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001999 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002000static int obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02002001 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002002static int obj2ast_expr_context(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02002003 expr_context_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002004static int obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty*
2005 out, PyArena* arena);
2006static int obj2ast_operator(struct ast_state *state, PyObject* obj,
2007 operator_ty* out, PyArena* arena);
2008static int obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02002009 out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002010static int obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02002011 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002012static int obj2ast_comprehension(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02002013 comprehension_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002014static int obj2ast_excepthandler(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02002015 excepthandler_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002016static int obj2ast_arguments(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02002017 arguments_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002018static int obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02002019 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002020static int obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02002021 out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002022static int obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02002023 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002024static int obj2ast_withitem(struct ast_state *state, PyObject* obj,
2025 withitem_ty* out, PyArena* arena);
Brandt Bucher145bf262021-02-26 14:51:55 -08002026static int obj2ast_match_case(struct ast_state *state, PyObject* obj,
2027 match_case_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01002028static int obj2ast_type_ignore(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02002029 type_ignore_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002030
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031mod_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002032Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores, PyArena
2033 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002035 mod_ty p;
2036 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2037 if (!p)
2038 return NULL;
2039 p->kind = Module_kind;
2040 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002041 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002042 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043}
2044
2045mod_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002046Interactive(asdl_stmt_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002048 mod_ty p;
2049 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2050 if (!p)
2051 return NULL;
2052 p->kind = Interactive_kind;
2053 p->v.Interactive.body = body;
2054 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055}
2056
2057mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002058Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002060 mod_ty p;
2061 if (!body) {
2062 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002063 "field 'body' is required for Expression");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002064 return NULL;
2065 }
2066 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2067 if (!p)
2068 return NULL;
2069 p->kind = Expression_kind;
2070 p->v.Expression.body = body;
2071 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072}
2073
2074mod_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002075FunctionType(asdl_expr_seq * argtypes, expr_ty returns, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002076{
2077 mod_ty p;
2078 if (!returns) {
2079 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002080 "field 'returns' is required for FunctionType");
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002081 return NULL;
2082 }
2083 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2084 if (!p)
2085 return NULL;
2086 p->kind = FunctionType_kind;
2087 p->v.FunctionType.argtypes = argtypes;
2088 p->v.FunctionType.returns = returns;
2089 return p;
2090}
2091
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002093FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
2094 asdl_expr_seq * decorator_list, expr_ty returns, string
2095 type_comment, int lineno, int col_offset, int end_lineno, int
2096 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002098 stmt_ty p;
2099 if (!name) {
2100 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002101 "field 'name' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002102 return NULL;
2103 }
2104 if (!args) {
2105 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002106 "field 'args' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002107 return NULL;
2108 }
2109 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2110 if (!p)
2111 return NULL;
2112 p->kind = FunctionDef_kind;
2113 p->v.FunctionDef.name = name;
2114 p->v.FunctionDef.args = args;
2115 p->v.FunctionDef.body = body;
2116 p->v.FunctionDef.decorator_list = decorator_list;
2117 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002118 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002119 p->lineno = lineno;
2120 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002121 p->end_lineno = end_lineno;
2122 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002123 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124}
2125
2126stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002127AsyncFunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
2128 asdl_expr_seq * decorator_list, expr_ty returns, string
2129 type_comment, int lineno, int col_offset, int end_lineno, int
2130 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002131{
2132 stmt_ty p;
2133 if (!name) {
2134 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002135 "field 'name' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002136 return NULL;
2137 }
2138 if (!args) {
2139 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002140 "field 'args' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002141 return NULL;
2142 }
2143 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2144 if (!p)
2145 return NULL;
2146 p->kind = AsyncFunctionDef_kind;
2147 p->v.AsyncFunctionDef.name = name;
2148 p->v.AsyncFunctionDef.args = args;
2149 p->v.AsyncFunctionDef.body = body;
2150 p->v.AsyncFunctionDef.decorator_list = decorator_list;
2151 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002152 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002153 p->lineno = lineno;
2154 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002155 p->end_lineno = end_lineno;
2156 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002157 return p;
2158}
2159
2160stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002161ClassDef(identifier name, asdl_expr_seq * bases, asdl_keyword_seq * keywords,
2162 asdl_stmt_seq * body, asdl_expr_seq * decorator_list, int lineno, int
2163 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002164{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002165 stmt_ty p;
2166 if (!name) {
2167 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002168 "field 'name' is required for ClassDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002169 return NULL;
2170 }
2171 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2172 if (!p)
2173 return NULL;
2174 p->kind = ClassDef_kind;
2175 p->v.ClassDef.name = name;
2176 p->v.ClassDef.bases = bases;
2177 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002178 p->v.ClassDef.body = body;
2179 p->v.ClassDef.decorator_list = decorator_list;
2180 p->lineno = lineno;
2181 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002182 p->end_lineno = end_lineno;
2183 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002184 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185}
2186
2187stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002188Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
2189 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002191 stmt_ty p;
2192 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2193 if (!p)
2194 return NULL;
2195 p->kind = Return_kind;
2196 p->v.Return.value = value;
2197 p->lineno = lineno;
2198 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002199 p->end_lineno = end_lineno;
2200 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002201 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202}
2203
2204stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002205Delete(asdl_expr_seq * targets, int lineno, int col_offset, int end_lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002206 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002208 stmt_ty p;
2209 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2210 if (!p)
2211 return NULL;
2212 p->kind = Delete_kind;
2213 p->v.Delete.targets = targets;
2214 p->lineno = lineno;
2215 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002216 p->end_lineno = end_lineno;
2217 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002218 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219}
2220
2221stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002222Assign(asdl_expr_seq * targets, expr_ty value, string type_comment, int lineno,
2223 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002225 stmt_ty p;
2226 if (!value) {
2227 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002228 "field 'value' is required for Assign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002229 return NULL;
2230 }
2231 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2232 if (!p)
2233 return NULL;
2234 p->kind = Assign_kind;
2235 p->v.Assign.targets = targets;
2236 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002237 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002238 p->lineno = lineno;
2239 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002240 p->end_lineno = end_lineno;
2241 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002242 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243}
2244
2245stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002246AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002247 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002249 stmt_ty p;
2250 if (!target) {
2251 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002252 "field 'target' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002253 return NULL;
2254 }
2255 if (!op) {
2256 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002257 "field 'op' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002258 return NULL;
2259 }
2260 if (!value) {
2261 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002262 "field 'value' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002263 return NULL;
2264 }
2265 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2266 if (!p)
2267 return NULL;
2268 p->kind = AugAssign_kind;
2269 p->v.AugAssign.target = target;
2270 p->v.AugAssign.op = op;
2271 p->v.AugAssign.value = value;
2272 p->lineno = lineno;
2273 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002274 p->end_lineno = end_lineno;
2275 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002276 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277}
2278
2279stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002280AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002281 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2282 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002283{
2284 stmt_ty p;
2285 if (!target) {
2286 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002287 "field 'target' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002288 return NULL;
2289 }
2290 if (!annotation) {
2291 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002292 "field 'annotation' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002293 return NULL;
2294 }
2295 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2296 if (!p)
2297 return NULL;
2298 p->kind = AnnAssign_kind;
2299 p->v.AnnAssign.target = target;
2300 p->v.AnnAssign.annotation = annotation;
2301 p->v.AnnAssign.value = value;
2302 p->v.AnnAssign.simple = simple;
2303 p->lineno = lineno;
2304 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002305 p->end_lineno = end_lineno;
2306 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002307 return p;
2308}
2309
2310stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002311For(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq * orelse,
2312 string type_comment, int lineno, int col_offset, int end_lineno, int
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002313 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002315 stmt_ty p;
2316 if (!target) {
2317 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002318 "field 'target' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002319 return NULL;
2320 }
2321 if (!iter) {
2322 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002323 "field 'iter' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002324 return NULL;
2325 }
2326 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2327 if (!p)
2328 return NULL;
2329 p->kind = For_kind;
2330 p->v.For.target = target;
2331 p->v.For.iter = iter;
2332 p->v.For.body = body;
2333 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002334 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002335 p->lineno = lineno;
2336 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002337 p->end_lineno = end_lineno;
2338 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002339 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340}
2341
2342stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002343AsyncFor(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq *
2344 orelse, string type_comment, int lineno, int col_offset, int
2345 end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002346{
2347 stmt_ty p;
2348 if (!target) {
2349 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002350 "field 'target' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002351 return NULL;
2352 }
2353 if (!iter) {
2354 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002355 "field 'iter' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002356 return NULL;
2357 }
2358 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2359 if (!p)
2360 return NULL;
2361 p->kind = AsyncFor_kind;
2362 p->v.AsyncFor.target = target;
2363 p->v.AsyncFor.iter = iter;
2364 p->v.AsyncFor.body = body;
2365 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002366 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002367 p->lineno = lineno;
2368 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002369 p->end_lineno = end_lineno;
2370 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002371 return p;
2372}
2373
2374stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002375While(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int lineno,
2376 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002378 stmt_ty p;
2379 if (!test) {
2380 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002381 "field 'test' is required for While");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002382 return NULL;
2383 }
2384 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2385 if (!p)
2386 return NULL;
2387 p->kind = While_kind;
2388 p->v.While.test = test;
2389 p->v.While.body = body;
2390 p->v.While.orelse = orelse;
2391 p->lineno = lineno;
2392 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002393 p->end_lineno = end_lineno;
2394 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002395 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396}
2397
2398stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002399If(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002400 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002402 stmt_ty p;
2403 if (!test) {
2404 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002405 "field 'test' is required for If");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002406 return NULL;
2407 }
2408 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2409 if (!p)
2410 return NULL;
2411 p->kind = If_kind;
2412 p->v.If.test = test;
2413 p->v.If.body = body;
2414 p->v.If.orelse = orelse;
2415 p->lineno = lineno;
2416 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002417 p->end_lineno = end_lineno;
2418 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002419 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420}
2421
2422stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002423With(asdl_withitem_seq * items, asdl_stmt_seq * body, string type_comment, int
2424 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002425{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002426 stmt_ty p;
2427 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2428 if (!p)
2429 return NULL;
2430 p->kind = With_kind;
2431 p->v.With.items = items;
2432 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002433 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002434 p->lineno = lineno;
2435 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002436 p->end_lineno = end_lineno;
2437 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002438 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002439}
2440
2441stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002442AsyncWith(asdl_withitem_seq * items, asdl_stmt_seq * body, string type_comment,
2443 int lineno, int col_offset, int end_lineno, int end_col_offset,
2444 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002445{
2446 stmt_ty p;
2447 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2448 if (!p)
2449 return NULL;
2450 p->kind = AsyncWith_kind;
2451 p->v.AsyncWith.items = items;
2452 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002453 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002454 p->lineno = lineno;
2455 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002456 p->end_lineno = end_lineno;
2457 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002458 return p;
2459}
2460
2461stmt_ty
Brandt Bucher145bf262021-02-26 14:51:55 -08002462Match(expr_ty subject, asdl_match_case_seq * cases, int lineno, int col_offset,
2463 int end_lineno, int end_col_offset, PyArena *arena)
2464{
2465 stmt_ty p;
2466 if (!subject) {
2467 PyErr_SetString(PyExc_ValueError,
2468 "field 'subject' is required for Match");
2469 return NULL;
2470 }
2471 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2472 if (!p)
2473 return NULL;
2474 p->kind = Match_kind;
2475 p->v.Match.subject = subject;
2476 p->v.Match.cases = cases;
2477 p->lineno = lineno;
2478 p->col_offset = col_offset;
2479 p->end_lineno = end_lineno;
2480 p->end_col_offset = end_col_offset;
2481 return p;
2482}
2483
2484stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002485Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
2486 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002488 stmt_ty p;
2489 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2490 if (!p)
2491 return NULL;
2492 p->kind = Raise_kind;
2493 p->v.Raise.exc = exc;
2494 p->v.Raise.cause = cause;
2495 p->lineno = lineno;
2496 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002497 p->end_lineno = end_lineno;
2498 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002499 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500}
2501
2502stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002503Try(asdl_stmt_seq * body, asdl_excepthandler_seq * handlers, asdl_stmt_seq *
2504 orelse, asdl_stmt_seq * finalbody, int lineno, int col_offset, int
2505 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002507 stmt_ty p;
2508 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2509 if (!p)
2510 return NULL;
2511 p->kind = Try_kind;
2512 p->v.Try.body = body;
2513 p->v.Try.handlers = handlers;
2514 p->v.Try.orelse = orelse;
2515 p->v.Try.finalbody = finalbody;
2516 p->lineno = lineno;
2517 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002518 p->end_lineno = end_lineno;
2519 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002520 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521}
2522
2523stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002524Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
2525 int 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 (!test) {
2529 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002530 "field 'test' is required for Assert");
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 = Assert_kind;
2537 p->v.Assert.test = test;
2538 p->v.Assert.msg = msg;
2539 p->lineno = lineno;
2540 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002541 p->end_lineno = end_lineno;
2542 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002543 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544}
2545
2546stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002547Import(asdl_alias_seq * names, int lineno, int col_offset, int end_lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002548 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002550 stmt_ty p;
2551 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2552 if (!p)
2553 return NULL;
2554 p->kind = Import_kind;
2555 p->v.Import.names = names;
2556 p->lineno = lineno;
2557 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002558 p->end_lineno = end_lineno;
2559 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002560 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561}
2562
2563stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002564ImportFrom(identifier module, asdl_alias_seq * names, int level, int lineno,
2565 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002567 stmt_ty p;
2568 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2569 if (!p)
2570 return NULL;
2571 p->kind = ImportFrom_kind;
2572 p->v.ImportFrom.module = module;
2573 p->v.ImportFrom.names = names;
2574 p->v.ImportFrom.level = level;
2575 p->lineno = lineno;
2576 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002577 p->end_lineno = end_lineno;
2578 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002579 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580}
2581
2582stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002583Global(asdl_identifier_seq * names, int lineno, int col_offset, int end_lineno,
2584 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002585{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002586 stmt_ty p;
2587 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2588 if (!p)
2589 return NULL;
2590 p->kind = Global_kind;
2591 p->v.Global.names = names;
2592 p->lineno = lineno;
2593 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002594 p->end_lineno = end_lineno;
2595 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002596 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597}
2598
2599stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002600Nonlocal(asdl_identifier_seq * names, int lineno, int col_offset, int
2601 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00002602{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002603 stmt_ty p;
2604 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2605 if (!p)
2606 return NULL;
2607 p->kind = Nonlocal_kind;
2608 p->v.Nonlocal.names = names;
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 Hylton81e95022007-02-27 06:50:52 +00002614}
2615
2616stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002617Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
2618 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002620 stmt_ty p;
2621 if (!value) {
2622 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002623 "field 'value' is required for Expr");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002624 return NULL;
2625 }
2626 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2627 if (!p)
2628 return NULL;
2629 p->kind = Expr_kind;
2630 p->v.Expr.value = value;
2631 p->lineno = lineno;
2632 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002633 p->end_lineno = end_lineno;
2634 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002635 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636}
2637
2638stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002639Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2640 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002642 stmt_ty p;
2643 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2644 if (!p)
2645 return NULL;
2646 p->kind = Pass_kind;
2647 p->lineno = lineno;
2648 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002649 p->end_lineno = end_lineno;
2650 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002651 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652}
2653
2654stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002655Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2656 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002658 stmt_ty p;
2659 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2660 if (!p)
2661 return NULL;
2662 p->kind = Break_kind;
2663 p->lineno = lineno;
2664 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002665 p->end_lineno = end_lineno;
2666 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002667 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668}
2669
2670stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002671Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
2672 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002674 stmt_ty p;
2675 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2676 if (!p)
2677 return NULL;
2678 p->kind = Continue_kind;
2679 p->lineno = lineno;
2680 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002681 p->end_lineno = end_lineno;
2682 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002683 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684}
2685
2686expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002687BoolOp(boolop_ty op, asdl_expr_seq * values, int lineno, int col_offset, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002688 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002690 expr_ty p;
2691 if (!op) {
2692 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002693 "field 'op' is required for BoolOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002694 return NULL;
2695 }
2696 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2697 if (!p)
2698 return NULL;
2699 p->kind = BoolOp_kind;
2700 p->v.BoolOp.op = op;
2701 p->v.BoolOp.values = values;
2702 p->lineno = lineno;
2703 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002704 p->end_lineno = end_lineno;
2705 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002706 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707}
2708
2709expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002710NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
2711 end_lineno, int end_col_offset, PyArena *arena)
2712{
2713 expr_ty p;
2714 if (!target) {
2715 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002716 "field 'target' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002717 return NULL;
2718 }
2719 if (!value) {
2720 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002721 "field 'value' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002722 return NULL;
2723 }
2724 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2725 if (!p)
2726 return NULL;
2727 p->kind = NamedExpr_kind;
2728 p->v.NamedExpr.target = target;
2729 p->v.NamedExpr.value = value;
2730 p->lineno = lineno;
2731 p->col_offset = col_offset;
2732 p->end_lineno = end_lineno;
2733 p->end_col_offset = end_col_offset;
2734 return p;
2735}
2736
2737expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002738BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002739 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002741 expr_ty p;
2742 if (!left) {
2743 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002744 "field 'left' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002745 return NULL;
2746 }
2747 if (!op) {
2748 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002749 "field 'op' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002750 return NULL;
2751 }
2752 if (!right) {
2753 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002754 "field 'right' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002755 return NULL;
2756 }
2757 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2758 if (!p)
2759 return NULL;
2760 p->kind = BinOp_kind;
2761 p->v.BinOp.left = left;
2762 p->v.BinOp.op = op;
2763 p->v.BinOp.right = right;
2764 p->lineno = lineno;
2765 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002766 p->end_lineno = end_lineno;
2767 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002768 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769}
2770
2771expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002772UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
2773 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002775 expr_ty p;
2776 if (!op) {
2777 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002778 "field 'op' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002779 return NULL;
2780 }
2781 if (!operand) {
2782 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002783 "field 'operand' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002784 return NULL;
2785 }
2786 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2787 if (!p)
2788 return NULL;
2789 p->kind = UnaryOp_kind;
2790 p->v.UnaryOp.op = op;
2791 p->v.UnaryOp.operand = operand;
2792 p->lineno = lineno;
2793 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002794 p->end_lineno = end_lineno;
2795 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002796 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797}
2798
2799expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002800Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
2801 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002803 expr_ty p;
2804 if (!args) {
2805 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002806 "field 'args' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002807 return NULL;
2808 }
2809 if (!body) {
2810 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002811 "field 'body' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002812 return NULL;
2813 }
2814 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2815 if (!p)
2816 return NULL;
2817 p->kind = Lambda_kind;
2818 p->v.Lambda.args = args;
2819 p->v.Lambda.body = body;
2820 p->lineno = lineno;
2821 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002822 p->end_lineno = end_lineno;
2823 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002824 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825}
2826
2827expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002828IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002829 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002830{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002831 expr_ty p;
2832 if (!test) {
2833 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002834 "field 'test' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002835 return NULL;
2836 }
2837 if (!body) {
2838 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002839 "field 'body' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002840 return NULL;
2841 }
2842 if (!orelse) {
2843 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002844 "field 'orelse' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002845 return NULL;
2846 }
2847 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2848 if (!p)
2849 return NULL;
2850 p->kind = IfExp_kind;
2851 p->v.IfExp.test = test;
2852 p->v.IfExp.body = body;
2853 p->v.IfExp.orelse = orelse;
2854 p->lineno = lineno;
2855 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002856 p->end_lineno = end_lineno;
2857 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002858 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002859}
2860
2861expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002862Dict(asdl_expr_seq * keys, asdl_expr_seq * values, int lineno, int col_offset,
2863 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002865 expr_ty p;
2866 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2867 if (!p)
2868 return NULL;
2869 p->kind = Dict_kind;
2870 p->v.Dict.keys = keys;
2871 p->v.Dict.values = values;
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;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877}
2878
2879expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002880Set(asdl_expr_seq * elts, int lineno, int col_offset, int end_lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002881 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002882{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002883 expr_ty p;
2884 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2885 if (!p)
2886 return NULL;
2887 p->kind = Set_kind;
2888 p->v.Set.elts = elts;
2889 p->lineno = lineno;
2890 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002891 p->end_lineno = end_lineno;
2892 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002893 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002894}
2895
2896expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002897ListComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2898 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002900 expr_ty p;
2901 if (!elt) {
2902 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002903 "field 'elt' is required for ListComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002904 return NULL;
2905 }
2906 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2907 if (!p)
2908 return NULL;
2909 p->kind = ListComp_kind;
2910 p->v.ListComp.elt = elt;
2911 p->v.ListComp.generators = generators;
2912 p->lineno = lineno;
2913 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002914 p->end_lineno = end_lineno;
2915 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002916 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917}
2918
2919expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002920SetComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2921 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002922{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002923 expr_ty p;
2924 if (!elt) {
2925 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002926 "field 'elt' is required for SetComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002927 return NULL;
2928 }
2929 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2930 if (!p)
2931 return NULL;
2932 p->kind = SetComp_kind;
2933 p->v.SetComp.elt = elt;
2934 p->v.SetComp.generators = generators;
2935 p->lineno = lineno;
2936 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002937 p->end_lineno = end_lineno;
2938 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002939 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002940}
2941
2942expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002943DictComp(expr_ty key, expr_ty value, asdl_comprehension_seq * generators, int
2944 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2945 *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002946{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002947 expr_ty p;
2948 if (!key) {
2949 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002950 "field 'key' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002951 return NULL;
2952 }
2953 if (!value) {
2954 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002955 "field 'value' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002956 return NULL;
2957 }
2958 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2959 if (!p)
2960 return NULL;
2961 p->kind = DictComp_kind;
2962 p->v.DictComp.key = key;
2963 p->v.DictComp.value = value;
2964 p->v.DictComp.generators = generators;
2965 p->lineno = lineno;
2966 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002967 p->end_lineno = end_lineno;
2968 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002969 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002970}
2971
2972expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002973GeneratorExp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2974 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002976 expr_ty p;
2977 if (!elt) {
2978 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002979 "field 'elt' is required for GeneratorExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002980 return NULL;
2981 }
2982 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2983 if (!p)
2984 return NULL;
2985 p->kind = GeneratorExp_kind;
2986 p->v.GeneratorExp.elt = elt;
2987 p->v.GeneratorExp.generators = generators;
2988 p->lineno = lineno;
2989 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002990 p->end_lineno = end_lineno;
2991 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002992 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993}
2994
2995expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002996Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2997 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002998{
2999 expr_ty p;
3000 if (!value) {
3001 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003002 "field 'value' is required for Await");
Yury Selivanov75445082015-05-11 22:57:16 -04003003 return NULL;
3004 }
3005 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3006 if (!p)
3007 return NULL;
3008 p->kind = Await_kind;
3009 p->v.Await.value = value;
3010 p->lineno = lineno;
3011 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003012 p->end_lineno = end_lineno;
3013 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04003014 return p;
3015}
3016
3017expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003018Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
3019 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003021 expr_ty p;
3022 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3023 if (!p)
3024 return NULL;
3025 p->kind = Yield_kind;
3026 p->v.Yield.value = value;
3027 p->lineno = lineno;
3028 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003029 p->end_lineno = end_lineno;
3030 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003031 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032}
3033
3034expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003035YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
3036 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05003037{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003038 expr_ty p;
3039 if (!value) {
3040 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003041 "field 'value' is required for YieldFrom");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003042 return NULL;
3043 }
3044 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3045 if (!p)
3046 return NULL;
3047 p->kind = YieldFrom_kind;
3048 p->v.YieldFrom.value = value;
3049 p->lineno = lineno;
3050 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003051 p->end_lineno = end_lineno;
3052 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003053 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05003054}
3055
3056expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003057Compare(expr_ty left, asdl_int_seq * ops, asdl_expr_seq * comparators, int
3058 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
3059 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003061 expr_ty p;
3062 if (!left) {
3063 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003064 "field 'left' is required for Compare");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003065 return NULL;
3066 }
3067 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3068 if (!p)
3069 return NULL;
3070 p->kind = Compare_kind;
3071 p->v.Compare.left = left;
3072 p->v.Compare.ops = ops;
3073 p->v.Compare.comparators = comparators;
3074 p->lineno = lineno;
3075 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003076 p->end_lineno = end_lineno;
3077 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003078 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079}
3080
3081expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003082Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq * keywords, int
3083 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003085 expr_ty p;
3086 if (!func) {
3087 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003088 "field 'func' is required for Call");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003089 return NULL;
3090 }
3091 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3092 if (!p)
3093 return NULL;
3094 p->kind = Call_kind;
3095 p->v.Call.func = func;
3096 p->v.Call.args = args;
3097 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003098 p->lineno = lineno;
3099 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003100 p->end_lineno = end_lineno;
3101 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003102 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003103}
3104
3105expr_ty
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04003106FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
3107 int col_offset, int end_lineno, int end_col_offset, PyArena
3108 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003109{
3110 expr_ty p;
3111 if (!value) {
3112 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003113 "field 'value' is required for FormattedValue");
Eric V. Smith235a6f02015-09-19 14:51:32 -04003114 return NULL;
3115 }
3116 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3117 if (!p)
3118 return NULL;
3119 p->kind = FormattedValue_kind;
3120 p->v.FormattedValue.value = value;
3121 p->v.FormattedValue.conversion = conversion;
3122 p->v.FormattedValue.format_spec = format_spec;
3123 p->lineno = lineno;
3124 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003125 p->end_lineno = end_lineno;
3126 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003127 return p;
3128}
3129
3130expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003131JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, int end_lineno,
3132 int end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003133{
3134 expr_ty p;
3135 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3136 if (!p)
3137 return NULL;
3138 p->kind = JoinedStr_kind;
3139 p->v.JoinedStr.values = values;
3140 p->lineno = lineno;
3141 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003142 p->end_lineno = end_lineno;
3143 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003144 return p;
3145}
3146
3147expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003148Constant(constant value, string kind, int lineno, int col_offset, int
3149 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003150{
3151 expr_ty p;
3152 if (!value) {
3153 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003154 "field 'value' is required for Constant");
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003155 return NULL;
3156 }
3157 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3158 if (!p)
3159 return NULL;
3160 p->kind = Constant_kind;
3161 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003162 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003163 p->lineno = lineno;
3164 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003165 p->end_lineno = end_lineno;
3166 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003167 return p;
3168}
3169
3170expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003171Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003172 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003174 expr_ty p;
3175 if (!value) {
3176 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003177 "field 'value' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003178 return NULL;
3179 }
3180 if (!attr) {
3181 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003182 "field 'attr' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003183 return NULL;
3184 }
3185 if (!ctx) {
3186 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003187 "field 'ctx' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003188 return NULL;
3189 }
3190 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3191 if (!p)
3192 return NULL;
3193 p->kind = Attribute_kind;
3194 p->v.Attribute.value = value;
3195 p->v.Attribute.attr = attr;
3196 p->v.Attribute.ctx = ctx;
3197 p->lineno = lineno;
3198 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003199 p->end_lineno = end_lineno;
3200 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003201 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003202}
3203
3204expr_ty
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003205Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003206 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003208 expr_ty p;
3209 if (!value) {
3210 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003211 "field 'value' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003212 return NULL;
3213 }
3214 if (!slice) {
3215 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003216 "field 'slice' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003217 return NULL;
3218 }
3219 if (!ctx) {
3220 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003221 "field 'ctx' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003222 return NULL;
3223 }
3224 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3225 if (!p)
3226 return NULL;
3227 p->kind = Subscript_kind;
3228 p->v.Subscript.value = value;
3229 p->v.Subscript.slice = slice;
3230 p->v.Subscript.ctx = ctx;
3231 p->lineno = lineno;
3232 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003233 p->end_lineno = end_lineno;
3234 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003235 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236}
3237
3238expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003239Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
3240 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00003241{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003242 expr_ty p;
3243 if (!value) {
3244 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003245 "field 'value' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003246 return NULL;
3247 }
3248 if (!ctx) {
3249 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003250 "field 'ctx' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003251 return NULL;
3252 }
3253 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3254 if (!p)
3255 return NULL;
3256 p->kind = Starred_kind;
3257 p->v.Starred.value = value;
3258 p->v.Starred.ctx = ctx;
3259 p->lineno = lineno;
3260 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003261 p->end_lineno = end_lineno;
3262 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003263 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00003264}
3265
3266expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003267Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
3268 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003270 expr_ty p;
3271 if (!id) {
3272 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003273 "field 'id' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003274 return NULL;
3275 }
3276 if (!ctx) {
3277 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003278 "field 'ctx' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003279 return NULL;
3280 }
3281 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3282 if (!p)
3283 return NULL;
3284 p->kind = Name_kind;
3285 p->v.Name.id = id;
3286 p->v.Name.ctx = ctx;
3287 p->lineno = lineno;
3288 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003289 p->end_lineno = end_lineno;
3290 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003291 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292}
3293
3294expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003295List(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003296 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003298 expr_ty p;
3299 if (!ctx) {
3300 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003301 "field 'ctx' is required for List");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003302 return NULL;
3303 }
3304 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3305 if (!p)
3306 return NULL;
3307 p->kind = List_kind;
3308 p->v.List.elts = elts;
3309 p->v.List.ctx = ctx;
3310 p->lineno = lineno;
3311 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003312 p->end_lineno = end_lineno;
3313 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003314 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315}
3316
3317expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003318Tuple(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset,
3319 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003321 expr_ty p;
3322 if (!ctx) {
3323 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003324 "field 'ctx' is required for Tuple");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003325 return NULL;
3326 }
3327 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3328 if (!p)
3329 return NULL;
3330 p->kind = Tuple_kind;
3331 p->v.Tuple.elts = elts;
3332 p->v.Tuple.ctx = ctx;
3333 p->lineno = lineno;
3334 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003335 p->end_lineno = end_lineno;
3336 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003337 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338}
3339
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003340expr_ty
3341Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset,
3342 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003344 expr_ty p;
3345 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003346 if (!p)
3347 return NULL;
3348 p->kind = Slice_kind;
3349 p->v.Slice.lower = lower;
3350 p->v.Slice.upper = upper;
3351 p->v.Slice.step = step;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003352 p->lineno = lineno;
3353 p->col_offset = col_offset;
3354 p->end_lineno = end_lineno;
3355 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003356 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357}
3358
Brandt Bucher145bf262021-02-26 14:51:55 -08003359expr_ty
3360MatchAs(expr_ty pattern, identifier name, int lineno, int col_offset, int
3361 end_lineno, int end_col_offset, PyArena *arena)
3362{
3363 expr_ty p;
3364 if (!pattern) {
3365 PyErr_SetString(PyExc_ValueError,
3366 "field 'pattern' is required for MatchAs");
3367 return NULL;
3368 }
3369 if (!name) {
3370 PyErr_SetString(PyExc_ValueError,
3371 "field 'name' is required for MatchAs");
3372 return NULL;
3373 }
3374 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3375 if (!p)
3376 return NULL;
3377 p->kind = MatchAs_kind;
3378 p->v.MatchAs.pattern = pattern;
3379 p->v.MatchAs.name = name;
3380 p->lineno = lineno;
3381 p->col_offset = col_offset;
3382 p->end_lineno = end_lineno;
3383 p->end_col_offset = end_col_offset;
3384 return p;
3385}
3386
3387expr_ty
3388MatchOr(asdl_expr_seq * patterns, int lineno, int col_offset, int end_lineno,
3389 int end_col_offset, PyArena *arena)
3390{
3391 expr_ty p;
3392 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3393 if (!p)
3394 return NULL;
3395 p->kind = MatchOr_kind;
3396 p->v.MatchOr.patterns = patterns;
3397 p->lineno = lineno;
3398 p->col_offset = col_offset;
3399 p->end_lineno = end_lineno;
3400 p->end_col_offset = end_col_offset;
3401 return p;
3402}
3403
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404comprehension_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003405comprehension(expr_ty target, expr_ty iter, asdl_expr_seq * ifs, int is_async,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003406 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003408 comprehension_ty p;
3409 if (!target) {
3410 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003411 "field 'target' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003412 return NULL;
3413 }
3414 if (!iter) {
3415 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003416 "field 'iter' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003417 return NULL;
3418 }
3419 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
3420 if (!p)
3421 return NULL;
3422 p->target = target;
3423 p->iter = iter;
3424 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003425 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003426 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427}
3428
3429excepthandler_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003430ExceptHandler(expr_ty type, identifier name, asdl_stmt_seq * body, int lineno,
3431 int col_offset, int end_lineno, int end_col_offset, PyArena
3432 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003433{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003434 excepthandler_ty p;
3435 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
3436 if (!p)
3437 return NULL;
3438 p->kind = ExceptHandler_kind;
3439 p->v.ExceptHandler.type = type;
3440 p->v.ExceptHandler.name = name;
3441 p->v.ExceptHandler.body = body;
3442 p->lineno = lineno;
3443 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003444 p->end_lineno = end_lineno;
3445 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003446 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447}
3448
3449arguments_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003450arguments(asdl_arg_seq * posonlyargs, asdl_arg_seq * args, arg_ty vararg,
3451 asdl_arg_seq * kwonlyargs, asdl_expr_seq * kw_defaults, arg_ty kwarg,
3452 asdl_expr_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003453{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003454 arguments_ty p;
3455 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
3456 if (!p)
3457 return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003458 p->posonlyargs = posonlyargs;
Pablo Galindocd6e83b2019-07-15 01:32:18 +02003459 p->args = args;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003460 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003461 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003462 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003463 p->kwarg = kwarg;
3464 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003465 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003466}
3467
Neal Norwitzc1505362006-12-28 06:47:50 +00003468arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003469arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
3470 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00003471{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003472 arg_ty p;
3473 if (!arg) {
3474 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003475 "field 'arg' is required for arg");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003476 return NULL;
3477 }
3478 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
3479 if (!p)
3480 return NULL;
3481 p->arg = arg;
3482 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003483 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01003484 p->lineno = lineno;
3485 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003486 p->end_lineno = end_lineno;
3487 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003488 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00003489}
3490
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003491keyword_ty
Pablo Galindo168660b2020-04-02 00:47:39 +01003492keyword(identifier arg, expr_ty value, int lineno, int col_offset, int
3493 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003494{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003495 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003496 if (!value) {
3497 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003498 "field 'value' is required for keyword");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003499 return NULL;
3500 }
3501 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
3502 if (!p)
3503 return NULL;
3504 p->arg = arg;
3505 p->value = value;
Pablo Galindo168660b2020-04-02 00:47:39 +01003506 p->lineno = lineno;
3507 p->col_offset = col_offset;
3508 p->end_lineno = end_lineno;
3509 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003510 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511}
3512
3513alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003514alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003515{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003516 alias_ty p;
3517 if (!name) {
3518 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003519 "field 'name' is required for alias");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003520 return NULL;
3521 }
3522 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
3523 if (!p)
3524 return NULL;
3525 p->name = name;
3526 p->asname = asname;
3527 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003528}
3529
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003530withitem_ty
3531withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
3532{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003533 withitem_ty p;
3534 if (!context_expr) {
3535 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003536 "field 'context_expr' is required for withitem");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003537 return NULL;
3538 }
3539 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
3540 if (!p)
3541 return NULL;
3542 p->context_expr = context_expr;
3543 p->optional_vars = optional_vars;
3544 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003545}
3546
Brandt Bucher145bf262021-02-26 14:51:55 -08003547match_case_ty
3548match_case(expr_ty pattern, expr_ty guard, asdl_stmt_seq * body, PyArena *arena)
3549{
3550 match_case_ty p;
3551 if (!pattern) {
3552 PyErr_SetString(PyExc_ValueError,
3553 "field 'pattern' is required for match_case");
3554 return NULL;
3555 }
3556 p = (match_case_ty)PyArena_Malloc(arena, sizeof(*p));
3557 if (!p)
3558 return NULL;
3559 p->pattern = pattern;
3560 p->guard = guard;
3561 p->body = body;
3562 return p;
3563}
3564
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003565type_ignore_ty
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003566TypeIgnore(int lineno, string tag, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003567{
3568 type_ignore_ty p;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003569 if (!tag) {
3570 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003571 "field 'tag' is required for TypeIgnore");
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003572 return NULL;
3573 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003574 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
3575 if (!p)
3576 return NULL;
3577 p->kind = TypeIgnore_kind;
3578 p->v.TypeIgnore.lineno = lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003579 p->v.TypeIgnore.tag = tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003580 return p;
3581}
3582
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003583
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003584PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01003585ast2obj_mod(struct ast_state *state, void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003586{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003587 mod_ty o = (mod_ty)_o;
3588 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003589 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003590 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003591 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003592 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003593 switch (o->kind) {
3594 case Module_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003595 tp = (PyTypeObject *)state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003596 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003597 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003598 value = ast2obj_list(state, (asdl_seq*)o->v.Module.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003599 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003600 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003601 goto failed;
3602 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003603 value = ast2obj_list(state, (asdl_seq*)o->v.Module.type_ignores,
Victor Stinner74419f02020-07-03 11:35:37 +02003604 ast2obj_type_ignore);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003605 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003606 if (PyObject_SetAttr(result, state->type_ignores, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003607 goto failed;
3608 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003609 break;
3610 case Interactive_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003611 tp = (PyTypeObject *)state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003612 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003613 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003614 value = ast2obj_list(state, (asdl_seq*)o->v.Interactive.body,
3615 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003616 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003617 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003618 goto failed;
3619 Py_DECREF(value);
3620 break;
3621 case Expression_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003622 tp = (PyTypeObject *)state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003623 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003624 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003625 value = ast2obj_expr(state, o->v.Expression.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003626 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003627 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003628 goto failed;
3629 Py_DECREF(value);
3630 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003631 case FunctionType_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003632 tp = (PyTypeObject *)state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003633 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003634 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003635 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionType.argtypes,
3636 ast2obj_expr);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003637 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003638 if (PyObject_SetAttr(result, state->argtypes, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003639 goto failed;
3640 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003641 value = ast2obj_expr(state, o->v.FunctionType.returns);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003642 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003643 if (PyObject_SetAttr(result, state->returns, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003644 goto failed;
3645 Py_DECREF(value);
3646 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003647 }
3648 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003649failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003650 Py_XDECREF(value);
3651 Py_XDECREF(result);
3652 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003653}
3654
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003655PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01003656ast2obj_stmt(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003657{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003658 stmt_ty o = (stmt_ty)_o;
3659 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003660 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003661 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003662 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003663 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003664 switch (o->kind) {
3665 case FunctionDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003666 tp = (PyTypeObject *)state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003667 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003668 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003669 value = ast2obj_identifier(state, o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003670 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003671 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003672 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003673 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003674 value = ast2obj_arguments(state, o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003675 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003676 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003677 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003678 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003679 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.body,
3680 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003681 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003682 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003683 goto failed;
3684 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003685 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.decorator_list,
Victor Stinner74419f02020-07-03 11:35:37 +02003686 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003687 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003688 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003689 goto failed;
3690 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003691 value = ast2obj_expr(state, o->v.FunctionDef.returns);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003692 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003693 if (PyObject_SetAttr(result, state->returns, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003694 goto failed;
3695 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003696 value = ast2obj_string(state, o->v.FunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003697 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003698 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003699 goto failed;
3700 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003701 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003702 case AsyncFunctionDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003703 tp = (PyTypeObject *)state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003704 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003705 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003706 value = ast2obj_identifier(state, o->v.AsyncFunctionDef.name);
Yury Selivanov75445082015-05-11 22:57:16 -04003707 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003708 if (PyObject_SetAttr(result, state->name, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003709 goto failed;
3710 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003711 value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args);
Yury Selivanov75445082015-05-11 22:57:16 -04003712 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003713 if (PyObject_SetAttr(result, state->args, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003714 goto failed;
3715 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003716 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFunctionDef.body,
3717 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003718 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003719 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003720 goto failed;
3721 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003722 value = ast2obj_list(state,
3723 (asdl_seq*)o->v.AsyncFunctionDef.decorator_list,
Yury Selivanov75445082015-05-11 22:57:16 -04003724 ast2obj_expr);
3725 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003726 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003727 goto failed;
3728 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003729 value = ast2obj_expr(state, o->v.AsyncFunctionDef.returns);
Yury Selivanov75445082015-05-11 22:57:16 -04003730 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003731 if (PyObject_SetAttr(result, state->returns, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003732 goto failed;
3733 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003734 value = ast2obj_string(state, o->v.AsyncFunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003735 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003736 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003737 goto failed;
3738 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003739 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003740 case ClassDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003741 tp = (PyTypeObject *)state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003742 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003743 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003744 value = ast2obj_identifier(state, o->v.ClassDef.name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003745 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003746 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003747 goto failed;
3748 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003749 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.bases,
3750 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003751 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003752 if (PyObject_SetAttr(result, state->bases, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003753 goto failed;
3754 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003755 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.keywords,
3756 ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003757 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003758 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003759 goto failed;
3760 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003761 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.body,
3762 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003763 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003764 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003765 goto failed;
3766 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003767 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.decorator_list,
3768 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003769 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003770 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003771 goto failed;
3772 Py_DECREF(value);
3773 break;
3774 case Return_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003775 tp = (PyTypeObject *)state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003776 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003777 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003778 value = ast2obj_expr(state, o->v.Return.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003779 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003780 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003781 goto failed;
3782 Py_DECREF(value);
3783 break;
3784 case Delete_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003785 tp = (PyTypeObject *)state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003786 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003787 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003788 value = ast2obj_list(state, (asdl_seq*)o->v.Delete.targets,
3789 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003790 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003791 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003792 goto failed;
3793 Py_DECREF(value);
3794 break;
3795 case Assign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003796 tp = (PyTypeObject *)state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003797 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003798 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003799 value = ast2obj_list(state, (asdl_seq*)o->v.Assign.targets,
3800 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003801 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003802 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003803 goto failed;
3804 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003805 value = ast2obj_expr(state, o->v.Assign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003806 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003807 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003808 goto failed;
3809 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003810 value = ast2obj_string(state, o->v.Assign.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003811 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003812 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003813 goto failed;
3814 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003815 break;
3816 case AugAssign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003817 tp = (PyTypeObject *)state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003818 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003819 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003820 value = ast2obj_expr(state, o->v.AugAssign.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003821 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003822 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003823 goto failed;
3824 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003825 value = ast2obj_operator(state, o->v.AugAssign.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003826 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003827 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003828 goto failed;
3829 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003830 value = ast2obj_expr(state, o->v.AugAssign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003831 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003832 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003833 goto failed;
3834 Py_DECREF(value);
3835 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003836 case AnnAssign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003837 tp = (PyTypeObject *)state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003838 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003839 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003840 value = ast2obj_expr(state, o->v.AnnAssign.target);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003841 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003842 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003843 goto failed;
3844 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003845 value = ast2obj_expr(state, o->v.AnnAssign.annotation);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003846 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003847 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003848 goto failed;
3849 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003850 value = ast2obj_expr(state, o->v.AnnAssign.value);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003851 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003852 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003853 goto failed;
3854 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003855 value = ast2obj_int(state, o->v.AnnAssign.simple);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003856 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003857 if (PyObject_SetAttr(result, state->simple, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003858 goto failed;
3859 Py_DECREF(value);
3860 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003861 case For_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003862 tp = (PyTypeObject *)state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003863 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003864 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003865 value = ast2obj_expr(state, o->v.For.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003866 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003867 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003868 goto failed;
3869 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003870 value = ast2obj_expr(state, o->v.For.iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003871 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003872 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003873 goto failed;
3874 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003875 value = ast2obj_list(state, (asdl_seq*)o->v.For.body, ast2obj_stmt);
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->body, 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.For.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);
Victor Stinner74419f02020-07-03 11:35:37 +02003885 value = ast2obj_string(state, o->v.For.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003886 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003887 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003888 goto failed;
3889 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003890 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003891 case AsyncFor_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003892 tp = (PyTypeObject *)state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003893 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003894 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003895 value = ast2obj_expr(state, o->v.AsyncFor.target);
Yury Selivanov75445082015-05-11 22:57:16 -04003896 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003897 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003898 goto failed;
3899 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003900 value = ast2obj_expr(state, o->v.AsyncFor.iter);
Yury Selivanov75445082015-05-11 22:57:16 -04003901 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003902 if (PyObject_SetAttr(result, state->iter, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003903 goto failed;
3904 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003905 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.body,
3906 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003907 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003908 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003909 goto failed;
3910 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003911 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.orelse,
3912 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003913 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003914 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003915 goto failed;
3916 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003917 value = ast2obj_string(state, o->v.AsyncFor.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003918 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003919 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003920 goto failed;
3921 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003922 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003923 case While_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003924 tp = (PyTypeObject *)state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003925 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003926 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003927 value = ast2obj_expr(state, o->v.While.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003928 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003929 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003930 goto failed;
3931 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003932 value = ast2obj_list(state, (asdl_seq*)o->v.While.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003933 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003934 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003935 goto failed;
3936 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003937 value = ast2obj_list(state, (asdl_seq*)o->v.While.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003938 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003939 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003940 goto failed;
3941 Py_DECREF(value);
3942 break;
3943 case If_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003944 tp = (PyTypeObject *)state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003945 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003946 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003947 value = ast2obj_expr(state, o->v.If.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003949 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003950 goto failed;
3951 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003952 value = ast2obj_list(state, (asdl_seq*)o->v.If.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003953 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003954 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003955 goto failed;
3956 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003957 value = ast2obj_list(state, (asdl_seq*)o->v.If.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003958 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003959 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003960 goto failed;
3961 Py_DECREF(value);
3962 break;
3963 case With_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003964 tp = (PyTypeObject *)state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003965 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003966 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003967 value = ast2obj_list(state, (asdl_seq*)o->v.With.items,
3968 ast2obj_withitem);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003969 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003970 if (PyObject_SetAttr(result, state->items, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003971 goto failed;
3972 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003973 value = ast2obj_list(state, (asdl_seq*)o->v.With.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003974 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003975 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003976 goto failed;
3977 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003978 value = ast2obj_string(state, o->v.With.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003979 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003980 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003981 goto failed;
3982 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003983 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003984 case AsyncWith_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003985 tp = (PyTypeObject *)state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003986 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003987 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003988 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.items,
3989 ast2obj_withitem);
Yury Selivanov75445082015-05-11 22:57:16 -04003990 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003991 if (PyObject_SetAttr(result, state->items, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003992 goto failed;
3993 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003994 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.body,
3995 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003996 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003997 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003998 goto failed;
3999 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004000 value = ast2obj_string(state, o->v.AsyncWith.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004001 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004002 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004003 goto failed;
4004 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04004005 break;
Brandt Bucher145bf262021-02-26 14:51:55 -08004006 case Match_kind:
4007 tp = (PyTypeObject *)state->Match_type;
4008 result = PyType_GenericNew(tp, NULL, NULL);
4009 if (!result) goto failed;
4010 value = ast2obj_expr(state, o->v.Match.subject);
4011 if (!value) goto failed;
4012 if (PyObject_SetAttr(result, state->subject, value) == -1)
4013 goto failed;
4014 Py_DECREF(value);
4015 value = ast2obj_list(state, (asdl_seq*)o->v.Match.cases,
4016 ast2obj_match_case);
4017 if (!value) goto failed;
4018 if (PyObject_SetAttr(result, state->cases, value) == -1)
4019 goto failed;
4020 Py_DECREF(value);
4021 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004022 case Raise_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004023 tp = (PyTypeObject *)state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004024 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004025 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004026 value = ast2obj_expr(state, o->v.Raise.exc);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004027 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004028 if (PyObject_SetAttr(result, state->exc, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004029 goto failed;
4030 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004031 value = ast2obj_expr(state, o->v.Raise.cause);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004032 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004033 if (PyObject_SetAttr(result, state->cause, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004034 goto failed;
4035 Py_DECREF(value);
4036 break;
4037 case Try_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004038 tp = (PyTypeObject *)state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004039 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004040 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004041 value = ast2obj_list(state, (asdl_seq*)o->v.Try.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004042 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004043 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004044 goto failed;
4045 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004046 value = ast2obj_list(state, (asdl_seq*)o->v.Try.handlers,
4047 ast2obj_excepthandler);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004048 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004049 if (PyObject_SetAttr(result, state->handlers, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004050 goto failed;
4051 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004052 value = ast2obj_list(state, (asdl_seq*)o->v.Try.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004053 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004054 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004055 goto failed;
4056 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004057 value = ast2obj_list(state, (asdl_seq*)o->v.Try.finalbody,
4058 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004059 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004060 if (PyObject_SetAttr(result, state->finalbody, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004061 goto failed;
4062 Py_DECREF(value);
4063 break;
4064 case Assert_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004065 tp = (PyTypeObject *)state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004066 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004067 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004068 value = ast2obj_expr(state, o->v.Assert.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004069 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004070 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004071 goto failed;
4072 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004073 value = ast2obj_expr(state, o->v.Assert.msg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004074 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004075 if (PyObject_SetAttr(result, state->msg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004076 goto failed;
4077 Py_DECREF(value);
4078 break;
4079 case Import_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004080 tp = (PyTypeObject *)state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004081 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004083 value = ast2obj_list(state, (asdl_seq*)o->v.Import.names,
4084 ast2obj_alias);
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->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004087 goto failed;
4088 Py_DECREF(value);
4089 break;
4090 case ImportFrom_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004091 tp = (PyTypeObject *)state->ImportFrom_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_identifier(state, o->v.ImportFrom.module);
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->module, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004097 goto failed;
4098 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004099 value = ast2obj_list(state, (asdl_seq*)o->v.ImportFrom.names,
4100 ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004101 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004102 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004103 goto failed;
4104 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004105 value = ast2obj_int(state, o->v.ImportFrom.level);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004106 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004107 if (PyObject_SetAttr(result, state->level, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004108 goto failed;
4109 Py_DECREF(value);
4110 break;
4111 case Global_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004112 tp = (PyTypeObject *)state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004113 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004114 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004115 value = ast2obj_list(state, (asdl_seq*)o->v.Global.names,
4116 ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004117 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004118 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004119 goto failed;
4120 Py_DECREF(value);
4121 break;
4122 case Nonlocal_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004123 tp = (PyTypeObject *)state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004124 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004125 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004126 value = ast2obj_list(state, (asdl_seq*)o->v.Nonlocal.names,
4127 ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004128 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004129 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004130 goto failed;
4131 Py_DECREF(value);
4132 break;
4133 case Expr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004134 tp = (PyTypeObject *)state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004135 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004136 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004137 value = ast2obj_expr(state, o->v.Expr.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004138 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004139 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004140 goto failed;
4141 Py_DECREF(value);
4142 break;
4143 case Pass_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004144 tp = (PyTypeObject *)state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004145 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004146 if (!result) goto failed;
4147 break;
4148 case Break_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004149 tp = (PyTypeObject *)state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004150 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004151 if (!result) goto failed;
4152 break;
4153 case Continue_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004154 tp = (PyTypeObject *)state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004155 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004156 if (!result) goto failed;
4157 break;
4158 }
Victor Stinner74419f02020-07-03 11:35:37 +02004159 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004160 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004161 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004162 goto failed;
4163 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004164 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004165 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004166 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004167 goto failed;
4168 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004169 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004170 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004171 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004172 goto failed;
4173 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004174 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004175 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004176 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004177 goto failed;
4178 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004179 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004180failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004181 Py_XDECREF(value);
4182 Py_XDECREF(result);
4183 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004184}
4185
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004186PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004187ast2obj_expr(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004188{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004189 expr_ty o = (expr_ty)_o;
4190 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004191 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004192 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004193 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004194 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004195 switch (o->kind) {
4196 case BoolOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004197 tp = (PyTypeObject *)state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004198 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004199 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004200 value = ast2obj_boolop(state, o->v.BoolOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004201 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004202 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004203 goto failed;
4204 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004205 value = ast2obj_list(state, (asdl_seq*)o->v.BoolOp.values,
4206 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004207 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004208 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004209 goto failed;
4210 Py_DECREF(value);
4211 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004212 case NamedExpr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004213 tp = (PyTypeObject *)state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004214 result = PyType_GenericNew(tp, NULL, NULL);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004215 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004216 value = ast2obj_expr(state, o->v.NamedExpr.target);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004217 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004218 if (PyObject_SetAttr(result, state->target, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004219 goto failed;
4220 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004221 value = ast2obj_expr(state, o->v.NamedExpr.value);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004222 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004223 if (PyObject_SetAttr(result, state->value, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004224 goto failed;
4225 Py_DECREF(value);
4226 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004227 case BinOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004228 tp = (PyTypeObject *)state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004229 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004230 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004231 value = ast2obj_expr(state, o->v.BinOp.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004232 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004233 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004234 goto failed;
4235 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004236 value = ast2obj_operator(state, o->v.BinOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004237 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004238 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004239 goto failed;
4240 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004241 value = ast2obj_expr(state, o->v.BinOp.right);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004242 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004243 if (PyObject_SetAttr(result, state->right, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004244 goto failed;
4245 Py_DECREF(value);
4246 break;
4247 case UnaryOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004248 tp = (PyTypeObject *)state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004249 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004250 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004251 value = ast2obj_unaryop(state, o->v.UnaryOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004252 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004253 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004254 goto failed;
4255 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004256 value = ast2obj_expr(state, o->v.UnaryOp.operand);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004257 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004258 if (PyObject_SetAttr(result, state->operand, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004259 goto failed;
4260 Py_DECREF(value);
4261 break;
4262 case Lambda_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004263 tp = (PyTypeObject *)state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004264 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004265 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004266 value = ast2obj_arguments(state, o->v.Lambda.args);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004267 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004268 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004269 goto failed;
4270 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004271 value = ast2obj_expr(state, o->v.Lambda.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004272 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004273 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004274 goto failed;
4275 Py_DECREF(value);
4276 break;
4277 case IfExp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004278 tp = (PyTypeObject *)state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004279 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004280 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004281 value = ast2obj_expr(state, o->v.IfExp.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004282 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004283 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004284 goto failed;
4285 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004286 value = ast2obj_expr(state, o->v.IfExp.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004287 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004288 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004289 goto failed;
4290 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004291 value = ast2obj_expr(state, o->v.IfExp.orelse);
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->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004294 goto failed;
4295 Py_DECREF(value);
4296 break;
4297 case Dict_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004298 tp = (PyTypeObject *)state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004299 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004300 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004301 value = ast2obj_list(state, (asdl_seq*)o->v.Dict.keys, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004302 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004303 if (PyObject_SetAttr(result, state->keys, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004304 goto failed;
4305 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004306 value = ast2obj_list(state, (asdl_seq*)o->v.Dict.values, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004307 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004308 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004309 goto failed;
4310 Py_DECREF(value);
4311 break;
4312 case Set_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004313 tp = (PyTypeObject *)state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004314 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004315 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004316 value = ast2obj_list(state, (asdl_seq*)o->v.Set.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004317 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004318 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004319 goto failed;
4320 Py_DECREF(value);
4321 break;
4322 case ListComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004323 tp = (PyTypeObject *)state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004324 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004325 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004326 value = ast2obj_expr(state, o->v.ListComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004327 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004328 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004329 goto failed;
4330 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004331 value = ast2obj_list(state, (asdl_seq*)o->v.ListComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004332 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004333 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004334 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004335 goto failed;
4336 Py_DECREF(value);
4337 break;
4338 case SetComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004339 tp = (PyTypeObject *)state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004340 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004341 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004342 value = ast2obj_expr(state, o->v.SetComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004343 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004344 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004345 goto failed;
4346 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004347 value = ast2obj_list(state, (asdl_seq*)o->v.SetComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004348 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004349 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004350 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004351 goto failed;
4352 Py_DECREF(value);
4353 break;
4354 case DictComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004355 tp = (PyTypeObject *)state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004356 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004357 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004358 value = ast2obj_expr(state, o->v.DictComp.key);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004359 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004360 if (PyObject_SetAttr(result, state->key, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004361 goto failed;
4362 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004363 value = ast2obj_expr(state, o->v.DictComp.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004364 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004365 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004366 goto failed;
4367 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004368 value = ast2obj_list(state, (asdl_seq*)o->v.DictComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004369 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004370 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004371 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004372 goto failed;
4373 Py_DECREF(value);
4374 break;
4375 case GeneratorExp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004376 tp = (PyTypeObject *)state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004377 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004378 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004379 value = ast2obj_expr(state, o->v.GeneratorExp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004380 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004381 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004382 goto failed;
4383 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004384 value = ast2obj_list(state, (asdl_seq*)o->v.GeneratorExp.generators,
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004385 ast2obj_comprehension);
4386 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004387 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004388 goto failed;
4389 Py_DECREF(value);
4390 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004391 case Await_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004392 tp = (PyTypeObject *)state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004393 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04004394 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004395 value = ast2obj_expr(state, o->v.Await.value);
Yury Selivanov75445082015-05-11 22:57:16 -04004396 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004397 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04004398 goto failed;
4399 Py_DECREF(value);
4400 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004401 case Yield_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004402 tp = (PyTypeObject *)state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004403 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004404 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004405 value = ast2obj_expr(state, o->v.Yield.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004406 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004407 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004408 goto failed;
4409 Py_DECREF(value);
4410 break;
4411 case YieldFrom_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004412 tp = (PyTypeObject *)state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004413 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004414 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004415 value = ast2obj_expr(state, o->v.YieldFrom.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004416 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004417 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004418 goto failed;
4419 Py_DECREF(value);
4420 break;
4421 case Compare_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004422 tp = (PyTypeObject *)state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004423 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004424 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004425 value = ast2obj_expr(state, o->v.Compare.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004426 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004427 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004428 goto failed;
4429 Py_DECREF(value);
4430 {
4431 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
4432 value = PyList_New(n);
4433 if (!value) goto failed;
4434 for(i = 0; i < n; i++)
Victor Stinner74419f02020-07-03 11:35:37 +02004435 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 +00004436 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00004437 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004438 if (PyObject_SetAttr(result, state->ops, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004439 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004440 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004441 value = ast2obj_list(state, (asdl_seq*)o->v.Compare.comparators,
4442 ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00004443 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004444 if (PyObject_SetAttr(result, state->comparators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004445 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004446 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004447 break;
4448 case Call_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004449 tp = (PyTypeObject *)state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004450 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004451 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004452 value = ast2obj_expr(state, o->v.Call.func);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004453 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004454 if (PyObject_SetAttr(result, state->func, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004455 goto failed;
4456 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004457 value = ast2obj_list(state, (asdl_seq*)o->v.Call.args, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004458 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004459 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004460 goto failed;
4461 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004462 value = ast2obj_list(state, (asdl_seq*)o->v.Call.keywords,
4463 ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004464 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004465 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004466 goto failed;
4467 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004468 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004469 case FormattedValue_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004470 tp = (PyTypeObject *)state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004471 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004472 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004473 value = ast2obj_expr(state, o->v.FormattedValue.value);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004474 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004475 if (PyObject_SetAttr(result, state->value, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004476 goto failed;
4477 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004478 value = ast2obj_int(state, o->v.FormattedValue.conversion);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004479 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004480 if (PyObject_SetAttr(result, state->conversion, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004481 goto failed;
4482 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004483 value = ast2obj_expr(state, o->v.FormattedValue.format_spec);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004484 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004485 if (PyObject_SetAttr(result, state->format_spec, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004486 goto failed;
4487 Py_DECREF(value);
4488 break;
4489 case JoinedStr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004490 tp = (PyTypeObject *)state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004491 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004492 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004493 value = ast2obj_list(state, (asdl_seq*)o->v.JoinedStr.values,
4494 ast2obj_expr);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004495 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004496 if (PyObject_SetAttr(result, state->values, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004497 goto failed;
4498 Py_DECREF(value);
4499 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004500 case Constant_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004501 tp = (PyTypeObject *)state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004502 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004503 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004504 value = ast2obj_constant(state, o->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004505 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004506 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004507 goto failed;
4508 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004509 value = ast2obj_string(state, o->v.Constant.kind);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004510 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004511 if (PyObject_SetAttr(result, state->kind, value) == -1)
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004512 goto failed;
4513 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004514 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004515 case Attribute_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004516 tp = (PyTypeObject *)state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004517 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004518 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004519 value = ast2obj_expr(state, o->v.Attribute.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004520 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004521 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004522 goto failed;
4523 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004524 value = ast2obj_identifier(state, o->v.Attribute.attr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004525 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004526 if (PyObject_SetAttr(result, state->attr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004527 goto failed;
4528 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004529 value = ast2obj_expr_context(state, o->v.Attribute.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004530 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004531 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004532 goto failed;
4533 Py_DECREF(value);
4534 break;
4535 case Subscript_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004536 tp = (PyTypeObject *)state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004537 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004538 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004539 value = ast2obj_expr(state, o->v.Subscript.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004540 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004541 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004542 goto failed;
4543 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004544 value = ast2obj_expr(state, o->v.Subscript.slice);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004545 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004546 if (PyObject_SetAttr(result, state->slice, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004547 goto failed;
4548 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004549 value = ast2obj_expr_context(state, o->v.Subscript.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004550 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004551 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004552 goto failed;
4553 Py_DECREF(value);
4554 break;
4555 case Starred_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004556 tp = (PyTypeObject *)state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004557 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004558 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004559 value = ast2obj_expr(state, o->v.Starred.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004560 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004561 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004562 goto failed;
4563 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004564 value = ast2obj_expr_context(state, o->v.Starred.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004565 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004566 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004567 goto failed;
4568 Py_DECREF(value);
4569 break;
4570 case Name_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004571 tp = (PyTypeObject *)state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004572 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004573 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004574 value = ast2obj_identifier(state, o->v.Name.id);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004575 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004576 if (PyObject_SetAttr(result, state->id, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004577 goto failed;
4578 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004579 value = ast2obj_expr_context(state, o->v.Name.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004580 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004581 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004582 goto failed;
4583 Py_DECREF(value);
4584 break;
4585 case List_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004586 tp = (PyTypeObject *)state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004587 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004588 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004589 value = ast2obj_list(state, (asdl_seq*)o->v.List.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004590 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004591 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004592 goto failed;
4593 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004594 value = ast2obj_expr_context(state, o->v.List.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004595 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004596 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004597 goto failed;
4598 Py_DECREF(value);
4599 break;
4600 case Tuple_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004601 tp = (PyTypeObject *)state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004602 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004603 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004604 value = ast2obj_list(state, (asdl_seq*)o->v.Tuple.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004605 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004606 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004607 goto failed;
4608 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004609 value = ast2obj_expr_context(state, o->v.Tuple.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004610 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004611 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004612 goto failed;
4613 Py_DECREF(value);
4614 break;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004615 case Slice_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004616 tp = (PyTypeObject *)state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004617 result = PyType_GenericNew(tp, NULL, NULL);
4618 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004619 value = ast2obj_expr(state, o->v.Slice.lower);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004620 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004621 if (PyObject_SetAttr(result, state->lower, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004622 goto failed;
4623 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004624 value = ast2obj_expr(state, o->v.Slice.upper);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004625 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004626 if (PyObject_SetAttr(result, state->upper, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004627 goto failed;
4628 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004629 value = ast2obj_expr(state, o->v.Slice.step);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004630 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004631 if (PyObject_SetAttr(result, state->step, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004632 goto failed;
4633 Py_DECREF(value);
4634 break;
Brandt Bucher145bf262021-02-26 14:51:55 -08004635 case MatchAs_kind:
4636 tp = (PyTypeObject *)state->MatchAs_type;
4637 result = PyType_GenericNew(tp, NULL, NULL);
4638 if (!result) goto failed;
4639 value = ast2obj_expr(state, o->v.MatchAs.pattern);
4640 if (!value) goto failed;
4641 if (PyObject_SetAttr(result, state->pattern, value) == -1)
4642 goto failed;
4643 Py_DECREF(value);
4644 value = ast2obj_identifier(state, o->v.MatchAs.name);
4645 if (!value) goto failed;
4646 if (PyObject_SetAttr(result, state->name, value) == -1)
4647 goto failed;
4648 Py_DECREF(value);
4649 break;
4650 case MatchOr_kind:
4651 tp = (PyTypeObject *)state->MatchOr_type;
4652 result = PyType_GenericNew(tp, NULL, NULL);
4653 if (!result) goto failed;
4654 value = ast2obj_list(state, (asdl_seq*)o->v.MatchOr.patterns,
4655 ast2obj_expr);
4656 if (!value) goto failed;
4657 if (PyObject_SetAttr(result, state->patterns, value) == -1)
4658 goto failed;
4659 Py_DECREF(value);
4660 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004661 }
Victor Stinner74419f02020-07-03 11:35:37 +02004662 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004663 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004664 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004665 goto failed;
4666 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004667 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004668 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004669 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004670 goto failed;
4671 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004672 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004673 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004674 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004675 goto failed;
4676 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004677 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004678 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004679 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004680 goto failed;
4681 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004682 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004683failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004684 Py_XDECREF(value);
4685 Py_XDECREF(result);
4686 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004687}
4688
Victor Stinner5cf47822020-11-02 22:03:28 +01004689PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004690{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004691 switch(o) {
4692 case Load:
Victor Stinner74419f02020-07-03 11:35:37 +02004693 Py_INCREF(state->Load_singleton);
4694 return state->Load_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004695 case Store:
Victor Stinner74419f02020-07-03 11:35:37 +02004696 Py_INCREF(state->Store_singleton);
4697 return state->Store_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004698 case Del:
Victor Stinner74419f02020-07-03 11:35:37 +02004699 Py_INCREF(state->Del_singleton);
4700 return state->Del_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004701 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004702 Py_UNREACHABLE();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004703}
Victor Stinner5cf47822020-11-02 22:03:28 +01004704PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004705{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004706 switch(o) {
4707 case And:
Victor Stinner74419f02020-07-03 11:35:37 +02004708 Py_INCREF(state->And_singleton);
4709 return state->And_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004710 case Or:
Victor Stinner74419f02020-07-03 11:35:37 +02004711 Py_INCREF(state->Or_singleton);
4712 return state->Or_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004713 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004714 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004715}
Victor Stinner5cf47822020-11-02 22:03:28 +01004716PyObject* ast2obj_operator(struct ast_state *state, operator_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004717{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004718 switch(o) {
4719 case Add:
Victor Stinner74419f02020-07-03 11:35:37 +02004720 Py_INCREF(state->Add_singleton);
4721 return state->Add_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004722 case Sub:
Victor Stinner74419f02020-07-03 11:35:37 +02004723 Py_INCREF(state->Sub_singleton);
4724 return state->Sub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004725 case Mult:
Victor Stinner74419f02020-07-03 11:35:37 +02004726 Py_INCREF(state->Mult_singleton);
4727 return state->Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04004728 case MatMult:
Victor Stinner74419f02020-07-03 11:35:37 +02004729 Py_INCREF(state->MatMult_singleton);
4730 return state->MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004731 case Div:
Victor Stinner74419f02020-07-03 11:35:37 +02004732 Py_INCREF(state->Div_singleton);
4733 return state->Div_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004734 case Mod:
Victor Stinner74419f02020-07-03 11:35:37 +02004735 Py_INCREF(state->Mod_singleton);
4736 return state->Mod_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004737 case Pow:
Victor Stinner74419f02020-07-03 11:35:37 +02004738 Py_INCREF(state->Pow_singleton);
4739 return state->Pow_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004740 case LShift:
Victor Stinner74419f02020-07-03 11:35:37 +02004741 Py_INCREF(state->LShift_singleton);
4742 return state->LShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004743 case RShift:
Victor Stinner74419f02020-07-03 11:35:37 +02004744 Py_INCREF(state->RShift_singleton);
4745 return state->RShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004746 case BitOr:
Victor Stinner74419f02020-07-03 11:35:37 +02004747 Py_INCREF(state->BitOr_singleton);
4748 return state->BitOr_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004749 case BitXor:
Victor Stinner74419f02020-07-03 11:35:37 +02004750 Py_INCREF(state->BitXor_singleton);
4751 return state->BitXor_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004752 case BitAnd:
Victor Stinner74419f02020-07-03 11:35:37 +02004753 Py_INCREF(state->BitAnd_singleton);
4754 return state->BitAnd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004755 case FloorDiv:
Victor Stinner74419f02020-07-03 11:35:37 +02004756 Py_INCREF(state->FloorDiv_singleton);
4757 return state->FloorDiv_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004758 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004759 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004760}
Victor Stinner5cf47822020-11-02 22:03:28 +01004761PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004762{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004763 switch(o) {
4764 case Invert:
Victor Stinner74419f02020-07-03 11:35:37 +02004765 Py_INCREF(state->Invert_singleton);
4766 return state->Invert_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004767 case Not:
Victor Stinner74419f02020-07-03 11:35:37 +02004768 Py_INCREF(state->Not_singleton);
4769 return state->Not_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004770 case UAdd:
Victor Stinner74419f02020-07-03 11:35:37 +02004771 Py_INCREF(state->UAdd_singleton);
4772 return state->UAdd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 case USub:
Victor Stinner74419f02020-07-03 11:35:37 +02004774 Py_INCREF(state->USub_singleton);
4775 return state->USub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004776 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004777 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004778}
Victor Stinner5cf47822020-11-02 22:03:28 +01004779PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004780{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004781 switch(o) {
4782 case Eq:
Victor Stinner74419f02020-07-03 11:35:37 +02004783 Py_INCREF(state->Eq_singleton);
4784 return state->Eq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004785 case NotEq:
Victor Stinner74419f02020-07-03 11:35:37 +02004786 Py_INCREF(state->NotEq_singleton);
4787 return state->NotEq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004788 case Lt:
Victor Stinner74419f02020-07-03 11:35:37 +02004789 Py_INCREF(state->Lt_singleton);
4790 return state->Lt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004791 case LtE:
Victor Stinner74419f02020-07-03 11:35:37 +02004792 Py_INCREF(state->LtE_singleton);
4793 return state->LtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004794 case Gt:
Victor Stinner74419f02020-07-03 11:35:37 +02004795 Py_INCREF(state->Gt_singleton);
4796 return state->Gt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004797 case GtE:
Victor Stinner74419f02020-07-03 11:35:37 +02004798 Py_INCREF(state->GtE_singleton);
4799 return state->GtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004800 case Is:
Victor Stinner74419f02020-07-03 11:35:37 +02004801 Py_INCREF(state->Is_singleton);
4802 return state->Is_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004803 case IsNot:
Victor Stinner74419f02020-07-03 11:35:37 +02004804 Py_INCREF(state->IsNot_singleton);
4805 return state->IsNot_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004806 case In:
Victor Stinner74419f02020-07-03 11:35:37 +02004807 Py_INCREF(state->In_singleton);
4808 return state->In_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004809 case NotIn:
Victor Stinner74419f02020-07-03 11:35:37 +02004810 Py_INCREF(state->NotIn_singleton);
4811 return state->NotIn_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004812 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004813 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004814}
4815PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004816ast2obj_comprehension(struct ast_state *state, void* _o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004817{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004818 comprehension_ty o = (comprehension_ty)_o;
4819 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004820 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004821 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004822 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004823 }
Victor Stinner74419f02020-07-03 11:35:37 +02004824 tp = (PyTypeObject *)state->comprehension_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004825 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004826 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004827 value = ast2obj_expr(state, o->target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004828 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004829 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004830 goto failed;
4831 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004832 value = ast2obj_expr(state, o->iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004833 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004834 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004835 goto failed;
4836 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004837 value = ast2obj_list(state, (asdl_seq*)o->ifs, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004838 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004839 if (PyObject_SetAttr(result, state->ifs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004840 goto failed;
4841 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004842 value = ast2obj_int(state, o->is_async);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004843 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004844 if (PyObject_SetAttr(result, state->is_async, value) == -1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004845 goto failed;
4846 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004847 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004848failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004849 Py_XDECREF(value);
4850 Py_XDECREF(result);
4851 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004852}
4853
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004854PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004855ast2obj_excepthandler(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004856{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004857 excepthandler_ty o = (excepthandler_ty)_o;
4858 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004859 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004860 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004861 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004862 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004863 switch (o->kind) {
4864 case ExceptHandler_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004865 tp = (PyTypeObject *)state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004866 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004867 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004868 value = ast2obj_expr(state, o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004869 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004870 if (PyObject_SetAttr(result, state->type, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004871 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004872 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004873 value = ast2obj_identifier(state, o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004874 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004875 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004876 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004877 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004878 value = ast2obj_list(state, (asdl_seq*)o->v.ExceptHandler.body,
4879 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004880 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004881 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004882 goto failed;
4883 Py_DECREF(value);
4884 break;
4885 }
Victor Stinner74419f02020-07-03 11:35:37 +02004886 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004887 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004888 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004889 goto failed;
4890 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004891 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004892 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004893 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004894 goto failed;
4895 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004896 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004897 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004898 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004899 goto failed;
4900 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004901 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004902 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004903 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004904 goto failed;
4905 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004906 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004907failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004908 Py_XDECREF(value);
4909 Py_XDECREF(result);
4910 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004911}
4912
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004913PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004914ast2obj_arguments(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004915{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004916 arguments_ty o = (arguments_ty)_o;
4917 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004918 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004919 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004920 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004921 }
Victor Stinner74419f02020-07-03 11:35:37 +02004922 tp = (PyTypeObject *)state->arguments_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004923 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004924 if (!result) return NULL;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004925 value = ast2obj_list(state, (asdl_seq*)o->posonlyargs, ast2obj_arg);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004926 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004927 if (PyObject_SetAttr(result, state->posonlyargs, value) == -1)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004928 goto failed;
4929 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004930 value = ast2obj_list(state, (asdl_seq*)o->args, ast2obj_arg);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004931 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004932 if (PyObject_SetAttr(result, state->args, value) == -1)
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004933 goto failed;
4934 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004935 value = ast2obj_arg(state, o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004936 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004937 if (PyObject_SetAttr(result, state->vararg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004938 goto failed;
4939 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004940 value = ast2obj_list(state, (asdl_seq*)o->kwonlyargs, ast2obj_arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004941 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004942 if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004943 goto failed;
4944 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004945 value = ast2obj_list(state, (asdl_seq*)o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004946 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004947 if (PyObject_SetAttr(result, state->kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004948 goto failed;
4949 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004950 value = ast2obj_arg(state, o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004951 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004952 if (PyObject_SetAttr(result, state->kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004953 goto failed;
4954 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004955 value = ast2obj_list(state, (asdl_seq*)o->defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004956 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004957 if (PyObject_SetAttr(result, state->defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004958 goto failed;
4959 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004960 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004961failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004962 Py_XDECREF(value);
4963 Py_XDECREF(result);
4964 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004965}
4966
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004967PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004968ast2obj_arg(struct ast_state *state, void* _o)
Neal Norwitzc1505362006-12-28 06:47:50 +00004969{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004970 arg_ty o = (arg_ty)_o;
4971 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004972 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004973 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004974 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004975 }
Victor Stinner74419f02020-07-03 11:35:37 +02004976 tp = (PyTypeObject *)state->arg_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004977 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004978 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004979 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004980 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004981 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004982 goto failed;
4983 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004984 value = ast2obj_expr(state, o->annotation);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004985 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004986 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004987 goto failed;
4988 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004989 value = ast2obj_string(state, o->type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004990 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004991 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004992 goto failed;
4993 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004994 value = ast2obj_int(state, o->lineno);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004995 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004996 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004997 goto failed;
4998 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004999 value = ast2obj_int(state, o->col_offset);
Victor Stinneree4b59c2013-07-27 00:01:35 +02005000 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005001 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02005002 goto failed;
5003 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005004 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005005 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005006 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005007 goto failed;
5008 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005009 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005010 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005011 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005012 goto failed;
5013 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005014 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00005015failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005016 Py_XDECREF(value);
5017 Py_XDECREF(result);
5018 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00005019}
5020
5021PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01005022ast2obj_keyword(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005023{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005024 keyword_ty o = (keyword_ty)_o;
5025 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005026 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005027 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005028 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005029 }
Victor Stinner74419f02020-07-03 11:35:37 +02005030 tp = (PyTypeObject *)state->keyword_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005031 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005032 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02005033 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005034 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005035 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005036 goto failed;
5037 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005038 value = ast2obj_expr(state, o->value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005039 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005040 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005041 goto failed;
5042 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005043 value = ast2obj_int(state, o->lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01005044 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005045 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01005046 goto failed;
5047 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005048 value = ast2obj_int(state, o->col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01005049 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005050 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01005051 goto failed;
5052 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005053 value = ast2obj_int(state, o->end_lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01005054 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005055 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01005056 goto failed;
5057 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005058 value = ast2obj_int(state, o->end_col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01005059 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005060 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01005061 goto failed;
5062 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005063 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005064failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005065 Py_XDECREF(value);
5066 Py_XDECREF(result);
5067 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005068}
5069
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005070PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01005071ast2obj_alias(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005072{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005073 alias_ty o = (alias_ty)_o;
5074 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005075 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005076 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005077 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005078 }
Victor Stinner74419f02020-07-03 11:35:37 +02005079 tp = (PyTypeObject *)state->alias_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005080 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005081 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02005082 value = ast2obj_identifier(state, o->name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005083 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005084 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005085 goto failed;
5086 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005087 value = ast2obj_identifier(state, o->asname);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005088 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005089 if (PyObject_SetAttr(result, state->asname, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005090 goto failed;
5091 Py_DECREF(value);
5092 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005093failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005094 Py_XDECREF(value);
5095 Py_XDECREF(result);
5096 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005097}
5098
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005099PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01005100ast2obj_withitem(struct ast_state *state, void* _o)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005101{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005102 withitem_ty o = (withitem_ty)_o;
5103 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005104 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005105 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005106 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005107 }
Victor Stinner74419f02020-07-03 11:35:37 +02005108 tp = (PyTypeObject *)state->withitem_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005109 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005110 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02005111 value = ast2obj_expr(state, o->context_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005112 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005113 if (PyObject_SetAttr(result, state->context_expr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005114 goto failed;
5115 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005116 value = ast2obj_expr(state, o->optional_vars);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005117 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005118 if (PyObject_SetAttr(result, state->optional_vars, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005119 goto failed;
5120 Py_DECREF(value);
5121 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005122failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005123 Py_XDECREF(value);
5124 Py_XDECREF(result);
5125 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005126}
5127
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005128PyObject*
Brandt Bucher145bf262021-02-26 14:51:55 -08005129ast2obj_match_case(struct ast_state *state, void* _o)
5130{
5131 match_case_ty o = (match_case_ty)_o;
5132 PyObject *result = NULL, *value = NULL;
5133 PyTypeObject *tp;
5134 if (!o) {
5135 Py_RETURN_NONE;
5136 }
5137 tp = (PyTypeObject *)state->match_case_type;
5138 result = PyType_GenericNew(tp, NULL, NULL);
5139 if (!result) return NULL;
5140 value = ast2obj_expr(state, o->pattern);
5141 if (!value) goto failed;
5142 if (PyObject_SetAttr(result, state->pattern, value) == -1)
5143 goto failed;
5144 Py_DECREF(value);
5145 value = ast2obj_expr(state, o->guard);
5146 if (!value) goto failed;
5147 if (PyObject_SetAttr(result, state->guard, value) == -1)
5148 goto failed;
5149 Py_DECREF(value);
5150 value = ast2obj_list(state, (asdl_seq*)o->body, ast2obj_stmt);
5151 if (!value) goto failed;
5152 if (PyObject_SetAttr(result, state->body, value) == -1)
5153 goto failed;
5154 Py_DECREF(value);
5155 return result;
5156failed:
5157 Py_XDECREF(value);
5158 Py_XDECREF(result);
5159 return NULL;
5160}
5161
5162PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01005163ast2obj_type_ignore(struct ast_state *state, void* _o)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005164{
5165 type_ignore_ty o = (type_ignore_ty)_o;
5166 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005167 PyTypeObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005168 if (!o) {
5169 Py_RETURN_NONE;
5170 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005171 switch (o->kind) {
5172 case TypeIgnore_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02005173 tp = (PyTypeObject *)state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005174 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005175 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005176 value = ast2obj_int(state, o->v.TypeIgnore.lineno);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005177 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005178 if (PyObject_SetAttr(result, state->lineno, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005179 goto failed;
5180 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02005181 value = ast2obj_string(state, o->v.TypeIgnore.tag);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07005182 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02005183 if (PyObject_SetAttr(result, state->tag, value) == -1)
Michael J. Sullivan933e1502019-05-22 07:54:20 -07005184 goto failed;
5185 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005186 break;
5187 }
5188 return result;
5189failed:
5190 Py_XDECREF(value);
5191 Py_XDECREF(result);
5192 return NULL;
5193}
5194
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005195
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005196int
Victor Stinner5cf47822020-11-02 22:03:28 +01005197obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005198{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005199 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005200
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005201 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005202 PyObject *tp;
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 tp = state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005209 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005210 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005211 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005212 }
5213 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005214 asdl_stmt_seq* body;
5215 asdl_type_ignore_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005216
Victor Stinner74419f02020-07-03 11:35:37 +02005217 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005218 return 1;
5219 }
5220 if (tmp == NULL) {
5221 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
5222 return 1;
5223 }
5224 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005225 int res;
5226 Py_ssize_t len;
5227 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005228 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005229 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 +02005230 goto failed;
5231 }
5232 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005233 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005234 if (body == NULL) goto failed;
5235 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005236 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005237 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5238 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005239 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005240 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005241 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005242 if (len != PyList_GET_SIZE(tmp)) {
5243 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
5244 goto failed;
5245 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005246 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005247 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005248 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005249 }
Victor Stinner74419f02020-07-03 11:35:37 +02005250 if (_PyObject_LookupAttr(obj, state->type_ignores, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005251 return 1;
5252 }
5253 if (tmp == NULL) {
5254 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
5255 return 1;
5256 }
5257 else {
5258 int res;
5259 Py_ssize_t len;
5260 Py_ssize_t i;
5261 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005262 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 -08005263 goto failed;
5264 }
5265 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005266 type_ignores = _Py_asdl_type_ignore_seq_new(len, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005267 if (type_ignores == NULL) goto failed;
5268 for (i = 0; i < len; i++) {
5269 type_ignore_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005270 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5271 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005272 res = obj2ast_type_ignore(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005273 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005274 if (res != 0) goto failed;
5275 if (len != PyList_GET_SIZE(tmp)) {
5276 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
5277 goto failed;
5278 }
5279 asdl_seq_SET(type_ignores, i, val);
5280 }
5281 Py_CLEAR(tmp);
5282 }
5283 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005284 if (*out == NULL) goto failed;
5285 return 0;
5286 }
Victor Stinner74419f02020-07-03 11:35:37 +02005287 tp = state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005288 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005289 if (isinstance == -1) {
5290 return 1;
5291 }
5292 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005293 asdl_stmt_seq* body;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005294
Victor Stinner74419f02020-07-03 11:35:37 +02005295 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005296 return 1;
5297 }
5298 if (tmp == NULL) {
5299 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
5300 return 1;
5301 }
5302 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005303 int res;
5304 Py_ssize_t len;
5305 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005306 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005307 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 +02005308 goto failed;
5309 }
5310 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005311 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005312 if (body == NULL) goto failed;
5313 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005314 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005315 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5316 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005317 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005318 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005319 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005320 if (len != PyList_GET_SIZE(tmp)) {
5321 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
5322 goto failed;
5323 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005324 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005325 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005326 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005327 }
5328 *out = Interactive(body, arena);
5329 if (*out == NULL) goto failed;
5330 return 0;
5331 }
Victor Stinner74419f02020-07-03 11:35:37 +02005332 tp = state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005333 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005334 if (isinstance == -1) {
5335 return 1;
5336 }
5337 if (isinstance) {
5338 expr_ty body;
5339
Victor Stinner74419f02020-07-03 11:35:37 +02005340 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005341 return 1;
5342 }
5343 if (tmp == NULL) {
5344 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
5345 return 1;
5346 }
5347 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005348 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005349 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005350 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005351 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005352 }
5353 *out = Expression(body, arena);
5354 if (*out == NULL) goto failed;
5355 return 0;
5356 }
Victor Stinner74419f02020-07-03 11:35:37 +02005357 tp = state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005358 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005359 if (isinstance == -1) {
5360 return 1;
5361 }
5362 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005363 asdl_expr_seq* argtypes;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005364 expr_ty returns;
5365
Victor Stinner74419f02020-07-03 11:35:37 +02005366 if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005367 return 1;
5368 }
5369 if (tmp == NULL) {
5370 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
5371 return 1;
5372 }
5373 else {
5374 int res;
5375 Py_ssize_t len;
5376 Py_ssize_t i;
5377 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005378 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 -08005379 goto failed;
5380 }
5381 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005382 argtypes = _Py_asdl_expr_seq_new(len, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005383 if (argtypes == NULL) goto failed;
5384 for (i = 0; i < len; i++) {
5385 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005386 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5387 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005388 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005389 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005390 if (res != 0) goto failed;
5391 if (len != PyList_GET_SIZE(tmp)) {
5392 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
5393 goto failed;
5394 }
5395 asdl_seq_SET(argtypes, i, val);
5396 }
5397 Py_CLEAR(tmp);
5398 }
Victor Stinner74419f02020-07-03 11:35:37 +02005399 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005400 return 1;
5401 }
5402 if (tmp == NULL) {
5403 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
5404 return 1;
5405 }
5406 else {
5407 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005408 res = obj2ast_expr(state, tmp, &returns, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005409 if (res != 0) goto failed;
5410 Py_CLEAR(tmp);
5411 }
5412 *out = FunctionType(argtypes, returns, arena);
5413 if (*out == NULL) goto failed;
5414 return 0;
5415 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005416
5417 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
5418 failed:
5419 Py_XDECREF(tmp);
5420 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005421}
5422
5423int
Victor Stinner5cf47822020-11-02 22:03:28 +01005424obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
5425 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005426{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005427 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005428
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005429 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005430 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005431 int lineno;
5432 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005433 int end_lineno;
5434 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005435
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005436 if (obj == Py_None) {
5437 *out = NULL;
5438 return 0;
5439 }
Victor Stinner74419f02020-07-03 11:35:37 +02005440 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005441 return 1;
5442 }
5443 if (tmp == NULL) {
5444 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
5445 return 1;
5446 }
5447 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005448 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005449 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005450 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005451 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005452 }
Victor Stinner74419f02020-07-03 11:35:37 +02005453 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005454 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005455 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005456 if (tmp == NULL) {
5457 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
5458 return 1;
5459 }
5460 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005461 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005462 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005463 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005464 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005465 }
Victor Stinner74419f02020-07-03 11:35:37 +02005466 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005467 return 1;
5468 }
5469 if (tmp == NULL || tmp == Py_None) {
5470 Py_CLEAR(tmp);
5471 end_lineno = 0;
5472 }
5473 else {
5474 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005475 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005476 if (res != 0) goto failed;
5477 Py_CLEAR(tmp);
5478 }
Victor Stinner74419f02020-07-03 11:35:37 +02005479 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005480 return 1;
5481 }
5482 if (tmp == NULL || tmp == Py_None) {
5483 Py_CLEAR(tmp);
5484 end_col_offset = 0;
5485 }
5486 else {
5487 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005488 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005489 if (res != 0) goto failed;
5490 Py_CLEAR(tmp);
5491 }
Victor Stinner74419f02020-07-03 11:35:37 +02005492 tp = state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005493 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005494 if (isinstance == -1) {
5495 return 1;
5496 }
5497 if (isinstance) {
5498 identifier name;
5499 arguments_ty args;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005500 asdl_stmt_seq* body;
5501 asdl_expr_seq* decorator_list;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005502 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005503 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005504
Victor Stinner74419f02020-07-03 11:35:37 +02005505 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005506 return 1;
5507 }
5508 if (tmp == NULL) {
5509 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
5510 return 1;
5511 }
5512 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005513 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005514 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005515 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005516 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005517 }
Victor Stinner74419f02020-07-03 11:35:37 +02005518 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005519 return 1;
5520 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005521 if (tmp == NULL) {
5522 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
5523 return 1;
5524 }
5525 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005526 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005527 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005528 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005529 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005530 }
Victor Stinner74419f02020-07-03 11:35:37 +02005531 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005532 return 1;
5533 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005534 if (tmp == NULL) {
5535 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
5536 return 1;
5537 }
5538 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005539 int res;
5540 Py_ssize_t len;
5541 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005542 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005543 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 +02005544 goto failed;
5545 }
5546 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005547 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005548 if (body == NULL) goto failed;
5549 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005550 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005551 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5552 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005553 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005554 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005555 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005556 if (len != PyList_GET_SIZE(tmp)) {
5557 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
5558 goto failed;
5559 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005560 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005561 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005562 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005563 }
Victor Stinner74419f02020-07-03 11:35:37 +02005564 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005565 return 1;
5566 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005567 if (tmp == NULL) {
5568 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
5569 return 1;
5570 }
5571 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005572 int res;
5573 Py_ssize_t len;
5574 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005575 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005576 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 +02005577 goto failed;
5578 }
5579 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005580 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005581 if (decorator_list == NULL) goto failed;
5582 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005583 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005584 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5585 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005586 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005587 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005588 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005589 if (len != PyList_GET_SIZE(tmp)) {
5590 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
5591 goto failed;
5592 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005593 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005594 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005595 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005596 }
Victor Stinner74419f02020-07-03 11:35:37 +02005597 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005598 return 1;
5599 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005600 if (tmp == NULL || tmp == Py_None) {
5601 Py_CLEAR(tmp);
5602 returns = NULL;
5603 }
5604 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005605 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005606 res = obj2ast_expr(state, tmp, &returns, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005607 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005608 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005609 }
Victor Stinner74419f02020-07-03 11:35:37 +02005610 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005611 return 1;
5612 }
5613 if (tmp == NULL || tmp == Py_None) {
5614 Py_CLEAR(tmp);
5615 type_comment = NULL;
5616 }
5617 else {
5618 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005619 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005620 if (res != 0) goto failed;
5621 Py_CLEAR(tmp);
5622 }
5623 *out = FunctionDef(name, args, body, decorator_list, returns,
5624 type_comment, lineno, col_offset, end_lineno,
5625 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005626 if (*out == NULL) goto failed;
5627 return 0;
5628 }
Victor Stinner74419f02020-07-03 11:35:37 +02005629 tp = state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005630 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04005631 if (isinstance == -1) {
5632 return 1;
5633 }
5634 if (isinstance) {
5635 identifier name;
5636 arguments_ty args;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005637 asdl_stmt_seq* body;
5638 asdl_expr_seq* decorator_list;
Yury Selivanov75445082015-05-11 22:57:16 -04005639 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005640 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005641
Victor Stinner74419f02020-07-03 11:35:37 +02005642 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005643 return 1;
5644 }
5645 if (tmp == NULL) {
5646 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
5647 return 1;
5648 }
5649 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005650 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005651 res = obj2ast_identifier(state, tmp, &name, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005652 if (res != 0) goto failed;
5653 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005654 }
Victor Stinner74419f02020-07-03 11:35:37 +02005655 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005656 return 1;
5657 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005658 if (tmp == NULL) {
5659 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
5660 return 1;
5661 }
5662 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005663 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005664 res = obj2ast_arguments(state, tmp, &args, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005665 if (res != 0) goto failed;
5666 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005667 }
Victor Stinner74419f02020-07-03 11:35:37 +02005668 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005669 return 1;
5670 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005671 if (tmp == NULL) {
5672 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
5673 return 1;
5674 }
5675 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005676 int res;
5677 Py_ssize_t len;
5678 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005679 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005680 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 -04005681 goto failed;
5682 }
5683 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005684 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005685 if (body == NULL) goto failed;
5686 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005687 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005688 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5689 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005690 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005691 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005692 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005693 if (len != PyList_GET_SIZE(tmp)) {
5694 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
5695 goto failed;
5696 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005697 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005698 }
5699 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005700 }
Victor Stinner74419f02020-07-03 11:35:37 +02005701 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005702 return 1;
5703 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005704 if (tmp == NULL) {
5705 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
5706 return 1;
5707 }
5708 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005709 int res;
5710 Py_ssize_t len;
5711 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005712 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005713 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 -04005714 goto failed;
5715 }
5716 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005717 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005718 if (decorator_list == NULL) goto failed;
5719 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005720 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005721 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5722 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005723 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005724 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005725 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005726 if (len != PyList_GET_SIZE(tmp)) {
5727 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
5728 goto failed;
5729 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005730 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005731 }
5732 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005733 }
Victor Stinner74419f02020-07-03 11:35:37 +02005734 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005735 return 1;
5736 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005737 if (tmp == NULL || tmp == Py_None) {
5738 Py_CLEAR(tmp);
5739 returns = NULL;
5740 }
5741 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005742 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005743 res = obj2ast_expr(state, tmp, &returns, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005744 if (res != 0) goto failed;
5745 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005746 }
Victor Stinner74419f02020-07-03 11:35:37 +02005747 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005748 return 1;
5749 }
5750 if (tmp == NULL || tmp == Py_None) {
5751 Py_CLEAR(tmp);
5752 type_comment = NULL;
5753 }
5754 else {
5755 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005756 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005757 if (res != 0) goto failed;
5758 Py_CLEAR(tmp);
5759 }
Yury Selivanov75445082015-05-11 22:57:16 -04005760 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005761 type_comment, lineno, col_offset, end_lineno,
5762 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005763 if (*out == NULL) goto failed;
5764 return 0;
5765 }
Victor Stinner74419f02020-07-03 11:35:37 +02005766 tp = state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005767 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005768 if (isinstance == -1) {
5769 return 1;
5770 }
5771 if (isinstance) {
5772 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005773 asdl_expr_seq* bases;
5774 asdl_keyword_seq* keywords;
5775 asdl_stmt_seq* body;
5776 asdl_expr_seq* decorator_list;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005777
Victor Stinner74419f02020-07-03 11:35:37 +02005778 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005779 return 1;
5780 }
5781 if (tmp == NULL) {
5782 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
5783 return 1;
5784 }
5785 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005786 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005787 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005788 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005789 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005790 }
Victor Stinner74419f02020-07-03 11:35:37 +02005791 if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005792 return 1;
5793 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005794 if (tmp == NULL) {
5795 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
5796 return 1;
5797 }
5798 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005799 int res;
5800 Py_ssize_t len;
5801 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005802 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005803 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 +02005804 goto failed;
5805 }
5806 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005807 bases = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005808 if (bases == NULL) goto failed;
5809 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005810 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005811 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5812 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005813 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005814 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005815 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005816 if (len != PyList_GET_SIZE(tmp)) {
5817 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
5818 goto failed;
5819 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005820 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005821 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005822 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005823 }
Victor Stinner74419f02020-07-03 11:35:37 +02005824 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005825 return 1;
5826 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005827 if (tmp == NULL) {
5828 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
5829 return 1;
5830 }
5831 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005832 int res;
5833 Py_ssize_t len;
5834 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005835 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005836 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 +02005837 goto failed;
5838 }
5839 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005840 keywords = _Py_asdl_keyword_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005841 if (keywords == NULL) goto failed;
5842 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005843 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005844 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5845 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005846 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005847 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005848 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005849 if (len != PyList_GET_SIZE(tmp)) {
5850 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
5851 goto failed;
5852 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005853 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005854 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005855 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005856 }
Victor Stinner74419f02020-07-03 11:35:37 +02005857 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005858 return 1;
5859 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005860 if (tmp == NULL) {
5861 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
5862 return 1;
5863 }
5864 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005865 int res;
5866 Py_ssize_t len;
5867 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005868 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005869 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 +02005870 goto failed;
5871 }
5872 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005873 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005874 if (body == NULL) goto failed;
5875 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005876 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005877 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5878 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005879 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005880 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005881 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005882 if (len != PyList_GET_SIZE(tmp)) {
5883 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
5884 goto failed;
5885 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005886 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005887 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005888 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005889 }
Victor Stinner74419f02020-07-03 11:35:37 +02005890 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005891 return 1;
5892 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005893 if (tmp == NULL) {
5894 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
5895 return 1;
5896 }
5897 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005898 int res;
5899 Py_ssize_t len;
5900 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005901 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005902 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 +02005903 goto failed;
5904 }
5905 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005906 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005907 if (decorator_list == NULL) goto failed;
5908 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005909 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005910 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5911 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005912 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005913 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005914 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005915 if (len != PyList_GET_SIZE(tmp)) {
5916 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
5917 goto failed;
5918 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005919 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005920 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005921 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005922 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03005923 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005924 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005925 if (*out == NULL) goto failed;
5926 return 0;
5927 }
Victor Stinner74419f02020-07-03 11:35:37 +02005928 tp = state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005929 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005930 if (isinstance == -1) {
5931 return 1;
5932 }
5933 if (isinstance) {
5934 expr_ty value;
5935
Victor Stinner74419f02020-07-03 11:35:37 +02005936 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005937 return 1;
5938 }
5939 if (tmp == NULL || tmp == Py_None) {
5940 Py_CLEAR(tmp);
5941 value = NULL;
5942 }
5943 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005944 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005945 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005946 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005947 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005948 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005949 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
5950 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005951 if (*out == NULL) goto failed;
5952 return 0;
5953 }
Victor Stinner74419f02020-07-03 11:35:37 +02005954 tp = state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005955 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005956 if (isinstance == -1) {
5957 return 1;
5958 }
5959 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005960 asdl_expr_seq* targets;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005961
Victor Stinner74419f02020-07-03 11:35:37 +02005962 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005963 return 1;
5964 }
5965 if (tmp == NULL) {
5966 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
5967 return 1;
5968 }
5969 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005970 int res;
5971 Py_ssize_t len;
5972 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005973 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005974 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 +02005975 goto failed;
5976 }
5977 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005978 targets = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005979 if (targets == NULL) goto failed;
5980 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005981 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005982 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5983 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005984 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005985 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005986 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005987 if (len != PyList_GET_SIZE(tmp)) {
5988 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
5989 goto failed;
5990 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005991 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005992 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005993 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005994 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005995 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
5996 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005997 if (*out == NULL) goto failed;
5998 return 0;
5999 }
Victor Stinner74419f02020-07-03 11:35:37 +02006000 tp = state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006001 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006002 if (isinstance == -1) {
6003 return 1;
6004 }
6005 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006006 asdl_expr_seq* targets;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006007 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006008 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006009
Victor Stinner74419f02020-07-03 11:35:37 +02006010 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006011 return 1;
6012 }
6013 if (tmp == NULL) {
6014 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
6015 return 1;
6016 }
6017 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006018 int res;
6019 Py_ssize_t len;
6020 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006021 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006022 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 +02006023 goto failed;
6024 }
6025 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006026 targets = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006027 if (targets == NULL) goto failed;
6028 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006029 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006030 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6031 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006032 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006033 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006034 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006035 if (len != PyList_GET_SIZE(tmp)) {
6036 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
6037 goto failed;
6038 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006039 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006040 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006041 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006042 }
Victor Stinner74419f02020-07-03 11:35:37 +02006043 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006044 return 1;
6045 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006046 if (tmp == NULL) {
6047 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
6048 return 1;
6049 }
6050 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006051 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006052 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006053 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006054 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006055 }
Victor Stinner74419f02020-07-03 11:35:37 +02006056 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006057 return 1;
6058 }
6059 if (tmp == NULL || tmp == Py_None) {
6060 Py_CLEAR(tmp);
6061 type_comment = NULL;
6062 }
6063 else {
6064 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006065 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006066 if (res != 0) goto failed;
6067 Py_CLEAR(tmp);
6068 }
6069 *out = Assign(targets, value, type_comment, lineno, col_offset,
6070 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006071 if (*out == NULL) goto failed;
6072 return 0;
6073 }
Victor Stinner74419f02020-07-03 11:35:37 +02006074 tp = state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006075 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006076 if (isinstance == -1) {
6077 return 1;
6078 }
6079 if (isinstance) {
6080 expr_ty target;
6081 operator_ty op;
6082 expr_ty value;
6083
Victor Stinner74419f02020-07-03 11:35:37 +02006084 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006085 return 1;
6086 }
6087 if (tmp == NULL) {
6088 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
6089 return 1;
6090 }
6091 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006092 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006093 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006094 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006095 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006096 }
Victor Stinner74419f02020-07-03 11:35:37 +02006097 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006098 return 1;
6099 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006100 if (tmp == NULL) {
6101 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
6102 return 1;
6103 }
6104 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006105 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006106 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006107 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006108 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006109 }
Victor Stinner74419f02020-07-03 11:35:37 +02006110 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006111 return 1;
6112 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006113 if (tmp == NULL) {
6114 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
6115 return 1;
6116 }
6117 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006118 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006119 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006120 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006121 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006122 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006123 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
6124 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006125 if (*out == NULL) goto failed;
6126 return 0;
6127 }
Victor Stinner74419f02020-07-03 11:35:37 +02006128 tp = state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006129 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006130 if (isinstance == -1) {
6131 return 1;
6132 }
6133 if (isinstance) {
6134 expr_ty target;
6135 expr_ty annotation;
6136 expr_ty value;
6137 int simple;
6138
Victor Stinner74419f02020-07-03 11:35:37 +02006139 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006140 return 1;
6141 }
6142 if (tmp == NULL) {
6143 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
6144 return 1;
6145 }
6146 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006147 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006148 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006149 if (res != 0) goto failed;
6150 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006151 }
Victor Stinner74419f02020-07-03 11:35:37 +02006152 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006153 return 1;
6154 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006155 if (tmp == NULL) {
6156 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
6157 return 1;
6158 }
6159 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006160 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006161 res = obj2ast_expr(state, tmp, &annotation, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006162 if (res != 0) goto failed;
6163 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006164 }
Victor Stinner74419f02020-07-03 11:35:37 +02006165 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006166 return 1;
6167 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006168 if (tmp == NULL || tmp == Py_None) {
6169 Py_CLEAR(tmp);
6170 value = NULL;
6171 }
6172 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006173 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006174 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006175 if (res != 0) goto failed;
6176 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006177 }
Victor Stinner74419f02020-07-03 11:35:37 +02006178 if (_PyObject_LookupAttr(obj, state->simple, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006179 return 1;
6180 }
6181 if (tmp == NULL) {
6182 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
6183 return 1;
6184 }
6185 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006186 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006187 res = obj2ast_int(state, tmp, &simple, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006188 if (res != 0) goto failed;
6189 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006190 }
6191 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006192 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006193 if (*out == NULL) goto failed;
6194 return 0;
6195 }
Victor Stinner74419f02020-07-03 11:35:37 +02006196 tp = state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006197 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006198 if (isinstance == -1) {
6199 return 1;
6200 }
6201 if (isinstance) {
6202 expr_ty target;
6203 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006204 asdl_stmt_seq* body;
6205 asdl_stmt_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006206 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006207
Victor Stinner74419f02020-07-03 11:35:37 +02006208 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006209 return 1;
6210 }
6211 if (tmp == NULL) {
6212 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
6213 return 1;
6214 }
6215 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006216 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006217 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006218 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006219 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006220 }
Victor Stinner74419f02020-07-03 11:35:37 +02006221 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006222 return 1;
6223 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006224 if (tmp == NULL) {
6225 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
6226 return 1;
6227 }
6228 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006229 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006230 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006231 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006232 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006233 }
Victor Stinner74419f02020-07-03 11:35:37 +02006234 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006235 return 1;
6236 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006237 if (tmp == NULL) {
6238 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
6239 return 1;
6240 }
6241 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006242 int res;
6243 Py_ssize_t len;
6244 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006245 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006246 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 +02006247 goto failed;
6248 }
6249 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006250 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006251 if (body == NULL) goto failed;
6252 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006253 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006254 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6255 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006256 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006257 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006258 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006259 if (len != PyList_GET_SIZE(tmp)) {
6260 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
6261 goto failed;
6262 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006263 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006264 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006265 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006266 }
Victor Stinner74419f02020-07-03 11:35:37 +02006267 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006268 return 1;
6269 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006270 if (tmp == NULL) {
6271 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
6272 return 1;
6273 }
6274 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006275 int res;
6276 Py_ssize_t len;
6277 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006278 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006279 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 +02006280 goto failed;
6281 }
6282 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006283 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006284 if (orelse == NULL) goto failed;
6285 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006286 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006287 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6288 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006289 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006290 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006291 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006292 if (len != PyList_GET_SIZE(tmp)) {
6293 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
6294 goto failed;
6295 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006296 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006297 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006298 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006299 }
Victor Stinner74419f02020-07-03 11:35:37 +02006300 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006301 return 1;
6302 }
6303 if (tmp == NULL || tmp == Py_None) {
6304 Py_CLEAR(tmp);
6305 type_comment = NULL;
6306 }
6307 else {
6308 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006309 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006310 if (res != 0) goto failed;
6311 Py_CLEAR(tmp);
6312 }
6313 *out = For(target, iter, body, orelse, type_comment, lineno,
6314 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006315 if (*out == NULL) goto failed;
6316 return 0;
6317 }
Victor Stinner74419f02020-07-03 11:35:37 +02006318 tp = state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006319 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006320 if (isinstance == -1) {
6321 return 1;
6322 }
6323 if (isinstance) {
6324 expr_ty target;
6325 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006326 asdl_stmt_seq* body;
6327 asdl_stmt_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006328 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006329
Victor Stinner74419f02020-07-03 11:35:37 +02006330 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006331 return 1;
6332 }
6333 if (tmp == NULL) {
6334 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
6335 return 1;
6336 }
6337 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006338 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006339 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006340 if (res != 0) goto failed;
6341 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006342 }
Victor Stinner74419f02020-07-03 11:35:37 +02006343 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006344 return 1;
6345 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006346 if (tmp == NULL) {
6347 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
6348 return 1;
6349 }
6350 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006351 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006352 res = obj2ast_expr(state, tmp, &iter, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006353 if (res != 0) goto failed;
6354 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006355 }
Victor Stinner74419f02020-07-03 11:35:37 +02006356 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006357 return 1;
6358 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006359 if (tmp == NULL) {
6360 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
6361 return 1;
6362 }
6363 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006364 int res;
6365 Py_ssize_t len;
6366 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006367 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006368 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 -04006369 goto failed;
6370 }
6371 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006372 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006373 if (body == NULL) goto failed;
6374 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006375 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006376 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6377 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006378 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006379 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006380 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006381 if (len != PyList_GET_SIZE(tmp)) {
6382 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
6383 goto failed;
6384 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006385 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006386 }
6387 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006388 }
Victor Stinner74419f02020-07-03 11:35:37 +02006389 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006390 return 1;
6391 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006392 if (tmp == NULL) {
6393 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
6394 return 1;
6395 }
6396 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006397 int res;
6398 Py_ssize_t len;
6399 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006400 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006401 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 -04006402 goto failed;
6403 }
6404 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006405 orelse = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006406 if (orelse == NULL) goto failed;
6407 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006408 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006409 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6410 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006411 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006412 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006413 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006414 if (len != PyList_GET_SIZE(tmp)) {
6415 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
6416 goto failed;
6417 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006418 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006419 }
6420 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006421 }
Victor Stinner74419f02020-07-03 11:35:37 +02006422 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006423 return 1;
6424 }
6425 if (tmp == NULL || tmp == Py_None) {
6426 Py_CLEAR(tmp);
6427 type_comment = NULL;
6428 }
6429 else {
6430 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006431 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006432 if (res != 0) goto failed;
6433 Py_CLEAR(tmp);
6434 }
6435 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
6436 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006437 if (*out == NULL) goto failed;
6438 return 0;
6439 }
Victor Stinner74419f02020-07-03 11:35:37 +02006440 tp = state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006441 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006442 if (isinstance == -1) {
6443 return 1;
6444 }
6445 if (isinstance) {
6446 expr_ty test;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006447 asdl_stmt_seq* body;
6448 asdl_stmt_seq* orelse;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006449
Victor Stinner74419f02020-07-03 11:35:37 +02006450 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006451 return 1;
6452 }
6453 if (tmp == NULL) {
6454 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
6455 return 1;
6456 }
6457 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006458 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006459 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006460 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006461 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006462 }
Victor Stinner74419f02020-07-03 11:35:37 +02006463 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006464 return 1;
6465 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006466 if (tmp == NULL) {
6467 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
6468 return 1;
6469 }
6470 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006471 int res;
6472 Py_ssize_t len;
6473 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006474 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006475 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 +02006476 goto failed;
6477 }
6478 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006479 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006480 if (body == NULL) goto failed;
6481 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006482 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006483 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6484 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006485 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006486 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006487 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006488 if (len != PyList_GET_SIZE(tmp)) {
6489 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
6490 goto failed;
6491 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006492 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006493 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006494 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006495 }
Victor Stinner74419f02020-07-03 11:35:37 +02006496 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006497 return 1;
6498 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006499 if (tmp == NULL) {
6500 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
6501 return 1;
6502 }
6503 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006504 int res;
6505 Py_ssize_t len;
6506 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006507 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006508 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 +02006509 goto failed;
6510 }
6511 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006512 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006513 if (orelse == NULL) goto failed;
6514 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006515 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006516 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6517 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006518 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006519 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006520 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006521 if (len != PyList_GET_SIZE(tmp)) {
6522 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
6523 goto failed;
6524 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006525 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006526 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006527 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006528 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006529 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
6530 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006531 if (*out == NULL) goto failed;
6532 return 0;
6533 }
Victor Stinner74419f02020-07-03 11:35:37 +02006534 tp = state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006535 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006536 if (isinstance == -1) {
6537 return 1;
6538 }
6539 if (isinstance) {
6540 expr_ty test;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006541 asdl_stmt_seq* body;
6542 asdl_stmt_seq* orelse;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006543
Victor Stinner74419f02020-07-03 11:35:37 +02006544 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006545 return 1;
6546 }
6547 if (tmp == NULL) {
6548 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
6549 return 1;
6550 }
6551 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006552 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006553 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006554 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006555 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006556 }
Victor Stinner74419f02020-07-03 11:35:37 +02006557 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006558 return 1;
6559 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006560 if (tmp == NULL) {
6561 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
6562 return 1;
6563 }
6564 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006565 int res;
6566 Py_ssize_t len;
6567 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006568 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006569 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 +02006570 goto failed;
6571 }
6572 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006573 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006574 if (body == NULL) goto failed;
6575 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006576 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006577 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6578 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006579 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006580 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006581 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006582 if (len != PyList_GET_SIZE(tmp)) {
6583 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
6584 goto failed;
6585 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006586 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006587 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006588 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006589 }
Victor Stinner74419f02020-07-03 11:35:37 +02006590 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006591 return 1;
6592 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006593 if (tmp == NULL) {
6594 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
6595 return 1;
6596 }
6597 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006598 int res;
6599 Py_ssize_t len;
6600 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006601 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006602 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 +02006603 goto failed;
6604 }
6605 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006606 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006607 if (orelse == NULL) goto failed;
6608 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006609 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006610 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6611 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006612 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006613 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006614 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006615 if (len != PyList_GET_SIZE(tmp)) {
6616 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
6617 goto failed;
6618 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006619 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006620 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006621 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006622 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006623 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
6624 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006625 if (*out == NULL) goto failed;
6626 return 0;
6627 }
Victor Stinner74419f02020-07-03 11:35:37 +02006628 tp = state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006629 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006630 if (isinstance == -1) {
6631 return 1;
6632 }
6633 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006634 asdl_withitem_seq* items;
6635 asdl_stmt_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006636 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006637
Victor Stinner74419f02020-07-03 11:35:37 +02006638 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006639 return 1;
6640 }
6641 if (tmp == NULL) {
6642 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
6643 return 1;
6644 }
6645 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006646 int res;
6647 Py_ssize_t len;
6648 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006649 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006650 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 +02006651 goto failed;
6652 }
6653 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006654 items = _Py_asdl_withitem_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006655 if (items == NULL) goto failed;
6656 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006657 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006658 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6659 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006660 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006661 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006662 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006663 if (len != PyList_GET_SIZE(tmp)) {
6664 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
6665 goto failed;
6666 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006667 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006668 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006669 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006670 }
Victor Stinner74419f02020-07-03 11:35:37 +02006671 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006672 return 1;
6673 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006674 if (tmp == NULL) {
6675 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
6676 return 1;
6677 }
6678 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006679 int res;
6680 Py_ssize_t len;
6681 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006682 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006683 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 +02006684 goto failed;
6685 }
6686 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006687 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006688 if (body == NULL) goto failed;
6689 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006690 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006691 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6692 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006693 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006694 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006695 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006696 if (len != PyList_GET_SIZE(tmp)) {
6697 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
6698 goto failed;
6699 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006700 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006701 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006702 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006703 }
Victor Stinner74419f02020-07-03 11:35:37 +02006704 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006705 return 1;
6706 }
6707 if (tmp == NULL || tmp == Py_None) {
6708 Py_CLEAR(tmp);
6709 type_comment = NULL;
6710 }
6711 else {
6712 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006713 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006714 if (res != 0) goto failed;
6715 Py_CLEAR(tmp);
6716 }
6717 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006718 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006719 if (*out == NULL) goto failed;
6720 return 0;
6721 }
Victor Stinner74419f02020-07-03 11:35:37 +02006722 tp = state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006723 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006724 if (isinstance == -1) {
6725 return 1;
6726 }
6727 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006728 asdl_withitem_seq* items;
6729 asdl_stmt_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006730 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006731
Victor Stinner74419f02020-07-03 11:35:37 +02006732 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006733 return 1;
6734 }
6735 if (tmp == NULL) {
6736 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
6737 return 1;
6738 }
6739 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006740 int res;
6741 Py_ssize_t len;
6742 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006743 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006744 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 -04006745 goto failed;
6746 }
6747 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006748 items = _Py_asdl_withitem_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006749 if (items == NULL) goto failed;
6750 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006751 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006752 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6753 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006754 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006755 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006756 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006757 if (len != PyList_GET_SIZE(tmp)) {
6758 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
6759 goto failed;
6760 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006761 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006762 }
6763 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006764 }
Victor Stinner74419f02020-07-03 11:35:37 +02006765 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006766 return 1;
6767 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006768 if (tmp == NULL) {
6769 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
6770 return 1;
6771 }
6772 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006773 int res;
6774 Py_ssize_t len;
6775 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006776 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006777 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 -04006778 goto failed;
6779 }
6780 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006781 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006782 if (body == NULL) goto failed;
6783 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006784 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006785 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6786 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006787 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006788 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006789 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006790 if (len != PyList_GET_SIZE(tmp)) {
6791 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
6792 goto failed;
6793 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006794 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006795 }
6796 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006797 }
Victor Stinner74419f02020-07-03 11:35:37 +02006798 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006799 return 1;
6800 }
6801 if (tmp == NULL || tmp == Py_None) {
6802 Py_CLEAR(tmp);
6803 type_comment = NULL;
6804 }
6805 else {
6806 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006807 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006808 if (res != 0) goto failed;
6809 Py_CLEAR(tmp);
6810 }
6811 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
6812 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006813 if (*out == NULL) goto failed;
6814 return 0;
6815 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006816 tp = state->Match_type;
6817 isinstance = PyObject_IsInstance(obj, tp);
6818 if (isinstance == -1) {
6819 return 1;
6820 }
6821 if (isinstance) {
6822 expr_ty subject;
6823 asdl_match_case_seq* cases;
6824
6825 if (_PyObject_LookupAttr(obj, state->subject, &tmp) < 0) {
6826 return 1;
6827 }
6828 if (tmp == NULL) {
6829 PyErr_SetString(PyExc_TypeError, "required field \"subject\" missing from Match");
6830 return 1;
6831 }
6832 else {
6833 int res;
6834 res = obj2ast_expr(state, tmp, &subject, arena);
6835 if (res != 0) goto failed;
6836 Py_CLEAR(tmp);
6837 }
6838 if (_PyObject_LookupAttr(obj, state->cases, &tmp) < 0) {
6839 return 1;
6840 }
6841 if (tmp == NULL) {
6842 PyErr_SetString(PyExc_TypeError, "required field \"cases\" missing from Match");
6843 return 1;
6844 }
6845 else {
6846 int res;
6847 Py_ssize_t len;
6848 Py_ssize_t i;
6849 if (!PyList_Check(tmp)) {
6850 PyErr_Format(PyExc_TypeError, "Match field \"cases\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
6851 goto failed;
6852 }
6853 len = PyList_GET_SIZE(tmp);
6854 cases = _Py_asdl_match_case_seq_new(len, arena);
6855 if (cases == NULL) goto failed;
6856 for (i = 0; i < len; i++) {
6857 match_case_ty val;
6858 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6859 Py_INCREF(tmp2);
6860 res = obj2ast_match_case(state, tmp2, &val, arena);
6861 Py_DECREF(tmp2);
6862 if (res != 0) goto failed;
6863 if (len != PyList_GET_SIZE(tmp)) {
6864 PyErr_SetString(PyExc_RuntimeError, "Match field \"cases\" changed size during iteration");
6865 goto failed;
6866 }
6867 asdl_seq_SET(cases, i, val);
6868 }
6869 Py_CLEAR(tmp);
6870 }
6871 *out = Match(subject, cases, lineno, col_offset, end_lineno,
6872 end_col_offset, arena);
6873 if (*out == NULL) goto failed;
6874 return 0;
6875 }
Victor Stinner74419f02020-07-03 11:35:37 +02006876 tp = state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006877 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006878 if (isinstance == -1) {
6879 return 1;
6880 }
6881 if (isinstance) {
6882 expr_ty exc;
6883 expr_ty cause;
6884
Victor Stinner74419f02020-07-03 11:35:37 +02006885 if (_PyObject_LookupAttr(obj, state->exc, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006886 return 1;
6887 }
6888 if (tmp == NULL || tmp == Py_None) {
6889 Py_CLEAR(tmp);
6890 exc = NULL;
6891 }
6892 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006893 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006894 res = obj2ast_expr(state, tmp, &exc, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006895 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006896 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006897 }
Victor Stinner74419f02020-07-03 11:35:37 +02006898 if (_PyObject_LookupAttr(obj, state->cause, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006899 return 1;
6900 }
6901 if (tmp == NULL || tmp == Py_None) {
6902 Py_CLEAR(tmp);
6903 cause = NULL;
6904 }
6905 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006906 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006907 res = obj2ast_expr(state, tmp, &cause, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006908 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006909 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006910 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006911 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
6912 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006913 if (*out == NULL) goto failed;
6914 return 0;
6915 }
Victor Stinner74419f02020-07-03 11:35:37 +02006916 tp = state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006917 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006918 if (isinstance == -1) {
6919 return 1;
6920 }
6921 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006922 asdl_stmt_seq* body;
6923 asdl_excepthandler_seq* handlers;
6924 asdl_stmt_seq* orelse;
6925 asdl_stmt_seq* finalbody;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006926
Victor Stinner74419f02020-07-03 11:35:37 +02006927 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006928 return 1;
6929 }
6930 if (tmp == NULL) {
6931 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
6932 return 1;
6933 }
6934 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006935 int res;
6936 Py_ssize_t len;
6937 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006938 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006939 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 +02006940 goto failed;
6941 }
6942 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006943 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006944 if (body == NULL) goto failed;
6945 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006946 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006947 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6948 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006949 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006950 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006951 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006952 if (len != PyList_GET_SIZE(tmp)) {
6953 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
6954 goto failed;
6955 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006956 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006957 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006958 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006959 }
Victor Stinner74419f02020-07-03 11:35:37 +02006960 if (_PyObject_LookupAttr(obj, state->handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006961 return 1;
6962 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006963 if (tmp == NULL) {
6964 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
6965 return 1;
6966 }
6967 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006968 int res;
6969 Py_ssize_t len;
6970 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006971 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006972 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 +02006973 goto failed;
6974 }
6975 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006976 handlers = _Py_asdl_excepthandler_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006977 if (handlers == NULL) goto failed;
6978 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006979 excepthandler_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006980 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6981 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006982 res = obj2ast_excepthandler(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006983 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006984 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006985 if (len != PyList_GET_SIZE(tmp)) {
6986 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
6987 goto failed;
6988 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006989 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006990 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006991 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006992 }
Victor Stinner74419f02020-07-03 11:35:37 +02006993 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006994 return 1;
6995 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006996 if (tmp == NULL) {
6997 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
6998 return 1;
6999 }
7000 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007001 int res;
7002 Py_ssize_t len;
7003 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007004 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007005 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 +02007006 goto failed;
7007 }
7008 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007009 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007010 if (orelse == NULL) goto failed;
7011 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007012 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007013 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7014 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007015 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007016 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007017 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007018 if (len != PyList_GET_SIZE(tmp)) {
7019 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
7020 goto failed;
7021 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007022 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007023 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007024 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007025 }
Victor Stinner74419f02020-07-03 11:35:37 +02007026 if (_PyObject_LookupAttr(obj, state->finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007027 return 1;
7028 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007029 if (tmp == NULL) {
7030 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
7031 return 1;
7032 }
7033 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007034 int res;
7035 Py_ssize_t len;
7036 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007037 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007038 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 +02007039 goto failed;
7040 }
7041 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007042 finalbody = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007043 if (finalbody == NULL) goto failed;
7044 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007045 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007046 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7047 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007048 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007049 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007050 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007051 if (len != PyList_GET_SIZE(tmp)) {
7052 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
7053 goto failed;
7054 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007055 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007056 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007057 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007058 }
7059 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007060 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007061 if (*out == NULL) goto failed;
7062 return 0;
7063 }
Victor Stinner74419f02020-07-03 11:35:37 +02007064 tp = state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007065 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007066 if (isinstance == -1) {
7067 return 1;
7068 }
7069 if (isinstance) {
7070 expr_ty test;
7071 expr_ty msg;
7072
Victor Stinner74419f02020-07-03 11:35:37 +02007073 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007074 return 1;
7075 }
7076 if (tmp == NULL) {
7077 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
7078 return 1;
7079 }
7080 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007081 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007082 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007083 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007084 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007085 }
Victor Stinner74419f02020-07-03 11:35:37 +02007086 if (_PyObject_LookupAttr(obj, state->msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007087 return 1;
7088 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007089 if (tmp == NULL || tmp == Py_None) {
7090 Py_CLEAR(tmp);
7091 msg = NULL;
7092 }
7093 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007094 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007095 res = obj2ast_expr(state, tmp, &msg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007096 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007097 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007098 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007099 *out = Assert(test, msg, lineno, col_offset, end_lineno,
7100 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007101 if (*out == NULL) goto failed;
7102 return 0;
7103 }
Victor Stinner74419f02020-07-03 11:35:37 +02007104 tp = state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007105 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007106 if (isinstance == -1) {
7107 return 1;
7108 }
7109 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007110 asdl_alias_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007111
Victor Stinner74419f02020-07-03 11:35:37 +02007112 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007113 return 1;
7114 }
7115 if (tmp == NULL) {
7116 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
7117 return 1;
7118 }
7119 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007120 int res;
7121 Py_ssize_t len;
7122 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007123 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007124 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 +02007125 goto failed;
7126 }
7127 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007128 names = _Py_asdl_alias_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007129 if (names == NULL) goto failed;
7130 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007131 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007132 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7133 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007134 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007135 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007136 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007137 if (len != PyList_GET_SIZE(tmp)) {
7138 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
7139 goto failed;
7140 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007141 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007142 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007143 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007144 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007145 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
7146 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007147 if (*out == NULL) goto failed;
7148 return 0;
7149 }
Victor Stinner74419f02020-07-03 11:35:37 +02007150 tp = state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007151 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007152 if (isinstance == -1) {
7153 return 1;
7154 }
7155 if (isinstance) {
7156 identifier module;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007157 asdl_alias_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007158 int level;
7159
Victor Stinner74419f02020-07-03 11:35:37 +02007160 if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007161 return 1;
7162 }
7163 if (tmp == NULL || tmp == Py_None) {
7164 Py_CLEAR(tmp);
7165 module = NULL;
7166 }
7167 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007168 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007169 res = obj2ast_identifier(state, tmp, &module, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007170 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007171 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007172 }
Victor Stinner74419f02020-07-03 11:35:37 +02007173 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007174 return 1;
7175 }
7176 if (tmp == NULL) {
7177 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
7178 return 1;
7179 }
7180 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007181 int res;
7182 Py_ssize_t len;
7183 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007184 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007185 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 +02007186 goto failed;
7187 }
7188 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007189 names = _Py_asdl_alias_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007190 if (names == NULL) goto failed;
7191 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007192 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007193 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7194 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007195 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007196 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007197 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007198 if (len != PyList_GET_SIZE(tmp)) {
7199 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
7200 goto failed;
7201 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007202 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007203 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007204 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007205 }
Victor Stinner74419f02020-07-03 11:35:37 +02007206 if (_PyObject_LookupAttr(obj, state->level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007207 return 1;
7208 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007209 if (tmp == NULL || tmp == Py_None) {
7210 Py_CLEAR(tmp);
7211 level = 0;
7212 }
7213 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007214 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007215 res = obj2ast_int(state, tmp, &level, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007216 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007217 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007218 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007219 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
7220 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007221 if (*out == NULL) goto failed;
7222 return 0;
7223 }
Victor Stinner74419f02020-07-03 11:35:37 +02007224 tp = state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007225 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007226 if (isinstance == -1) {
7227 return 1;
7228 }
7229 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007230 asdl_identifier_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007231
Victor Stinner74419f02020-07-03 11:35:37 +02007232 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007233 return 1;
7234 }
7235 if (tmp == NULL) {
7236 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
7237 return 1;
7238 }
7239 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007240 int res;
7241 Py_ssize_t len;
7242 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007243 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007244 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007245 goto failed;
7246 }
7247 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007248 names = _Py_asdl_identifier_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007249 if (names == NULL) goto failed;
7250 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007251 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007252 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7253 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007254 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007255 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007256 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007257 if (len != PyList_GET_SIZE(tmp)) {
7258 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
7259 goto failed;
7260 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007261 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007262 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007263 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007264 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007265 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
7266 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007267 if (*out == NULL) goto failed;
7268 return 0;
7269 }
Victor Stinner74419f02020-07-03 11:35:37 +02007270 tp = state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007271 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007272 if (isinstance == -1) {
7273 return 1;
7274 }
7275 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007276 asdl_identifier_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007277
Victor Stinner74419f02020-07-03 11:35:37 +02007278 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007279 return 1;
7280 }
7281 if (tmp == NULL) {
7282 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
7283 return 1;
7284 }
7285 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007286 int res;
7287 Py_ssize_t len;
7288 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007289 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007290 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 +02007291 goto failed;
7292 }
7293 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007294 names = _Py_asdl_identifier_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007295 if (names == NULL) goto failed;
7296 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007297 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007298 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7299 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007300 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007301 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007302 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007303 if (len != PyList_GET_SIZE(tmp)) {
7304 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
7305 goto failed;
7306 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007307 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007308 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007309 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007310 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007311 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
7312 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007313 if (*out == NULL) goto failed;
7314 return 0;
7315 }
Victor Stinner74419f02020-07-03 11:35:37 +02007316 tp = state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007317 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007318 if (isinstance == -1) {
7319 return 1;
7320 }
7321 if (isinstance) {
7322 expr_ty value;
7323
Victor Stinner74419f02020-07-03 11:35:37 +02007324 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007325 return 1;
7326 }
7327 if (tmp == NULL) {
7328 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
7329 return 1;
7330 }
7331 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007332 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007333 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007334 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007335 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007336 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007337 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
7338 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007339 if (*out == NULL) goto failed;
7340 return 0;
7341 }
Victor Stinner74419f02020-07-03 11:35:37 +02007342 tp = state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007343 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007344 if (isinstance == -1) {
7345 return 1;
7346 }
7347 if (isinstance) {
7348
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007349 *out = Pass(lineno, col_offset, end_lineno, 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->Break_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
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007360 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007361 if (*out == NULL) goto failed;
7362 return 0;
7363 }
Victor Stinner74419f02020-07-03 11:35:37 +02007364 tp = state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007365 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007366 if (isinstance == -1) {
7367 return 1;
7368 }
7369 if (isinstance) {
7370
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007371 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007372 if (*out == NULL) goto failed;
7373 return 0;
7374 }
7375
7376 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
7377 failed:
7378 Py_XDECREF(tmp);
7379 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007380}
7381
7382int
Victor Stinner5cf47822020-11-02 22:03:28 +01007383obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
7384 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007385{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007386 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007387
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007388 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007389 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007390 int lineno;
7391 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007392 int end_lineno;
7393 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007394
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007395 if (obj == Py_None) {
7396 *out = NULL;
7397 return 0;
7398 }
Victor Stinner74419f02020-07-03 11:35:37 +02007399 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007400 return 1;
7401 }
7402 if (tmp == NULL) {
7403 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
7404 return 1;
7405 }
7406 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007407 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007408 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007409 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007410 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007411 }
Victor Stinner74419f02020-07-03 11:35:37 +02007412 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007413 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007414 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007415 if (tmp == NULL) {
7416 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
7417 return 1;
7418 }
7419 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007420 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007421 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007422 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007423 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007424 }
Victor Stinner74419f02020-07-03 11:35:37 +02007425 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007426 return 1;
7427 }
7428 if (tmp == NULL || tmp == Py_None) {
7429 Py_CLEAR(tmp);
7430 end_lineno = 0;
7431 }
7432 else {
7433 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007434 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007435 if (res != 0) goto failed;
7436 Py_CLEAR(tmp);
7437 }
Victor Stinner74419f02020-07-03 11:35:37 +02007438 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007439 return 1;
7440 }
7441 if (tmp == NULL || tmp == Py_None) {
7442 Py_CLEAR(tmp);
7443 end_col_offset = 0;
7444 }
7445 else {
7446 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007447 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007448 if (res != 0) goto failed;
7449 Py_CLEAR(tmp);
7450 }
Victor Stinner74419f02020-07-03 11:35:37 +02007451 tp = state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007452 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007453 if (isinstance == -1) {
7454 return 1;
7455 }
7456 if (isinstance) {
7457 boolop_ty op;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007458 asdl_expr_seq* values;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007459
Victor Stinner74419f02020-07-03 11:35:37 +02007460 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007461 return 1;
7462 }
7463 if (tmp == NULL) {
7464 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
7465 return 1;
7466 }
7467 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007468 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007469 res = obj2ast_boolop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007470 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007471 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007472 }
Victor Stinner74419f02020-07-03 11:35:37 +02007473 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007474 return 1;
7475 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007476 if (tmp == NULL) {
7477 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
7478 return 1;
7479 }
7480 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007481 int res;
7482 Py_ssize_t len;
7483 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007484 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007485 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 +02007486 goto failed;
7487 }
7488 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007489 values = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007490 if (values == NULL) goto failed;
7491 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007492 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007493 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7494 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007495 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007496 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007497 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007498 if (len != PyList_GET_SIZE(tmp)) {
7499 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
7500 goto failed;
7501 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007502 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007503 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007504 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007505 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007506 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
7507 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007508 if (*out == NULL) goto failed;
7509 return 0;
7510 }
Victor Stinner74419f02020-07-03 11:35:37 +02007511 tp = state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007512 isinstance = PyObject_IsInstance(obj, tp);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007513 if (isinstance == -1) {
7514 return 1;
7515 }
7516 if (isinstance) {
7517 expr_ty target;
7518 expr_ty value;
7519
Victor Stinner74419f02020-07-03 11:35:37 +02007520 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007521 return 1;
7522 }
7523 if (tmp == NULL) {
7524 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
7525 return 1;
7526 }
7527 else {
7528 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007529 res = obj2ast_expr(state, tmp, &target, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007530 if (res != 0) goto failed;
7531 Py_CLEAR(tmp);
7532 }
Victor Stinner74419f02020-07-03 11:35:37 +02007533 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007534 return 1;
7535 }
7536 if (tmp == NULL) {
7537 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
7538 return 1;
7539 }
7540 else {
7541 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007542 res = obj2ast_expr(state, tmp, &value, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007543 if (res != 0) goto failed;
7544 Py_CLEAR(tmp);
7545 }
7546 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
7547 end_col_offset, arena);
7548 if (*out == NULL) goto failed;
7549 return 0;
7550 }
Victor Stinner74419f02020-07-03 11:35:37 +02007551 tp = state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007552 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007553 if (isinstance == -1) {
7554 return 1;
7555 }
7556 if (isinstance) {
7557 expr_ty left;
7558 operator_ty op;
7559 expr_ty right;
7560
Victor Stinner74419f02020-07-03 11:35:37 +02007561 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007562 return 1;
7563 }
7564 if (tmp == NULL) {
7565 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
7566 return 1;
7567 }
7568 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007569 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007570 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007571 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007572 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007573 }
Victor Stinner74419f02020-07-03 11:35:37 +02007574 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007575 return 1;
7576 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007577 if (tmp == NULL) {
7578 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
7579 return 1;
7580 }
7581 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007582 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007583 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007584 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007585 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007586 }
Victor Stinner74419f02020-07-03 11:35:37 +02007587 if (_PyObject_LookupAttr(obj, state->right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007588 return 1;
7589 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007590 if (tmp == NULL) {
7591 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
7592 return 1;
7593 }
7594 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007595 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007596 res = obj2ast_expr(state, tmp, &right, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007597 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007598 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007599 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007600 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
7601 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007602 if (*out == NULL) goto failed;
7603 return 0;
7604 }
Victor Stinner74419f02020-07-03 11:35:37 +02007605 tp = state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007606 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007607 if (isinstance == -1) {
7608 return 1;
7609 }
7610 if (isinstance) {
7611 unaryop_ty op;
7612 expr_ty operand;
7613
Victor Stinner74419f02020-07-03 11:35:37 +02007614 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007615 return 1;
7616 }
7617 if (tmp == NULL) {
7618 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
7619 return 1;
7620 }
7621 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007622 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007623 res = obj2ast_unaryop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007624 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007625 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007626 }
Victor Stinner74419f02020-07-03 11:35:37 +02007627 if (_PyObject_LookupAttr(obj, state->operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007628 return 1;
7629 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007630 if (tmp == NULL) {
7631 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
7632 return 1;
7633 }
7634 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007635 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007636 res = obj2ast_expr(state, tmp, &operand, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007637 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007638 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007639 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007640 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
7641 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007642 if (*out == NULL) goto failed;
7643 return 0;
7644 }
Victor Stinner74419f02020-07-03 11:35:37 +02007645 tp = state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007646 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007647 if (isinstance == -1) {
7648 return 1;
7649 }
7650 if (isinstance) {
7651 arguments_ty args;
7652 expr_ty body;
7653
Victor Stinner74419f02020-07-03 11:35:37 +02007654 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007655 return 1;
7656 }
7657 if (tmp == NULL) {
7658 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
7659 return 1;
7660 }
7661 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007662 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007663 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007664 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007665 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007666 }
Victor Stinner74419f02020-07-03 11:35:37 +02007667 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007668 return 1;
7669 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007670 if (tmp == NULL) {
7671 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
7672 return 1;
7673 }
7674 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007675 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007676 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007677 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007678 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007679 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007680 *out = Lambda(args, body, lineno, col_offset, end_lineno,
7681 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007682 if (*out == NULL) goto failed;
7683 return 0;
7684 }
Victor Stinner74419f02020-07-03 11:35:37 +02007685 tp = state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007686 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007687 if (isinstance == -1) {
7688 return 1;
7689 }
7690 if (isinstance) {
7691 expr_ty test;
7692 expr_ty body;
7693 expr_ty orelse;
7694
Victor Stinner74419f02020-07-03 11:35:37 +02007695 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007696 return 1;
7697 }
7698 if (tmp == NULL) {
7699 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
7700 return 1;
7701 }
7702 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007703 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007704 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007705 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007706 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007707 }
Victor Stinner74419f02020-07-03 11:35:37 +02007708 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007709 return 1;
7710 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007711 if (tmp == NULL) {
7712 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
7713 return 1;
7714 }
7715 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007716 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007717 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007718 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007719 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007720 }
Victor Stinner74419f02020-07-03 11:35:37 +02007721 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007722 return 1;
7723 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007724 if (tmp == NULL) {
7725 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
7726 return 1;
7727 }
7728 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007729 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007730 res = obj2ast_expr(state, tmp, &orelse, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007731 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007732 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007733 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007734 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
7735 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007736 if (*out == NULL) goto failed;
7737 return 0;
7738 }
Victor Stinner74419f02020-07-03 11:35:37 +02007739 tp = state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007740 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007741 if (isinstance == -1) {
7742 return 1;
7743 }
7744 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007745 asdl_expr_seq* keys;
7746 asdl_expr_seq* values;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007747
Victor Stinner74419f02020-07-03 11:35:37 +02007748 if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007749 return 1;
7750 }
7751 if (tmp == NULL) {
7752 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
7753 return 1;
7754 }
7755 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007756 int res;
7757 Py_ssize_t len;
7758 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007759 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007760 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 +02007761 goto failed;
7762 }
7763 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007764 keys = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007765 if (keys == NULL) goto failed;
7766 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007767 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007768 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7769 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007770 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007771 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007772 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007773 if (len != PyList_GET_SIZE(tmp)) {
7774 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
7775 goto failed;
7776 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007777 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007778 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007779 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007780 }
Victor Stinner74419f02020-07-03 11:35:37 +02007781 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007782 return 1;
7783 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007784 if (tmp == NULL) {
7785 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
7786 return 1;
7787 }
7788 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007789 int res;
7790 Py_ssize_t len;
7791 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007792 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007793 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 +02007794 goto failed;
7795 }
7796 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007797 values = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007798 if (values == NULL) goto failed;
7799 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007800 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007801 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7802 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007803 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007804 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007805 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007806 if (len != PyList_GET_SIZE(tmp)) {
7807 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
7808 goto failed;
7809 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007810 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007811 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007812 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007813 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007814 *out = Dict(keys, values, lineno, col_offset, end_lineno,
7815 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007816 if (*out == NULL) goto failed;
7817 return 0;
7818 }
Victor Stinner74419f02020-07-03 11:35:37 +02007819 tp = state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007820 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007821 if (isinstance == -1) {
7822 return 1;
7823 }
7824 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007825 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007826
Victor Stinner74419f02020-07-03 11:35:37 +02007827 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007828 return 1;
7829 }
7830 if (tmp == NULL) {
7831 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
7832 return 1;
7833 }
7834 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007835 int res;
7836 Py_ssize_t len;
7837 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007838 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007839 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 +02007840 goto failed;
7841 }
7842 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007843 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007844 if (elts == NULL) goto failed;
7845 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007846 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007847 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7848 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007849 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007850 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007851 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007852 if (len != PyList_GET_SIZE(tmp)) {
7853 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
7854 goto failed;
7855 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007856 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007857 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007858 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007859 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007860 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007861 if (*out == NULL) goto failed;
7862 return 0;
7863 }
Victor Stinner74419f02020-07-03 11:35:37 +02007864 tp = state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007865 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007866 if (isinstance == -1) {
7867 return 1;
7868 }
7869 if (isinstance) {
7870 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007871 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007872
Victor Stinner74419f02020-07-03 11:35:37 +02007873 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007874 return 1;
7875 }
7876 if (tmp == NULL) {
7877 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
7878 return 1;
7879 }
7880 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007881 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007882 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007883 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007884 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007885 }
Victor Stinner74419f02020-07-03 11:35:37 +02007886 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007887 return 1;
7888 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007889 if (tmp == NULL) {
7890 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
7891 return 1;
7892 }
7893 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007894 int res;
7895 Py_ssize_t len;
7896 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007897 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007898 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 +02007899 goto failed;
7900 }
7901 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007902 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007903 if (generators == NULL) goto failed;
7904 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007905 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007906 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7907 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007908 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007909 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007910 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007911 if (len != PyList_GET_SIZE(tmp)) {
7912 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
7913 goto failed;
7914 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007915 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007916 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007917 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007918 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007919 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
7920 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007921 if (*out == NULL) goto failed;
7922 return 0;
7923 }
Victor Stinner74419f02020-07-03 11:35:37 +02007924 tp = state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007925 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007926 if (isinstance == -1) {
7927 return 1;
7928 }
7929 if (isinstance) {
7930 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007931 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007932
Victor Stinner74419f02020-07-03 11:35:37 +02007933 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007934 return 1;
7935 }
7936 if (tmp == NULL) {
7937 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
7938 return 1;
7939 }
7940 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007941 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007942 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007943 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007944 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007945 }
Victor Stinner74419f02020-07-03 11:35:37 +02007946 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007947 return 1;
7948 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007949 if (tmp == NULL) {
7950 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
7951 return 1;
7952 }
7953 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007954 int res;
7955 Py_ssize_t len;
7956 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007957 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007958 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 +02007959 goto failed;
7960 }
7961 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007962 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007963 if (generators == NULL) goto failed;
7964 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007965 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007966 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7967 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007968 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007969 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007970 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007971 if (len != PyList_GET_SIZE(tmp)) {
7972 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
7973 goto failed;
7974 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007975 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007976 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007977 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007978 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007979 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
7980 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007981 if (*out == NULL) goto failed;
7982 return 0;
7983 }
Victor Stinner74419f02020-07-03 11:35:37 +02007984 tp = state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007985 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007986 if (isinstance == -1) {
7987 return 1;
7988 }
7989 if (isinstance) {
7990 expr_ty key;
7991 expr_ty value;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007992 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007993
Victor Stinner74419f02020-07-03 11:35:37 +02007994 if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007995 return 1;
7996 }
7997 if (tmp == NULL) {
7998 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
7999 return 1;
8000 }
8001 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008002 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008003 res = obj2ast_expr(state, tmp, &key, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008004 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008005 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008006 }
Victor Stinner74419f02020-07-03 11:35:37 +02008007 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008008 return 1;
8009 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008010 if (tmp == NULL) {
8011 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
8012 return 1;
8013 }
8014 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008015 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008016 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008017 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008018 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008019 }
Victor Stinner74419f02020-07-03 11:35:37 +02008020 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008021 return 1;
8022 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008023 if (tmp == NULL) {
8024 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
8025 return 1;
8026 }
8027 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008028 int res;
8029 Py_ssize_t len;
8030 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008031 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008032 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 +02008033 goto failed;
8034 }
8035 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008036 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008037 if (generators == NULL) goto failed;
8038 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008039 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008040 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8041 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008042 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008043 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008044 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008045 if (len != PyList_GET_SIZE(tmp)) {
8046 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
8047 goto failed;
8048 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008049 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008050 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008051 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008052 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008053 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
8054 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008055 if (*out == NULL) goto failed;
8056 return 0;
8057 }
Victor Stinner74419f02020-07-03 11:35:37 +02008058 tp = state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008059 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008060 if (isinstance == -1) {
8061 return 1;
8062 }
8063 if (isinstance) {
8064 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01008065 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008066
Victor Stinner74419f02020-07-03 11:35:37 +02008067 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008068 return 1;
8069 }
8070 if (tmp == NULL) {
8071 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
8072 return 1;
8073 }
8074 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008075 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008076 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008077 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008078 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008079 }
Victor Stinner74419f02020-07-03 11:35:37 +02008080 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008081 return 1;
8082 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008083 if (tmp == NULL) {
8084 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
8085 return 1;
8086 }
8087 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008088 int res;
8089 Py_ssize_t len;
8090 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008091 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008092 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 +02008093 goto failed;
8094 }
8095 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008096 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008097 if (generators == NULL) goto failed;
8098 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008099 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008100 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8101 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008102 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008103 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008104 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008105 if (len != PyList_GET_SIZE(tmp)) {
8106 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
8107 goto failed;
8108 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008109 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008110 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008111 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008112 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008113 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
8114 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008115 if (*out == NULL) goto failed;
8116 return 0;
8117 }
Victor Stinner74419f02020-07-03 11:35:37 +02008118 tp = state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008119 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04008120 if (isinstance == -1) {
8121 return 1;
8122 }
8123 if (isinstance) {
8124 expr_ty value;
8125
Victor Stinner74419f02020-07-03 11:35:37 +02008126 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008127 return 1;
8128 }
8129 if (tmp == NULL) {
8130 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
8131 return 1;
8132 }
8133 else {
Yury Selivanov75445082015-05-11 22:57:16 -04008134 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008135 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04008136 if (res != 0) goto failed;
8137 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04008138 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008139 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
8140 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04008141 if (*out == NULL) goto failed;
8142 return 0;
8143 }
Victor Stinner74419f02020-07-03 11:35:37 +02008144 tp = state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008145 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008146 if (isinstance == -1) {
8147 return 1;
8148 }
8149 if (isinstance) {
8150 expr_ty value;
8151
Victor Stinner74419f02020-07-03 11:35:37 +02008152 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008153 return 1;
8154 }
8155 if (tmp == NULL || tmp == Py_None) {
8156 Py_CLEAR(tmp);
8157 value = NULL;
8158 }
8159 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008160 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008161 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008162 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008163 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008164 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008165 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
8166 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008167 if (*out == NULL) goto failed;
8168 return 0;
8169 }
Victor Stinner74419f02020-07-03 11:35:37 +02008170 tp = state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008171 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008172 if (isinstance == -1) {
8173 return 1;
8174 }
8175 if (isinstance) {
8176 expr_ty value;
8177
Victor Stinner74419f02020-07-03 11:35:37 +02008178 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008179 return 1;
8180 }
8181 if (tmp == NULL) {
8182 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
8183 return 1;
8184 }
8185 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008186 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008187 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008188 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008189 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008190 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008191 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
8192 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008193 if (*out == NULL) goto failed;
8194 return 0;
8195 }
Victor Stinner74419f02020-07-03 11:35:37 +02008196 tp = state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008197 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008198 if (isinstance == -1) {
8199 return 1;
8200 }
8201 if (isinstance) {
8202 expr_ty left;
8203 asdl_int_seq* ops;
Pablo Galindoa5634c42020-09-16 19:42:00 +01008204 asdl_expr_seq* comparators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008205
Victor Stinner74419f02020-07-03 11:35:37 +02008206 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008207 return 1;
8208 }
8209 if (tmp == NULL) {
8210 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
8211 return 1;
8212 }
8213 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008214 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008215 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008216 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008217 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008218 }
Victor Stinner74419f02020-07-03 11:35:37 +02008219 if (_PyObject_LookupAttr(obj, state->ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008220 return 1;
8221 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008222 if (tmp == NULL) {
8223 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
8224 return 1;
8225 }
8226 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008227 int res;
8228 Py_ssize_t len;
8229 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008230 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008231 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 +02008232 goto failed;
8233 }
8234 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008235 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008236 if (ops == NULL) goto failed;
8237 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008238 cmpop_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008239 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8240 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008241 res = obj2ast_cmpop(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008242 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008243 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008244 if (len != PyList_GET_SIZE(tmp)) {
8245 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
8246 goto failed;
8247 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008248 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008249 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008250 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008251 }
Victor Stinner74419f02020-07-03 11:35:37 +02008252 if (_PyObject_LookupAttr(obj, state->comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008253 return 1;
8254 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008255 if (tmp == NULL) {
8256 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
8257 return 1;
8258 }
8259 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008260 int res;
8261 Py_ssize_t len;
8262 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008263 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008264 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 +02008265 goto failed;
8266 }
8267 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008268 comparators = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008269 if (comparators == NULL) goto failed;
8270 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008271 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008272 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8273 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008274 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008275 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008276 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008277 if (len != PyList_GET_SIZE(tmp)) {
8278 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
8279 goto failed;
8280 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008281 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008282 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008283 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008284 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008285 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
8286 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008287 if (*out == NULL) goto failed;
8288 return 0;
8289 }
Victor Stinner74419f02020-07-03 11:35:37 +02008290 tp = state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008291 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008292 if (isinstance == -1) {
8293 return 1;
8294 }
8295 if (isinstance) {
8296 expr_ty func;
Pablo Galindoa5634c42020-09-16 19:42:00 +01008297 asdl_expr_seq* args;
8298 asdl_keyword_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008299
Victor Stinner74419f02020-07-03 11:35:37 +02008300 if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008301 return 1;
8302 }
8303 if (tmp == NULL) {
8304 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
8305 return 1;
8306 }
8307 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008308 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008309 res = obj2ast_expr(state, tmp, &func, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008310 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008311 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008312 }
Victor Stinner74419f02020-07-03 11:35:37 +02008313 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008314 return 1;
8315 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008316 if (tmp == NULL) {
8317 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
8318 return 1;
8319 }
8320 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008321 int res;
8322 Py_ssize_t len;
8323 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008324 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008325 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 +02008326 goto failed;
8327 }
8328 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008329 args = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008330 if (args == NULL) goto failed;
8331 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008332 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008333 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8334 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008335 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008336 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008337 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008338 if (len != PyList_GET_SIZE(tmp)) {
8339 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
8340 goto failed;
8341 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008342 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008343 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008344 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008345 }
Victor Stinner74419f02020-07-03 11:35:37 +02008346 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008347 return 1;
8348 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008349 if (tmp == NULL) {
8350 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
8351 return 1;
8352 }
8353 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008354 int res;
8355 Py_ssize_t len;
8356 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008357 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008358 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 +02008359 goto failed;
8360 }
8361 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008362 keywords = _Py_asdl_keyword_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008363 if (keywords == NULL) goto failed;
8364 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008365 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008366 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8367 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008368 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008369 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008370 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008371 if (len != PyList_GET_SIZE(tmp)) {
8372 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
8373 goto failed;
8374 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008375 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008376 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008377 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008378 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008379 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
8380 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008381 if (*out == NULL) goto failed;
8382 return 0;
8383 }
Victor Stinner74419f02020-07-03 11:35:37 +02008384 tp = state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008385 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008386 if (isinstance == -1) {
8387 return 1;
8388 }
8389 if (isinstance) {
8390 expr_ty value;
8391 int conversion;
8392 expr_ty format_spec;
8393
Victor Stinner74419f02020-07-03 11:35:37 +02008394 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008395 return 1;
8396 }
8397 if (tmp == NULL) {
8398 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
8399 return 1;
8400 }
8401 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008402 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008403 res = obj2ast_expr(state, tmp, &value, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008404 if (res != 0) goto failed;
8405 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008406 }
Victor Stinner74419f02020-07-03 11:35:37 +02008407 if (_PyObject_LookupAttr(obj, state->conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008408 return 1;
8409 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008410 if (tmp == NULL || tmp == Py_None) {
8411 Py_CLEAR(tmp);
8412 conversion = 0;
8413 }
8414 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008415 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008416 res = obj2ast_int(state, tmp, &conversion, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008417 if (res != 0) goto failed;
8418 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008419 }
Victor Stinner74419f02020-07-03 11:35:37 +02008420 if (_PyObject_LookupAttr(obj, state->format_spec, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008421 return 1;
8422 }
8423 if (tmp == NULL || tmp == Py_None) {
8424 Py_CLEAR(tmp);
8425 format_spec = NULL;
8426 }
8427 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008428 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008429 res = obj2ast_expr(state, tmp, &format_spec, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008430 if (res != 0) goto failed;
8431 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008432 }
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04008433 *out = FormattedValue(value, conversion, format_spec, lineno,
8434 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008435 if (*out == NULL) goto failed;
8436 return 0;
8437 }
Victor Stinner74419f02020-07-03 11:35:37 +02008438 tp = state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008439 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008440 if (isinstance == -1) {
8441 return 1;
8442 }
8443 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008444 asdl_expr_seq* values;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008445
Victor Stinner74419f02020-07-03 11:35:37 +02008446 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008447 return 1;
8448 }
8449 if (tmp == NULL) {
8450 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
8451 return 1;
8452 }
8453 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008454 int res;
8455 Py_ssize_t len;
8456 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008457 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008458 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 -04008459 goto failed;
8460 }
8461 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008462 values = _Py_asdl_expr_seq_new(len, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008463 if (values == NULL) goto failed;
8464 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008465 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008466 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8467 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008468 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008469 Py_DECREF(tmp2);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008470 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03008471 if (len != PyList_GET_SIZE(tmp)) {
8472 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
8473 goto failed;
8474 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008475 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008476 }
8477 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008478 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008479 *out = JoinedStr(values, lineno, col_offset, end_lineno,
8480 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008481 if (*out == NULL) goto failed;
8482 return 0;
8483 }
Victor Stinner74419f02020-07-03 11:35:37 +02008484 tp = state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008485 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008486 if (isinstance == -1) {
8487 return 1;
8488 }
8489 if (isinstance) {
8490 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008491 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008492
Victor Stinner74419f02020-07-03 11:35:37 +02008493 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008494 return 1;
8495 }
8496 if (tmp == NULL) {
8497 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
8498 return 1;
8499 }
8500 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008501 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008502 res = obj2ast_constant(state, tmp, &value, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008503 if (res != 0) goto failed;
8504 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008505 }
Victor Stinner74419f02020-07-03 11:35:37 +02008506 if (_PyObject_LookupAttr(obj, state->kind, &tmp) < 0) {
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008507 return 1;
8508 }
8509 if (tmp == NULL || tmp == Py_None) {
8510 Py_CLEAR(tmp);
8511 kind = NULL;
8512 }
8513 else {
8514 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008515 res = obj2ast_string(state, tmp, &kind, arena);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008516 if (res != 0) goto failed;
8517 Py_CLEAR(tmp);
8518 }
8519 *out = Constant(value, kind, lineno, col_offset, end_lineno,
8520 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008521 if (*out == NULL) goto failed;
8522 return 0;
8523 }
Victor Stinner74419f02020-07-03 11:35:37 +02008524 tp = state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008525 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008526 if (isinstance == -1) {
8527 return 1;
8528 }
8529 if (isinstance) {
8530 expr_ty value;
8531 identifier attr;
8532 expr_context_ty ctx;
8533
Victor Stinner74419f02020-07-03 11:35:37 +02008534 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008535 return 1;
8536 }
8537 if (tmp == NULL) {
8538 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
8539 return 1;
8540 }
8541 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008542 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008543 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008544 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008545 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008546 }
Victor Stinner74419f02020-07-03 11:35:37 +02008547 if (_PyObject_LookupAttr(obj, state->attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008548 return 1;
8549 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008550 if (tmp == NULL) {
8551 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
8552 return 1;
8553 }
8554 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008555 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008556 res = obj2ast_identifier(state, tmp, &attr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008557 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008558 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008559 }
Victor Stinner74419f02020-07-03 11:35:37 +02008560 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008561 return 1;
8562 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008563 if (tmp == NULL) {
8564 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
8565 return 1;
8566 }
8567 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008568 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008569 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008570 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008571 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008572 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008573 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
8574 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008575 if (*out == NULL) goto failed;
8576 return 0;
8577 }
Victor Stinner74419f02020-07-03 11:35:37 +02008578 tp = state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008579 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008580 if (isinstance == -1) {
8581 return 1;
8582 }
8583 if (isinstance) {
8584 expr_ty value;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008585 expr_ty slice;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008586 expr_context_ty ctx;
8587
Victor Stinner74419f02020-07-03 11:35:37 +02008588 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008589 return 1;
8590 }
8591 if (tmp == NULL) {
8592 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
8593 return 1;
8594 }
8595 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008596 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008597 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008598 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008599 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008600 }
Victor Stinner74419f02020-07-03 11:35:37 +02008601 if (_PyObject_LookupAttr(obj, state->slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008602 return 1;
8603 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008604 if (tmp == NULL) {
8605 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
8606 return 1;
8607 }
8608 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008609 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008610 res = obj2ast_expr(state, tmp, &slice, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008611 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008612 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008613 }
Victor Stinner74419f02020-07-03 11:35:37 +02008614 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008615 return 1;
8616 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008617 if (tmp == NULL) {
8618 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
8619 return 1;
8620 }
8621 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008622 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008623 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008624 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008625 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008626 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008627 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
8628 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008629 if (*out == NULL) goto failed;
8630 return 0;
8631 }
Victor Stinner74419f02020-07-03 11:35:37 +02008632 tp = state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008633 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008634 if (isinstance == -1) {
8635 return 1;
8636 }
8637 if (isinstance) {
8638 expr_ty value;
8639 expr_context_ty ctx;
8640
Victor Stinner74419f02020-07-03 11:35:37 +02008641 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008642 return 1;
8643 }
8644 if (tmp == NULL) {
8645 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
8646 return 1;
8647 }
8648 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008649 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008650 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008651 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008652 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008653 }
Victor Stinner74419f02020-07-03 11:35:37 +02008654 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008655 return 1;
8656 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008657 if (tmp == NULL) {
8658 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
8659 return 1;
8660 }
8661 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008662 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008663 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008664 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008665 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008666 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008667 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
8668 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008669 if (*out == NULL) goto failed;
8670 return 0;
8671 }
Victor Stinner74419f02020-07-03 11:35:37 +02008672 tp = state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008673 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008674 if (isinstance == -1) {
8675 return 1;
8676 }
8677 if (isinstance) {
8678 identifier id;
8679 expr_context_ty ctx;
8680
Victor Stinner74419f02020-07-03 11:35:37 +02008681 if (_PyObject_LookupAttr(obj, state->id, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008682 return 1;
8683 }
8684 if (tmp == NULL) {
8685 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
8686 return 1;
8687 }
8688 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008689 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008690 res = obj2ast_identifier(state, tmp, &id, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008691 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008692 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008693 }
Victor Stinner74419f02020-07-03 11:35:37 +02008694 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008695 return 1;
8696 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008697 if (tmp == NULL) {
8698 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
8699 return 1;
8700 }
8701 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008702 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008703 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008704 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008705 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008706 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008707 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
8708 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008709 if (*out == NULL) goto failed;
8710 return 0;
8711 }
Victor Stinner74419f02020-07-03 11:35:37 +02008712 tp = state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008713 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008714 if (isinstance == -1) {
8715 return 1;
8716 }
8717 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008718 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008719 expr_context_ty ctx;
8720
Victor Stinner74419f02020-07-03 11:35:37 +02008721 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008722 return 1;
8723 }
8724 if (tmp == NULL) {
8725 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
8726 return 1;
8727 }
8728 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008729 int res;
8730 Py_ssize_t len;
8731 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008732 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008733 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 +02008734 goto failed;
8735 }
8736 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008737 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008738 if (elts == NULL) goto failed;
8739 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008740 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008741 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8742 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008743 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008744 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008745 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008746 if (len != PyList_GET_SIZE(tmp)) {
8747 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
8748 goto failed;
8749 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008750 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008751 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008752 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008753 }
Victor Stinner74419f02020-07-03 11:35:37 +02008754 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008755 return 1;
8756 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008757 if (tmp == NULL) {
8758 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
8759 return 1;
8760 }
8761 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008762 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008763 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008764 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008765 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008766 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008767 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8768 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008769 if (*out == NULL) goto failed;
8770 return 0;
8771 }
Victor Stinner74419f02020-07-03 11:35:37 +02008772 tp = state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008773 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008774 if (isinstance == -1) {
8775 return 1;
8776 }
8777 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008778 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008779 expr_context_ty ctx;
8780
Victor Stinner74419f02020-07-03 11:35:37 +02008781 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008782 return 1;
8783 }
8784 if (tmp == NULL) {
8785 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
8786 return 1;
8787 }
8788 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008789 int res;
8790 Py_ssize_t len;
8791 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008792 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008793 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 +02008794 goto failed;
8795 }
8796 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008797 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008798 if (elts == NULL) goto failed;
8799 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008800 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008801 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8802 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008803 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008804 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008805 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008806 if (len != PyList_GET_SIZE(tmp)) {
8807 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
8808 goto failed;
8809 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008810 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008811 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008812 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008813 }
Victor Stinner74419f02020-07-03 11:35:37 +02008814 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008815 return 1;
8816 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008817 if (tmp == NULL) {
8818 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
8819 return 1;
8820 }
8821 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008822 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008823 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008824 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008825 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008826 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008827 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8828 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008829 if (*out == NULL) goto failed;
8830 return 0;
8831 }
Victor Stinner74419f02020-07-03 11:35:37 +02008832 tp = state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008833 isinstance = PyObject_IsInstance(obj, tp);
8834 if (isinstance == -1) {
8835 return 1;
8836 }
8837 if (isinstance) {
8838 expr_ty lower;
8839 expr_ty upper;
8840 expr_ty step;
8841
Victor Stinner74419f02020-07-03 11:35:37 +02008842 if (_PyObject_LookupAttr(obj, state->lower, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008843 return 1;
8844 }
8845 if (tmp == NULL || tmp == Py_None) {
8846 Py_CLEAR(tmp);
8847 lower = NULL;
8848 }
8849 else {
8850 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008851 res = obj2ast_expr(state, tmp, &lower, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008852 if (res != 0) goto failed;
8853 Py_CLEAR(tmp);
8854 }
Victor Stinner74419f02020-07-03 11:35:37 +02008855 if (_PyObject_LookupAttr(obj, state->upper, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008856 return 1;
8857 }
8858 if (tmp == NULL || tmp == Py_None) {
8859 Py_CLEAR(tmp);
8860 upper = NULL;
8861 }
8862 else {
8863 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008864 res = obj2ast_expr(state, tmp, &upper, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008865 if (res != 0) goto failed;
8866 Py_CLEAR(tmp);
8867 }
Victor Stinner74419f02020-07-03 11:35:37 +02008868 if (_PyObject_LookupAttr(obj, state->step, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008869 return 1;
8870 }
8871 if (tmp == NULL || tmp == Py_None) {
8872 Py_CLEAR(tmp);
8873 step = NULL;
8874 }
8875 else {
8876 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008877 res = obj2ast_expr(state, tmp, &step, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008878 if (res != 0) goto failed;
8879 Py_CLEAR(tmp);
8880 }
8881 *out = Slice(lower, upper, step, lineno, col_offset, end_lineno,
8882 end_col_offset, arena);
8883 if (*out == NULL) goto failed;
8884 return 0;
8885 }
Brandt Bucher145bf262021-02-26 14:51:55 -08008886 tp = state->MatchAs_type;
8887 isinstance = PyObject_IsInstance(obj, tp);
8888 if (isinstance == -1) {
8889 return 1;
8890 }
8891 if (isinstance) {
8892 expr_ty pattern;
8893 identifier name;
8894
8895 if (_PyObject_LookupAttr(obj, state->pattern, &tmp) < 0) {
8896 return 1;
8897 }
8898 if (tmp == NULL) {
8899 PyErr_SetString(PyExc_TypeError, "required field \"pattern\" missing from MatchAs");
8900 return 1;
8901 }
8902 else {
8903 int res;
8904 res = obj2ast_expr(state, tmp, &pattern, arena);
8905 if (res != 0) goto failed;
8906 Py_CLEAR(tmp);
8907 }
8908 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
8909 return 1;
8910 }
8911 if (tmp == NULL) {
8912 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from MatchAs");
8913 return 1;
8914 }
8915 else {
8916 int res;
8917 res = obj2ast_identifier(state, tmp, &name, arena);
8918 if (res != 0) goto failed;
8919 Py_CLEAR(tmp);
8920 }
8921 *out = MatchAs(pattern, name, lineno, col_offset, end_lineno,
8922 end_col_offset, arena);
8923 if (*out == NULL) goto failed;
8924 return 0;
8925 }
8926 tp = state->MatchOr_type;
8927 isinstance = PyObject_IsInstance(obj, tp);
8928 if (isinstance == -1) {
8929 return 1;
8930 }
8931 if (isinstance) {
8932 asdl_expr_seq* patterns;
8933
8934 if (_PyObject_LookupAttr(obj, state->patterns, &tmp) < 0) {
8935 return 1;
8936 }
8937 if (tmp == NULL) {
8938 PyErr_SetString(PyExc_TypeError, "required field \"patterns\" missing from MatchOr");
8939 return 1;
8940 }
8941 else {
8942 int res;
8943 Py_ssize_t len;
8944 Py_ssize_t i;
8945 if (!PyList_Check(tmp)) {
8946 PyErr_Format(PyExc_TypeError, "MatchOr field \"patterns\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
8947 goto failed;
8948 }
8949 len = PyList_GET_SIZE(tmp);
8950 patterns = _Py_asdl_expr_seq_new(len, arena);
8951 if (patterns == NULL) goto failed;
8952 for (i = 0; i < len; i++) {
8953 expr_ty val;
8954 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8955 Py_INCREF(tmp2);
8956 res = obj2ast_expr(state, tmp2, &val, arena);
8957 Py_DECREF(tmp2);
8958 if (res != 0) goto failed;
8959 if (len != PyList_GET_SIZE(tmp)) {
8960 PyErr_SetString(PyExc_RuntimeError, "MatchOr field \"patterns\" changed size during iteration");
8961 goto failed;
8962 }
8963 asdl_seq_SET(patterns, i, val);
8964 }
8965 Py_CLEAR(tmp);
8966 }
8967 *out = MatchOr(patterns, lineno, col_offset, end_lineno,
8968 end_col_offset, arena);
8969 if (*out == NULL) goto failed;
8970 return 0;
8971 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008972
8973 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
8974 failed:
8975 Py_XDECREF(tmp);
8976 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008977}
8978
8979int
Victor Stinner5cf47822020-11-02 22:03:28 +01008980obj2ast_expr_context(struct ast_state *state, PyObject* obj, expr_context_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02008981 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008982{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008983 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008984
Victor Stinner74419f02020-07-03 11:35:37 +02008985 isinstance = PyObject_IsInstance(obj, state->Load_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008986 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008987 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008988 }
8989 if (isinstance) {
8990 *out = Load;
8991 return 0;
8992 }
Victor Stinner74419f02020-07-03 11:35:37 +02008993 isinstance = PyObject_IsInstance(obj, state->Store_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008994 if (isinstance == -1) {
8995 return 1;
8996 }
8997 if (isinstance) {
8998 *out = Store;
8999 return 0;
9000 }
Victor Stinner74419f02020-07-03 11:35:37 +02009001 isinstance = PyObject_IsInstance(obj, state->Del_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009002 if (isinstance == -1) {
9003 return 1;
9004 }
9005 if (isinstance) {
9006 *out = Del;
9007 return 0;
9008 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009009
9010 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
9011 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009012}
9013
9014int
Victor Stinner5cf47822020-11-02 22:03:28 +01009015obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02009016 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009017{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009018 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009019
Victor Stinner74419f02020-07-03 11:35:37 +02009020 isinstance = PyObject_IsInstance(obj, state->And_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009021 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009022 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009023 }
9024 if (isinstance) {
9025 *out = And;
9026 return 0;
9027 }
Victor Stinner74419f02020-07-03 11:35:37 +02009028 isinstance = PyObject_IsInstance(obj, state->Or_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009029 if (isinstance == -1) {
9030 return 1;
9031 }
9032 if (isinstance) {
9033 *out = Or;
9034 return 0;
9035 }
9036
9037 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
9038 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009039}
9040
9041int
Victor Stinner5cf47822020-11-02 22:03:28 +01009042obj2ast_operator(struct ast_state *state, PyObject* obj, operator_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02009043 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009044{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009045 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009046
Victor Stinner74419f02020-07-03 11:35:37 +02009047 isinstance = PyObject_IsInstance(obj, state->Add_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009048 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009049 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009050 }
9051 if (isinstance) {
9052 *out = Add;
9053 return 0;
9054 }
Victor Stinner74419f02020-07-03 11:35:37 +02009055 isinstance = PyObject_IsInstance(obj, state->Sub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009056 if (isinstance == -1) {
9057 return 1;
9058 }
9059 if (isinstance) {
9060 *out = Sub;
9061 return 0;
9062 }
Victor Stinner74419f02020-07-03 11:35:37 +02009063 isinstance = PyObject_IsInstance(obj, state->Mult_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009064 if (isinstance == -1) {
9065 return 1;
9066 }
9067 if (isinstance) {
9068 *out = Mult;
9069 return 0;
9070 }
Victor Stinner74419f02020-07-03 11:35:37 +02009071 isinstance = PyObject_IsInstance(obj, state->MatMult_type);
Benjamin Petersond51374e2014-04-09 23:55:56 -04009072 if (isinstance == -1) {
9073 return 1;
9074 }
9075 if (isinstance) {
9076 *out = MatMult;
9077 return 0;
9078 }
Victor Stinner74419f02020-07-03 11:35:37 +02009079 isinstance = PyObject_IsInstance(obj, state->Div_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009080 if (isinstance == -1) {
9081 return 1;
9082 }
9083 if (isinstance) {
9084 *out = Div;
9085 return 0;
9086 }
Victor Stinner74419f02020-07-03 11:35:37 +02009087 isinstance = PyObject_IsInstance(obj, state->Mod_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009088 if (isinstance == -1) {
9089 return 1;
9090 }
9091 if (isinstance) {
9092 *out = Mod;
9093 return 0;
9094 }
Victor Stinner74419f02020-07-03 11:35:37 +02009095 isinstance = PyObject_IsInstance(obj, state->Pow_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009096 if (isinstance == -1) {
9097 return 1;
9098 }
9099 if (isinstance) {
9100 *out = Pow;
9101 return 0;
9102 }
Victor Stinner74419f02020-07-03 11:35:37 +02009103 isinstance = PyObject_IsInstance(obj, state->LShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009104 if (isinstance == -1) {
9105 return 1;
9106 }
9107 if (isinstance) {
9108 *out = LShift;
9109 return 0;
9110 }
Victor Stinner74419f02020-07-03 11:35:37 +02009111 isinstance = PyObject_IsInstance(obj, state->RShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009112 if (isinstance == -1) {
9113 return 1;
9114 }
9115 if (isinstance) {
9116 *out = RShift;
9117 return 0;
9118 }
Victor Stinner74419f02020-07-03 11:35:37 +02009119 isinstance = PyObject_IsInstance(obj, state->BitOr_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009120 if (isinstance == -1) {
9121 return 1;
9122 }
9123 if (isinstance) {
9124 *out = BitOr;
9125 return 0;
9126 }
Victor Stinner74419f02020-07-03 11:35:37 +02009127 isinstance = PyObject_IsInstance(obj, state->BitXor_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009128 if (isinstance == -1) {
9129 return 1;
9130 }
9131 if (isinstance) {
9132 *out = BitXor;
9133 return 0;
9134 }
Victor Stinner74419f02020-07-03 11:35:37 +02009135 isinstance = PyObject_IsInstance(obj, state->BitAnd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009136 if (isinstance == -1) {
9137 return 1;
9138 }
9139 if (isinstance) {
9140 *out = BitAnd;
9141 return 0;
9142 }
Victor Stinner74419f02020-07-03 11:35:37 +02009143 isinstance = PyObject_IsInstance(obj, state->FloorDiv_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009144 if (isinstance == -1) {
9145 return 1;
9146 }
9147 if (isinstance) {
9148 *out = FloorDiv;
9149 return 0;
9150 }
9151
9152 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
9153 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009154}
9155
9156int
Victor Stinner5cf47822020-11-02 22:03:28 +01009157obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty* out,
9158 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009159{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009160 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009161
Victor Stinner74419f02020-07-03 11:35:37 +02009162 isinstance = PyObject_IsInstance(obj, state->Invert_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009163 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009164 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009165 }
9166 if (isinstance) {
9167 *out = Invert;
9168 return 0;
9169 }
Victor Stinner74419f02020-07-03 11:35:37 +02009170 isinstance = PyObject_IsInstance(obj, state->Not_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009171 if (isinstance == -1) {
9172 return 1;
9173 }
9174 if (isinstance) {
9175 *out = Not;
9176 return 0;
9177 }
Victor Stinner74419f02020-07-03 11:35:37 +02009178 isinstance = PyObject_IsInstance(obj, state->UAdd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009179 if (isinstance == -1) {
9180 return 1;
9181 }
9182 if (isinstance) {
9183 *out = UAdd;
9184 return 0;
9185 }
Victor Stinner74419f02020-07-03 11:35:37 +02009186 isinstance = PyObject_IsInstance(obj, state->USub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009187 if (isinstance == -1) {
9188 return 1;
9189 }
9190 if (isinstance) {
9191 *out = USub;
9192 return 0;
9193 }
9194
9195 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
9196 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009197}
9198
9199int
Victor Stinner5cf47822020-11-02 22:03:28 +01009200obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02009201 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009202{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009203 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009204
Victor Stinner74419f02020-07-03 11:35:37 +02009205 isinstance = PyObject_IsInstance(obj, state->Eq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009206 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009207 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009208 }
9209 if (isinstance) {
9210 *out = Eq;
9211 return 0;
9212 }
Victor Stinner74419f02020-07-03 11:35:37 +02009213 isinstance = PyObject_IsInstance(obj, state->NotEq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009214 if (isinstance == -1) {
9215 return 1;
9216 }
9217 if (isinstance) {
9218 *out = NotEq;
9219 return 0;
9220 }
Victor Stinner74419f02020-07-03 11:35:37 +02009221 isinstance = PyObject_IsInstance(obj, state->Lt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009222 if (isinstance == -1) {
9223 return 1;
9224 }
9225 if (isinstance) {
9226 *out = Lt;
9227 return 0;
9228 }
Victor Stinner74419f02020-07-03 11:35:37 +02009229 isinstance = PyObject_IsInstance(obj, state->LtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009230 if (isinstance == -1) {
9231 return 1;
9232 }
9233 if (isinstance) {
9234 *out = LtE;
9235 return 0;
9236 }
Victor Stinner74419f02020-07-03 11:35:37 +02009237 isinstance = PyObject_IsInstance(obj, state->Gt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009238 if (isinstance == -1) {
9239 return 1;
9240 }
9241 if (isinstance) {
9242 *out = Gt;
9243 return 0;
9244 }
Victor Stinner74419f02020-07-03 11:35:37 +02009245 isinstance = PyObject_IsInstance(obj, state->GtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009246 if (isinstance == -1) {
9247 return 1;
9248 }
9249 if (isinstance) {
9250 *out = GtE;
9251 return 0;
9252 }
Victor Stinner74419f02020-07-03 11:35:37 +02009253 isinstance = PyObject_IsInstance(obj, state->Is_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009254 if (isinstance == -1) {
9255 return 1;
9256 }
9257 if (isinstance) {
9258 *out = Is;
9259 return 0;
9260 }
Victor Stinner74419f02020-07-03 11:35:37 +02009261 isinstance = PyObject_IsInstance(obj, state->IsNot_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009262 if (isinstance == -1) {
9263 return 1;
9264 }
9265 if (isinstance) {
9266 *out = IsNot;
9267 return 0;
9268 }
Victor Stinner74419f02020-07-03 11:35:37 +02009269 isinstance = PyObject_IsInstance(obj, state->In_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009270 if (isinstance == -1) {
9271 return 1;
9272 }
9273 if (isinstance) {
9274 *out = In;
9275 return 0;
9276 }
Victor Stinner74419f02020-07-03 11:35:37 +02009277 isinstance = PyObject_IsInstance(obj, state->NotIn_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009278 if (isinstance == -1) {
9279 return 1;
9280 }
9281 if (isinstance) {
9282 *out = NotIn;
9283 return 0;
9284 }
9285
9286 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
9287 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009288}
9289
9290int
Victor Stinner5cf47822020-11-02 22:03:28 +01009291obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02009292 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009293{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009294 PyObject* tmp = NULL;
9295 expr_ty target;
9296 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009297 asdl_expr_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009298 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009299
Victor Stinner74419f02020-07-03 11:35:37 +02009300 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009301 return 1;
9302 }
9303 if (tmp == NULL) {
9304 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
9305 return 1;
9306 }
9307 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009308 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009309 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009310 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009311 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009312 }
Victor Stinner74419f02020-07-03 11:35:37 +02009313 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009314 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009315 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009316 if (tmp == NULL) {
9317 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
9318 return 1;
9319 }
9320 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009321 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009322 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009323 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009324 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009325 }
Victor Stinner74419f02020-07-03 11:35:37 +02009326 if (_PyObject_LookupAttr(obj, state->ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009327 return 1;
9328 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009329 if (tmp == NULL) {
9330 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
9331 return 1;
9332 }
9333 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009334 int res;
9335 Py_ssize_t len;
9336 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009337 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009338 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 +02009339 goto failed;
9340 }
9341 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009342 ifs = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009343 if (ifs == NULL) goto failed;
9344 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009345 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009346 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9347 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009348 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009349 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009350 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009351 if (len != PyList_GET_SIZE(tmp)) {
9352 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
9353 goto failed;
9354 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009355 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009356 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009357 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009358 }
Victor Stinner74419f02020-07-03 11:35:37 +02009359 if (_PyObject_LookupAttr(obj, state->is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009360 return 1;
9361 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009362 if (tmp == NULL) {
9363 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
9364 return 1;
9365 }
9366 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009367 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009368 res = obj2ast_int(state, tmp, &is_async, arena);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009369 if (res != 0) goto failed;
9370 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009371 }
9372 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009373 return 0;
9374failed:
9375 Py_XDECREF(tmp);
9376 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009377}
9378
9379int
Victor Stinner5cf47822020-11-02 22:03:28 +01009380obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02009381 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009382{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009383 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00009384
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009385 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009386 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009387 int lineno;
9388 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009389 int end_lineno;
9390 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009391
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009392 if (obj == Py_None) {
9393 *out = NULL;
9394 return 0;
9395 }
Victor Stinner74419f02020-07-03 11:35:37 +02009396 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009397 return 1;
9398 }
9399 if (tmp == NULL) {
9400 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
9401 return 1;
9402 }
9403 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009404 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009405 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009406 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009407 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009408 }
Victor Stinner74419f02020-07-03 11:35:37 +02009409 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009410 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009411 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009412 if (tmp == NULL) {
9413 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
9414 return 1;
9415 }
9416 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009417 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009418 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009419 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009420 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009421 }
Victor Stinner74419f02020-07-03 11:35:37 +02009422 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009423 return 1;
9424 }
9425 if (tmp == NULL || tmp == Py_None) {
9426 Py_CLEAR(tmp);
9427 end_lineno = 0;
9428 }
9429 else {
9430 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009431 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009432 if (res != 0) goto failed;
9433 Py_CLEAR(tmp);
9434 }
Victor Stinner74419f02020-07-03 11:35:37 +02009435 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009436 return 1;
9437 }
9438 if (tmp == NULL || tmp == Py_None) {
9439 Py_CLEAR(tmp);
9440 end_col_offset = 0;
9441 }
9442 else {
9443 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009444 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009445 if (res != 0) goto failed;
9446 Py_CLEAR(tmp);
9447 }
Victor Stinner74419f02020-07-03 11:35:37 +02009448 tp = state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009449 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009450 if (isinstance == -1) {
9451 return 1;
9452 }
9453 if (isinstance) {
9454 expr_ty type;
9455 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009456 asdl_stmt_seq* body;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009457
Victor Stinner74419f02020-07-03 11:35:37 +02009458 if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009459 return 1;
9460 }
9461 if (tmp == NULL || tmp == Py_None) {
9462 Py_CLEAR(tmp);
9463 type = NULL;
9464 }
9465 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009466 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009467 res = obj2ast_expr(state, tmp, &type, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009468 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009469 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009470 }
Victor Stinner74419f02020-07-03 11:35:37 +02009471 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009472 return 1;
9473 }
9474 if (tmp == NULL || tmp == Py_None) {
9475 Py_CLEAR(tmp);
9476 name = NULL;
9477 }
9478 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009479 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009480 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009481 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009482 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009483 }
Victor Stinner74419f02020-07-03 11:35:37 +02009484 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009485 return 1;
9486 }
9487 if (tmp == NULL) {
9488 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
9489 return 1;
9490 }
9491 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009492 int res;
9493 Py_ssize_t len;
9494 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009495 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009496 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 +02009497 goto failed;
9498 }
9499 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009500 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009501 if (body == NULL) goto failed;
9502 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009503 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009504 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9505 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009506 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009507 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009508 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009509 if (len != PyList_GET_SIZE(tmp)) {
9510 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
9511 goto failed;
9512 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009513 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009514 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009515 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009516 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009517 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
9518 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009519 if (*out == NULL) goto failed;
9520 return 0;
9521 }
9522
9523 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
9524 failed:
9525 Py_XDECREF(tmp);
9526 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009527}
9528
9529int
Victor Stinner5cf47822020-11-02 22:03:28 +01009530obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02009531 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009532{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009533 PyObject* tmp = NULL;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009534 asdl_arg_seq* posonlyargs;
9535 asdl_arg_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009536 arg_ty vararg;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009537 asdl_arg_seq* kwonlyargs;
9538 asdl_expr_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009539 arg_ty kwarg;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009540 asdl_expr_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009541
Victor Stinner74419f02020-07-03 11:35:37 +02009542 if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009543 return 1;
9544 }
9545 if (tmp == NULL) {
9546 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
9547 return 1;
9548 }
9549 else {
9550 int res;
9551 Py_ssize_t len;
9552 Py_ssize_t i;
9553 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009554 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 +01009555 goto failed;
9556 }
9557 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009558 posonlyargs = _Py_asdl_arg_seq_new(len, arena);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009559 if (posonlyargs == NULL) goto failed;
9560 for (i = 0; i < len; i++) {
9561 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009562 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9563 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009564 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009565 Py_DECREF(tmp2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009566 if (res != 0) goto failed;
9567 if (len != PyList_GET_SIZE(tmp)) {
9568 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
9569 goto failed;
9570 }
9571 asdl_seq_SET(posonlyargs, i, val);
9572 }
9573 Py_CLEAR(tmp);
9574 }
Victor Stinner74419f02020-07-03 11:35:37 +02009575 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009576 return 1;
9577 }
9578 if (tmp == NULL) {
9579 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
9580 return 1;
9581 }
9582 else {
9583 int res;
9584 Py_ssize_t len;
9585 Py_ssize_t i;
9586 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009587 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 +02009588 goto failed;
9589 }
9590 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009591 args = _Py_asdl_arg_seq_new(len, arena);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009592 if (args == NULL) goto failed;
9593 for (i = 0; i < len; i++) {
9594 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009595 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9596 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009597 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009598 Py_DECREF(tmp2);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009599 if (res != 0) goto failed;
9600 if (len != PyList_GET_SIZE(tmp)) {
9601 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
9602 goto failed;
9603 }
9604 asdl_seq_SET(args, i, val);
9605 }
9606 Py_CLEAR(tmp);
9607 }
Victor Stinner74419f02020-07-03 11:35:37 +02009608 if (_PyObject_LookupAttr(obj, state->vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009609 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009610 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009611 if (tmp == NULL || tmp == Py_None) {
9612 Py_CLEAR(tmp);
9613 vararg = NULL;
9614 }
9615 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009616 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009617 res = obj2ast_arg(state, tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009618 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009619 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009620 }
Victor Stinner74419f02020-07-03 11:35:37 +02009621 if (_PyObject_LookupAttr(obj, state->kwonlyargs, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009622 return 1;
9623 }
9624 if (tmp == NULL) {
9625 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
9626 return 1;
9627 }
9628 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009629 int res;
9630 Py_ssize_t len;
9631 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009632 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009633 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 +02009634 goto failed;
9635 }
9636 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009637 kwonlyargs = _Py_asdl_arg_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009638 if (kwonlyargs == NULL) goto failed;
9639 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009640 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009641 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9642 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009643 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009644 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009645 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009646 if (len != PyList_GET_SIZE(tmp)) {
9647 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
9648 goto failed;
9649 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009650 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009651 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009652 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009653 }
Victor Stinner74419f02020-07-03 11:35:37 +02009654 if (_PyObject_LookupAttr(obj, state->kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009655 return 1;
9656 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009657 if (tmp == NULL) {
9658 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
9659 return 1;
9660 }
9661 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009662 int res;
9663 Py_ssize_t len;
9664 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009665 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009666 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 +02009667 goto failed;
9668 }
9669 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009670 kw_defaults = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009671 if (kw_defaults == NULL) goto failed;
9672 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009673 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009674 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9675 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009676 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009677 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009678 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009679 if (len != PyList_GET_SIZE(tmp)) {
9680 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
9681 goto failed;
9682 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009683 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009684 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009685 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009686 }
Victor Stinner74419f02020-07-03 11:35:37 +02009687 if (_PyObject_LookupAttr(obj, state->kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009688 return 1;
9689 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009690 if (tmp == NULL || tmp == Py_None) {
9691 Py_CLEAR(tmp);
9692 kwarg = NULL;
9693 }
9694 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009695 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009696 res = obj2ast_arg(state, tmp, &kwarg, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009697 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02009698 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009699 }
Victor Stinner74419f02020-07-03 11:35:37 +02009700 if (_PyObject_LookupAttr(obj, state->defaults, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009701 return 1;
9702 }
9703 if (tmp == NULL) {
9704 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
9705 return 1;
9706 }
9707 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009708 int res;
9709 Py_ssize_t len;
9710 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009711 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009712 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 +02009713 goto failed;
9714 }
9715 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009716 defaults = _Py_asdl_expr_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009717 if (defaults == NULL) goto failed;
9718 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009719 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009720 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9721 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009722 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009723 Py_DECREF(tmp2);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009724 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009725 if (len != PyList_GET_SIZE(tmp)) {
9726 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
9727 goto failed;
9728 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009729 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009730 }
Victor Stinnerb3189902013-07-27 00:04:42 +02009731 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009732 }
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009733 *out = arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg,
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009734 defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009735 return 0;
9736failed:
9737 Py_XDECREF(tmp);
9738 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009739}
9740
9741int
Victor Stinner5cf47822020-11-02 22:03:28 +01009742obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009743{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009744 PyObject* tmp = NULL;
9745 identifier arg;
9746 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009747 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01009748 int lineno;
9749 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009750 int end_lineno;
9751 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009752
Victor Stinner74419f02020-07-03 11:35:37 +02009753 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009754 return 1;
9755 }
9756 if (tmp == NULL) {
9757 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
9758 return 1;
9759 }
9760 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009761 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009762 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009763 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009764 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009765 }
Victor Stinner74419f02020-07-03 11:35:37 +02009766 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009767 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009768 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009769 if (tmp == NULL || tmp == Py_None) {
9770 Py_CLEAR(tmp);
9771 annotation = NULL;
9772 }
9773 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009774 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009775 res = obj2ast_expr(state, tmp, &annotation, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009776 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009777 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009778 }
Victor Stinner74419f02020-07-03 11:35:37 +02009779 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009780 return 1;
9781 }
9782 if (tmp == NULL || tmp == Py_None) {
9783 Py_CLEAR(tmp);
9784 type_comment = NULL;
9785 }
9786 else {
9787 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009788 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009789 if (res != 0) goto failed;
9790 Py_CLEAR(tmp);
9791 }
Victor Stinner74419f02020-07-03 11:35:37 +02009792 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009793 return 1;
9794 }
9795 if (tmp == NULL) {
9796 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
9797 return 1;
9798 }
9799 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009800 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009801 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009802 if (res != 0) goto failed;
9803 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009804 }
Victor Stinner74419f02020-07-03 11:35:37 +02009805 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01009806 return 1;
9807 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009808 if (tmp == NULL) {
9809 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
9810 return 1;
9811 }
9812 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009813 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009814 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009815 if (res != 0) goto failed;
9816 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01009817 }
Victor Stinner74419f02020-07-03 11:35:37 +02009818 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009819 return 1;
9820 }
9821 if (tmp == NULL || tmp == Py_None) {
9822 Py_CLEAR(tmp);
9823 end_lineno = 0;
9824 }
9825 else {
9826 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009827 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009828 if (res != 0) goto failed;
9829 Py_CLEAR(tmp);
9830 }
Victor Stinner74419f02020-07-03 11:35:37 +02009831 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009832 return 1;
9833 }
9834 if (tmp == NULL || tmp == Py_None) {
9835 Py_CLEAR(tmp);
9836 end_col_offset = 0;
9837 }
9838 else {
9839 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009840 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009841 if (res != 0) goto failed;
9842 Py_CLEAR(tmp);
9843 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009844 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
9845 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009846 return 0;
9847failed:
9848 Py_XDECREF(tmp);
9849 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009850}
9851
9852int
Victor Stinner5cf47822020-11-02 22:03:28 +01009853obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out,
9854 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009855{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009856 PyObject* tmp = NULL;
9857 identifier arg;
9858 expr_ty value;
Pablo Galindo168660b2020-04-02 00:47:39 +01009859 int lineno;
9860 int col_offset;
9861 int end_lineno;
9862 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009863
Victor Stinner74419f02020-07-03 11:35:37 +02009864 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009865 return 1;
9866 }
9867 if (tmp == NULL || tmp == Py_None) {
9868 Py_CLEAR(tmp);
9869 arg = NULL;
9870 }
9871 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009872 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009873 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009874 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009875 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009876 }
Victor Stinner74419f02020-07-03 11:35:37 +02009877 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009878 return 1;
9879 }
9880 if (tmp == NULL) {
9881 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
9882 return 1;
9883 }
9884 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009885 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009886 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009887 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009888 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009889 }
Victor Stinner74419f02020-07-03 11:35:37 +02009890 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009891 return 1;
9892 }
9893 if (tmp == NULL) {
9894 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from keyword");
9895 return 1;
9896 }
9897 else {
9898 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009899 res = obj2ast_int(state, tmp, &lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009900 if (res != 0) goto failed;
9901 Py_CLEAR(tmp);
9902 }
Victor Stinner74419f02020-07-03 11:35:37 +02009903 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009904 return 1;
9905 }
9906 if (tmp == NULL) {
9907 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from keyword");
9908 return 1;
9909 }
9910 else {
9911 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009912 res = obj2ast_int(state, tmp, &col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009913 if (res != 0) goto failed;
9914 Py_CLEAR(tmp);
9915 }
Victor Stinner74419f02020-07-03 11:35:37 +02009916 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009917 return 1;
9918 }
9919 if (tmp == NULL || tmp == Py_None) {
9920 Py_CLEAR(tmp);
9921 end_lineno = 0;
9922 }
9923 else {
9924 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009925 res = obj2ast_int(state, tmp, &end_lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009926 if (res != 0) goto failed;
9927 Py_CLEAR(tmp);
9928 }
Victor Stinner74419f02020-07-03 11:35:37 +02009929 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009930 return 1;
9931 }
9932 if (tmp == NULL || tmp == Py_None) {
9933 Py_CLEAR(tmp);
9934 end_col_offset = 0;
9935 }
9936 else {
9937 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009938 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009939 if (res != 0) goto failed;
9940 Py_CLEAR(tmp);
9941 }
9942 *out = keyword(arg, value, lineno, col_offset, end_lineno, end_col_offset,
9943 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009944 return 0;
9945failed:
9946 Py_XDECREF(tmp);
9947 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009948}
9949
9950int
Victor Stinner5cf47822020-11-02 22:03:28 +01009951obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02009952 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009953{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009954 PyObject* tmp = NULL;
9955 identifier name;
9956 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009957
Victor Stinner74419f02020-07-03 11:35:37 +02009958 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009959 return 1;
9960 }
9961 if (tmp == NULL) {
9962 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
9963 return 1;
9964 }
9965 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009966 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009967 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009968 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009969 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009970 }
Victor Stinner74419f02020-07-03 11:35:37 +02009971 if (_PyObject_LookupAttr(obj, state->asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009972 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009973 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009974 if (tmp == NULL || tmp == Py_None) {
9975 Py_CLEAR(tmp);
9976 asname = NULL;
9977 }
9978 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009979 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009980 res = obj2ast_identifier(state, tmp, &asname, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009981 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009982 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009983 }
9984 *out = alias(name, asname, arena);
9985 return 0;
9986failed:
9987 Py_XDECREF(tmp);
9988 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009989}
9990
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009991int
Victor Stinner5cf47822020-11-02 22:03:28 +01009992obj2ast_withitem(struct ast_state *state, PyObject* obj, withitem_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02009993 PyArena* arena)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009994{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009995 PyObject* tmp = NULL;
9996 expr_ty context_expr;
9997 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009998
Victor Stinner74419f02020-07-03 11:35:37 +02009999 if (_PyObject_LookupAttr(obj, state->context_expr, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +020010000 return 1;
10001 }
10002 if (tmp == NULL) {
10003 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
10004 return 1;
10005 }
10006 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +020010007 int res;
Victor Stinner74419f02020-07-03 11:35:37 +020010008 res = obj2ast_expr(state, tmp, &context_expr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +020010009 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +020010010 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +020010011 }
Victor Stinner74419f02020-07-03 11:35:37 +020010012 if (_PyObject_LookupAttr(obj, state->optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -050010013 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +020010014 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +020010015 if (tmp == NULL || tmp == Py_None) {
10016 Py_CLEAR(tmp);
10017 optional_vars = NULL;
10018 }
10019 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +020010020 int res;
Victor Stinner74419f02020-07-03 11:35:37 +020010021 res = obj2ast_expr(state, tmp, &optional_vars, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +020010022 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +020010023 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +020010024 }
10025 *out = withitem(context_expr, optional_vars, arena);
10026 return 0;
10027failed:
10028 Py_XDECREF(tmp);
10029 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -050010030}
10031
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010032int
Brandt Bucher145bf262021-02-26 14:51:55 -080010033obj2ast_match_case(struct ast_state *state, PyObject* obj, match_case_ty* out,
10034 PyArena* arena)
10035{
10036 PyObject* tmp = NULL;
10037 expr_ty pattern;
10038 expr_ty guard;
10039 asdl_stmt_seq* body;
10040
10041 if (_PyObject_LookupAttr(obj, state->pattern, &tmp) < 0) {
10042 return 1;
10043 }
10044 if (tmp == NULL) {
10045 PyErr_SetString(PyExc_TypeError, "required field \"pattern\" missing from match_case");
10046 return 1;
10047 }
10048 else {
10049 int res;
10050 res = obj2ast_expr(state, tmp, &pattern, arena);
10051 if (res != 0) goto failed;
10052 Py_CLEAR(tmp);
10053 }
10054 if (_PyObject_LookupAttr(obj, state->guard, &tmp) < 0) {
10055 return 1;
10056 }
10057 if (tmp == NULL || tmp == Py_None) {
10058 Py_CLEAR(tmp);
10059 guard = NULL;
10060 }
10061 else {
10062 int res;
10063 res = obj2ast_expr(state, tmp, &guard, arena);
10064 if (res != 0) goto failed;
10065 Py_CLEAR(tmp);
10066 }
10067 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
10068 return 1;
10069 }
10070 if (tmp == NULL) {
10071 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from match_case");
10072 return 1;
10073 }
10074 else {
10075 int res;
10076 Py_ssize_t len;
10077 Py_ssize_t i;
10078 if (!PyList_Check(tmp)) {
10079 PyErr_Format(PyExc_TypeError, "match_case field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
10080 goto failed;
10081 }
10082 len = PyList_GET_SIZE(tmp);
10083 body = _Py_asdl_stmt_seq_new(len, arena);
10084 if (body == NULL) goto failed;
10085 for (i = 0; i < len; i++) {
10086 stmt_ty val;
10087 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
10088 Py_INCREF(tmp2);
10089 res = obj2ast_stmt(state, tmp2, &val, arena);
10090 Py_DECREF(tmp2);
10091 if (res != 0) goto failed;
10092 if (len != PyList_GET_SIZE(tmp)) {
10093 PyErr_SetString(PyExc_RuntimeError, "match_case field \"body\" changed size during iteration");
10094 goto failed;
10095 }
10096 asdl_seq_SET(body, i, val);
10097 }
10098 Py_CLEAR(tmp);
10099 }
10100 *out = match_case(pattern, guard, body, arena);
10101 return 0;
10102failed:
10103 Py_XDECREF(tmp);
10104 return 1;
10105}
10106
10107int
Victor Stinner5cf47822020-11-02 22:03:28 +010010108obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty*
10109 out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010110{
10111 int isinstance;
10112
10113 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -070010114 PyObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010115
10116 if (obj == Py_None) {
10117 *out = NULL;
10118 return 0;
10119 }
Victor Stinner74419f02020-07-03 11:35:37 +020010120 tp = state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070010121 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010122 if (isinstance == -1) {
10123 return 1;
10124 }
10125 if (isinstance) {
10126 int lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -070010127 string tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010128
Victor Stinner74419f02020-07-03 11:35:37 +020010129 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010130 return 1;
10131 }
10132 if (tmp == NULL) {
10133 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
10134 return 1;
10135 }
10136 else {
10137 int res;
Victor Stinner74419f02020-07-03 11:35:37 +020010138 res = obj2ast_int(state, tmp, &lineno, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010139 if (res != 0) goto failed;
10140 Py_CLEAR(tmp);
10141 }
Victor Stinner74419f02020-07-03 11:35:37 +020010142 if (_PyObject_LookupAttr(obj, state->tag, &tmp) < 0) {
Michael J. Sullivan933e1502019-05-22 07:54:20 -070010143 return 1;
10144 }
10145 if (tmp == NULL) {
10146 PyErr_SetString(PyExc_TypeError, "required field \"tag\" missing from TypeIgnore");
10147 return 1;
10148 }
10149 else {
10150 int res;
Victor Stinner74419f02020-07-03 11:35:37 +020010151 res = obj2ast_string(state, tmp, &tag, arena);
Michael J. Sullivan933e1502019-05-22 07:54:20 -070010152 if (res != 0) goto failed;
10153 Py_CLEAR(tmp);
10154 }
10155 *out = TypeIgnore(lineno, tag, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -080010156 if (*out == NULL) goto failed;
10157 return 0;
10158 }
10159
10160 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
10161 failed:
10162 Py_XDECREF(tmp);
10163 return 1;
10164}
10165
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010166
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010167static int
10168astmodule_exec(PyObject *m)
Martin v. Löwis577b5b92006-02-27 15:23:19 +000010169{
Victor Stinner5cf47822020-11-02 22:03:28 +010010170 struct ast_state *state = get_ast_state();
10171 if (state == NULL) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010172 return -1;
Victor Stinner91e1bc12020-07-03 14:15:53 +020010173 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010174 if (PyModule_AddObjectRef(m, "AST", state->AST_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010175 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010176 }
Brandt Bucherd2f96672020-02-06 06:45:46 -080010177 if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010178 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010179 }
10180 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010181 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010182 }
10183 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010184 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010185 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010186 if (PyModule_AddObjectRef(m, "mod", state->mod_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010187 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010188 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010189 if (PyModule_AddObjectRef(m, "Module", state->Module_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010190 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010191 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010192 if (PyModule_AddObjectRef(m, "Interactive", state->Interactive_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010193 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010194 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010195 if (PyModule_AddObjectRef(m, "Expression", state->Expression_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010196 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010197 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010198 if (PyModule_AddObjectRef(m, "FunctionType", state->FunctionType_type) < 0)
10199 {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010200 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010201 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010202 if (PyModule_AddObjectRef(m, "stmt", state->stmt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010203 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010204 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010205 if (PyModule_AddObjectRef(m, "FunctionDef", state->FunctionDef_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010206 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010207 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010208 if (PyModule_AddObjectRef(m, "AsyncFunctionDef",
10209 state->AsyncFunctionDef_type) < 0) {
10210 return -1;
10211 }
10212 if (PyModule_AddObjectRef(m, "ClassDef", state->ClassDef_type) < 0) {
10213 return -1;
10214 }
10215 if (PyModule_AddObjectRef(m, "Return", state->Return_type) < 0) {
10216 return -1;
10217 }
10218 if (PyModule_AddObjectRef(m, "Delete", state->Delete_type) < 0) {
10219 return -1;
10220 }
10221 if (PyModule_AddObjectRef(m, "Assign", state->Assign_type) < 0) {
10222 return -1;
10223 }
10224 if (PyModule_AddObjectRef(m, "AugAssign", state->AugAssign_type) < 0) {
10225 return -1;
10226 }
10227 if (PyModule_AddObjectRef(m, "AnnAssign", state->AnnAssign_type) < 0) {
10228 return -1;
10229 }
10230 if (PyModule_AddObjectRef(m, "For", state->For_type) < 0) {
10231 return -1;
10232 }
10233 if (PyModule_AddObjectRef(m, "AsyncFor", state->AsyncFor_type) < 0) {
10234 return -1;
10235 }
10236 if (PyModule_AddObjectRef(m, "While", state->While_type) < 0) {
10237 return -1;
10238 }
10239 if (PyModule_AddObjectRef(m, "If", state->If_type) < 0) {
10240 return -1;
10241 }
10242 if (PyModule_AddObjectRef(m, "With", state->With_type) < 0) {
10243 return -1;
10244 }
10245 if (PyModule_AddObjectRef(m, "AsyncWith", state->AsyncWith_type) < 0) {
10246 return -1;
10247 }
Brandt Bucher145bf262021-02-26 14:51:55 -080010248 if (PyModule_AddObjectRef(m, "Match", state->Match_type) < 0) {
10249 return -1;
10250 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010251 if (PyModule_AddObjectRef(m, "Raise", state->Raise_type) < 0) {
10252 return -1;
10253 }
10254 if (PyModule_AddObjectRef(m, "Try", state->Try_type) < 0) {
10255 return -1;
10256 }
10257 if (PyModule_AddObjectRef(m, "Assert", state->Assert_type) < 0) {
10258 return -1;
10259 }
10260 if (PyModule_AddObjectRef(m, "Import", state->Import_type) < 0) {
10261 return -1;
10262 }
10263 if (PyModule_AddObjectRef(m, "ImportFrom", state->ImportFrom_type) < 0) {
10264 return -1;
10265 }
10266 if (PyModule_AddObjectRef(m, "Global", state->Global_type) < 0) {
10267 return -1;
10268 }
10269 if (PyModule_AddObjectRef(m, "Nonlocal", state->Nonlocal_type) < 0) {
10270 return -1;
10271 }
10272 if (PyModule_AddObjectRef(m, "Expr", state->Expr_type) < 0) {
10273 return -1;
10274 }
10275 if (PyModule_AddObjectRef(m, "Pass", state->Pass_type) < 0) {
10276 return -1;
10277 }
10278 if (PyModule_AddObjectRef(m, "Break", state->Break_type) < 0) {
10279 return -1;
10280 }
10281 if (PyModule_AddObjectRef(m, "Continue", state->Continue_type) < 0) {
10282 return -1;
10283 }
10284 if (PyModule_AddObjectRef(m, "expr", state->expr_type) < 0) {
10285 return -1;
10286 }
10287 if (PyModule_AddObjectRef(m, "BoolOp", state->BoolOp_type) < 0) {
10288 return -1;
10289 }
10290 if (PyModule_AddObjectRef(m, "NamedExpr", state->NamedExpr_type) < 0) {
10291 return -1;
10292 }
10293 if (PyModule_AddObjectRef(m, "BinOp", state->BinOp_type) < 0) {
10294 return -1;
10295 }
10296 if (PyModule_AddObjectRef(m, "UnaryOp", state->UnaryOp_type) < 0) {
10297 return -1;
10298 }
10299 if (PyModule_AddObjectRef(m, "Lambda", state->Lambda_type) < 0) {
10300 return -1;
10301 }
10302 if (PyModule_AddObjectRef(m, "IfExp", state->IfExp_type) < 0) {
10303 return -1;
10304 }
10305 if (PyModule_AddObjectRef(m, "Dict", state->Dict_type) < 0) {
10306 return -1;
10307 }
10308 if (PyModule_AddObjectRef(m, "Set", state->Set_type) < 0) {
10309 return -1;
10310 }
10311 if (PyModule_AddObjectRef(m, "ListComp", state->ListComp_type) < 0) {
10312 return -1;
10313 }
10314 if (PyModule_AddObjectRef(m, "SetComp", state->SetComp_type) < 0) {
10315 return -1;
10316 }
10317 if (PyModule_AddObjectRef(m, "DictComp", state->DictComp_type) < 0) {
10318 return -1;
10319 }
10320 if (PyModule_AddObjectRef(m, "GeneratorExp", state->GeneratorExp_type) < 0)
10321 {
10322 return -1;
10323 }
10324 if (PyModule_AddObjectRef(m, "Await", state->Await_type) < 0) {
10325 return -1;
10326 }
10327 if (PyModule_AddObjectRef(m, "Yield", state->Yield_type) < 0) {
10328 return -1;
10329 }
10330 if (PyModule_AddObjectRef(m, "YieldFrom", state->YieldFrom_type) < 0) {
10331 return -1;
10332 }
10333 if (PyModule_AddObjectRef(m, "Compare", state->Compare_type) < 0) {
10334 return -1;
10335 }
10336 if (PyModule_AddObjectRef(m, "Call", state->Call_type) < 0) {
10337 return -1;
10338 }
10339 if (PyModule_AddObjectRef(m, "FormattedValue", state->FormattedValue_type)
Brandt Bucherd2f96672020-02-06 06:45:46 -080010340 < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010341 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010342 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010343 if (PyModule_AddObjectRef(m, "JoinedStr", state->JoinedStr_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010344 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010345 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010346 if (PyModule_AddObjectRef(m, "Constant", state->Constant_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010347 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010348 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010349 if (PyModule_AddObjectRef(m, "Attribute", state->Attribute_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010350 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010351 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010352 if (PyModule_AddObjectRef(m, "Subscript", state->Subscript_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010353 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010354 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010355 if (PyModule_AddObjectRef(m, "Starred", state->Starred_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010356 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010357 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010358 if (PyModule_AddObjectRef(m, "Name", state->Name_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010359 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010360 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010361 if (PyModule_AddObjectRef(m, "List", state->List_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010362 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010363 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010364 if (PyModule_AddObjectRef(m, "Tuple", state->Tuple_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010365 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010366 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010367 if (PyModule_AddObjectRef(m, "Slice", state->Slice_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010368 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010369 }
Brandt Bucher145bf262021-02-26 14:51:55 -080010370 if (PyModule_AddObjectRef(m, "MatchAs", state->MatchAs_type) < 0) {
10371 return -1;
10372 }
10373 if (PyModule_AddObjectRef(m, "MatchOr", state->MatchOr_type) < 0) {
10374 return -1;
10375 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010376 if (PyModule_AddObjectRef(m, "expr_context", state->expr_context_type) < 0)
10377 {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010378 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010379 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010380 if (PyModule_AddObjectRef(m, "Load", state->Load_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010381 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010382 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010383 if (PyModule_AddObjectRef(m, "Store", state->Store_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010384 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010385 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010386 if (PyModule_AddObjectRef(m, "Del", state->Del_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010387 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010388 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010389 if (PyModule_AddObjectRef(m, "boolop", state->boolop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010390 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010391 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010392 if (PyModule_AddObjectRef(m, "And", state->And_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010393 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010394 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010395 if (PyModule_AddObjectRef(m, "Or", state->Or_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010396 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010397 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010398 if (PyModule_AddObjectRef(m, "operator", state->operator_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010399 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010400 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010401 if (PyModule_AddObjectRef(m, "Add", state->Add_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010402 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010403 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010404 if (PyModule_AddObjectRef(m, "Sub", state->Sub_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010405 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010406 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010407 if (PyModule_AddObjectRef(m, "Mult", state->Mult_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010408 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010409 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010410 if (PyModule_AddObjectRef(m, "MatMult", state->MatMult_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010411 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010412 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010413 if (PyModule_AddObjectRef(m, "Div", state->Div_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010414 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010415 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010416 if (PyModule_AddObjectRef(m, "Mod", state->Mod_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010417 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010418 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010419 if (PyModule_AddObjectRef(m, "Pow", state->Pow_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010420 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010421 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010422 if (PyModule_AddObjectRef(m, "LShift", state->LShift_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010423 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010424 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010425 if (PyModule_AddObjectRef(m, "RShift", state->RShift_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010426 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010427 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010428 if (PyModule_AddObjectRef(m, "BitOr", state->BitOr_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010429 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010430 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010431 if (PyModule_AddObjectRef(m, "BitXor", state->BitXor_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010432 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010433 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010434 if (PyModule_AddObjectRef(m, "BitAnd", state->BitAnd_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010435 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010436 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010437 if (PyModule_AddObjectRef(m, "FloorDiv", state->FloorDiv_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010438 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010439 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010440 if (PyModule_AddObjectRef(m, "unaryop", state->unaryop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010441 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010442 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010443 if (PyModule_AddObjectRef(m, "Invert", state->Invert_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010444 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010445 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010446 if (PyModule_AddObjectRef(m, "Not", state->Not_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010447 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010448 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010449 if (PyModule_AddObjectRef(m, "UAdd", state->UAdd_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010450 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010451 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010452 if (PyModule_AddObjectRef(m, "USub", state->USub_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010453 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010454 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010455 if (PyModule_AddObjectRef(m, "cmpop", state->cmpop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010456 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010457 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010458 if (PyModule_AddObjectRef(m, "Eq", state->Eq_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010459 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010460 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010461 if (PyModule_AddObjectRef(m, "NotEq", state->NotEq_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010462 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010463 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010464 if (PyModule_AddObjectRef(m, "Lt", state->Lt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010465 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010466 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010467 if (PyModule_AddObjectRef(m, "LtE", state->LtE_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010468 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010469 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010470 if (PyModule_AddObjectRef(m, "Gt", state->Gt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010471 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010472 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010473 if (PyModule_AddObjectRef(m, "GtE", state->GtE_type) < 0) {
10474 return -1;
10475 }
10476 if (PyModule_AddObjectRef(m, "Is", state->Is_type) < 0) {
10477 return -1;
10478 }
10479 if (PyModule_AddObjectRef(m, "IsNot", state->IsNot_type) < 0) {
10480 return -1;
10481 }
10482 if (PyModule_AddObjectRef(m, "In", state->In_type) < 0) {
10483 return -1;
10484 }
10485 if (PyModule_AddObjectRef(m, "NotIn", state->NotIn_type) < 0) {
10486 return -1;
10487 }
10488 if (PyModule_AddObjectRef(m, "comprehension", state->comprehension_type) <
Brandt Bucherd2f96672020-02-06 06:45:46 -080010489 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010490 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010491 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010492 if (PyModule_AddObjectRef(m, "excepthandler", state->excepthandler_type) <
10493 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010494 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010495 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010496 if (PyModule_AddObjectRef(m, "ExceptHandler", state->ExceptHandler_type) <
10497 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010498 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010499 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010500 if (PyModule_AddObjectRef(m, "arguments", state->arguments_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010501 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010502 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010503 if (PyModule_AddObjectRef(m, "arg", state->arg_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010504 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010505 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010506 if (PyModule_AddObjectRef(m, "keyword", state->keyword_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010507 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010508 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010509 if (PyModule_AddObjectRef(m, "alias", state->alias_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010510 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010511 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010512 if (PyModule_AddObjectRef(m, "withitem", state->withitem_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010513 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010514 }
Brandt Bucher145bf262021-02-26 14:51:55 -080010515 if (PyModule_AddObjectRef(m, "match_case", state->match_case_type) < 0) {
10516 return -1;
10517 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010518 if (PyModule_AddObjectRef(m, "type_ignore", state->type_ignore_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010519 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010520 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010521 if (PyModule_AddObjectRef(m, "TypeIgnore", state->TypeIgnore_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010522 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010523 }
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010524 return 0;
10525}
Victor Stinner91e1bc12020-07-03 14:15:53 +020010526
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010527static PyModuleDef_Slot astmodule_slots[] = {
10528 {Py_mod_exec, astmodule_exec},
10529 {0, NULL}
10530};
10531
10532static struct PyModuleDef _astmodule = {
10533 PyModuleDef_HEAD_INIT,
10534 .m_name = "_ast",
Victor Stinner5cf47822020-11-02 22:03:28 +010010535 // The _ast module uses a per-interpreter state (PyInterpreterState.ast)
Victor Stinnere5fbe0c2020-09-15 18:03:34 +020010536 .m_size = 0,
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010537 .m_slots = astmodule_slots,
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010538};
10539
10540PyMODINIT_FUNC
10541PyInit__ast(void)
10542{
10543 return PyModuleDef_Init(&_astmodule);
Martin v. Löwis577b5b92006-02-27 15:23:19 +000010544}
10545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010546
Martin v. Löwisbd260da2006-02-26 19:42:26 +000010547PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010548{
Victor Stinner5cf47822020-11-02 22:03:28 +010010549 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010550 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010551 return NULL;
Victor Stinner91e1bc12020-07-03 14:15:53 +020010552 }
Victor Stinner74419f02020-07-03 11:35:37 +020010553 return ast2obj_mod(state, t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010554}
Martin v. Löwis5b222132007-06-10 09:51:05 +000010555
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010556/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
10557mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010558{
Serhiy Storchaka43c97312019-09-10 13:02:30 +030010559 const char * const req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010560 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010561
Steve Dowerb82e17e2019-05-23 08:45:22 -070010562 if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
10563 return NULL;
10564 }
10565
Victor Stinner5cf47822020-11-02 22:03:28 +010010566 struct ast_state *state = get_ast_state();
10567 if (state == NULL) {
10568 return NULL;
10569 }
10570
Victor Stinner74419f02020-07-03 11:35:37 +020010571 PyObject *req_type[3];
10572 req_type[0] = state->Module_type;
10573 req_type[1] = state->Expression_type;
10574 req_type[2] = state->Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010575
Guido van Rossum3a32e3b2019-02-01 11:37:34 -080010576 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010577
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010578 isinstance = PyObject_IsInstance(ast, req_type[mode]);
10579 if (isinstance == -1)
10580 return NULL;
10581 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010582 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
Dino Viehlandac46eb42019-09-11 10:16:34 -070010583 req_name[mode], _PyType_Name(Py_TYPE(ast)));
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010584 return NULL;
10585 }
Dong-hee Naa05fcd32019-10-10 16:41:26 +090010586
10587 mod_ty res = NULL;
Victor Stinner74419f02020-07-03 11:35:37 +020010588 if (obj2ast_mod(state, ast, &res, arena) != 0)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010589 return NULL;
10590 else
10591 return res;
10592}
10593
10594int PyAST_Check(PyObject* obj)
10595{
Victor Stinner5cf47822020-11-02 22:03:28 +010010596 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010597 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010598 return -1;
Victor Stinner91e1bc12020-07-03 14:15:53 +020010599 }
Victor Stinner74419f02020-07-03 11:35:37 +020010600 return PyObject_IsInstance(obj, state->AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010601}
10602
Martin v. Löwis5b222132007-06-10 09:51:05 +000010603