blob: 396a6832702b35e94b512f5ecd06db148c2a20e0 [file] [log] [blame]
Thomas Wouterscf297e42007-02-23 15:07:44 +00001/* File automatically generated by Parser/asdl_c.py. */
2
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07003#include <stddef.h>
4
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005#include "Python.h"
6#include "Python-ast.h"
Victor Stinner4a21e572020-04-15 02:35:41 +02007#include "structmember.h" // PyMemberDef
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008
Dino Viehlandac46eb42019-09-11 10:16:34 -07009typedef struct {
10 int initialized;
11 PyObject *AST_type;
12 PyObject *Add_singleton;
13 PyObject *Add_type;
14 PyObject *And_singleton;
15 PyObject *And_type;
16 PyObject *AnnAssign_type;
17 PyObject *Assert_type;
18 PyObject *Assign_type;
19 PyObject *AsyncFor_type;
20 PyObject *AsyncFunctionDef_type;
21 PyObject *AsyncWith_type;
22 PyObject *Attribute_type;
23 PyObject *AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070024 PyObject *Await_type;
25 PyObject *BinOp_type;
26 PyObject *BitAnd_singleton;
27 PyObject *BitAnd_type;
28 PyObject *BitOr_singleton;
29 PyObject *BitOr_type;
30 PyObject *BitXor_singleton;
31 PyObject *BitXor_type;
32 PyObject *BoolOp_type;
33 PyObject *Break_type;
34 PyObject *Call_type;
35 PyObject *ClassDef_type;
36 PyObject *Compare_type;
37 PyObject *Constant_type;
38 PyObject *Continue_type;
39 PyObject *Del_singleton;
40 PyObject *Del_type;
41 PyObject *Delete_type;
42 PyObject *DictComp_type;
43 PyObject *Dict_type;
44 PyObject *Div_singleton;
45 PyObject *Div_type;
46 PyObject *Eq_singleton;
47 PyObject *Eq_type;
48 PyObject *ExceptHandler_type;
49 PyObject *Expr_type;
50 PyObject *Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070051 PyObject *FloorDiv_singleton;
52 PyObject *FloorDiv_type;
53 PyObject *For_type;
54 PyObject *FormattedValue_type;
55 PyObject *FunctionDef_type;
56 PyObject *FunctionType_type;
57 PyObject *GeneratorExp_type;
58 PyObject *Global_type;
59 PyObject *GtE_singleton;
60 PyObject *GtE_type;
61 PyObject *Gt_singleton;
62 PyObject *Gt_type;
63 PyObject *IfExp_type;
64 PyObject *If_type;
65 PyObject *ImportFrom_type;
66 PyObject *Import_type;
67 PyObject *In_singleton;
68 PyObject *In_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070069 PyObject *Interactive_type;
70 PyObject *Invert_singleton;
71 PyObject *Invert_type;
72 PyObject *IsNot_singleton;
73 PyObject *IsNot_type;
74 PyObject *Is_singleton;
75 PyObject *Is_type;
76 PyObject *JoinedStr_type;
77 PyObject *LShift_singleton;
78 PyObject *LShift_type;
79 PyObject *Lambda_type;
80 PyObject *ListComp_type;
81 PyObject *List_type;
82 PyObject *Load_singleton;
83 PyObject *Load_type;
84 PyObject *LtE_singleton;
85 PyObject *LtE_type;
86 PyObject *Lt_singleton;
87 PyObject *Lt_type;
88 PyObject *MatMult_singleton;
89 PyObject *MatMult_type;
90 PyObject *Mod_singleton;
91 PyObject *Mod_type;
92 PyObject *Module_type;
93 PyObject *Mult_singleton;
94 PyObject *Mult_type;
95 PyObject *Name_type;
96 PyObject *NamedExpr_type;
97 PyObject *Nonlocal_type;
98 PyObject *NotEq_singleton;
99 PyObject *NotEq_type;
100 PyObject *NotIn_singleton;
101 PyObject *NotIn_type;
102 PyObject *Not_singleton;
103 PyObject *Not_type;
104 PyObject *Or_singleton;
105 PyObject *Or_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700106 PyObject *Pass_type;
107 PyObject *Pow_singleton;
108 PyObject *Pow_type;
109 PyObject *RShift_singleton;
110 PyObject *RShift_type;
111 PyObject *Raise_type;
112 PyObject *Return_type;
113 PyObject *SetComp_type;
114 PyObject *Set_type;
115 PyObject *Slice_type;
116 PyObject *Starred_type;
117 PyObject *Store_singleton;
118 PyObject *Store_type;
119 PyObject *Sub_singleton;
120 PyObject *Sub_type;
121 PyObject *Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700122 PyObject *Try_type;
123 PyObject *Tuple_type;
124 PyObject *TypeIgnore_type;
125 PyObject *UAdd_singleton;
126 PyObject *UAdd_type;
127 PyObject *USub_singleton;
128 PyObject *USub_type;
129 PyObject *UnaryOp_type;
130 PyObject *While_type;
131 PyObject *With_type;
132 PyObject *YieldFrom_type;
133 PyObject *Yield_type;
134 PyObject *__dict__;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300135 PyObject *__doc__;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700136 PyObject *__module__;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700137 PyObject *_attributes;
138 PyObject *_fields;
139 PyObject *alias_type;
140 PyObject *annotation;
141 PyObject *arg;
142 PyObject *arg_type;
143 PyObject *args;
144 PyObject *argtypes;
145 PyObject *arguments_type;
146 PyObject *asname;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200147 PyObject *ast;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700148 PyObject *attr;
149 PyObject *bases;
150 PyObject *body;
151 PyObject *boolop_type;
152 PyObject *cause;
153 PyObject *cmpop_type;
154 PyObject *col_offset;
155 PyObject *comparators;
156 PyObject *comprehension_type;
157 PyObject *context_expr;
158 PyObject *conversion;
159 PyObject *ctx;
160 PyObject *decorator_list;
161 PyObject *defaults;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700162 PyObject *elt;
163 PyObject *elts;
164 PyObject *end_col_offset;
165 PyObject *end_lineno;
166 PyObject *exc;
167 PyObject *excepthandler_type;
168 PyObject *expr_context_type;
169 PyObject *expr_type;
170 PyObject *finalbody;
171 PyObject *format_spec;
172 PyObject *func;
173 PyObject *generators;
174 PyObject *handlers;
175 PyObject *id;
176 PyObject *ifs;
177 PyObject *is_async;
178 PyObject *items;
179 PyObject *iter;
180 PyObject *key;
181 PyObject *keys;
182 PyObject *keyword_type;
183 PyObject *keywords;
184 PyObject *kind;
185 PyObject *kw_defaults;
186 PyObject *kwarg;
187 PyObject *kwonlyargs;
188 PyObject *left;
189 PyObject *level;
190 PyObject *lineno;
191 PyObject *lower;
192 PyObject *mod_type;
193 PyObject *module;
194 PyObject *msg;
195 PyObject *name;
196 PyObject *names;
197 PyObject *op;
198 PyObject *operand;
199 PyObject *operator_type;
200 PyObject *ops;
201 PyObject *optional_vars;
202 PyObject *orelse;
203 PyObject *posonlyargs;
204 PyObject *returns;
205 PyObject *right;
206 PyObject *simple;
207 PyObject *slice;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700208 PyObject *step;
209 PyObject *stmt_type;
210 PyObject *tag;
211 PyObject *target;
212 PyObject *targets;
213 PyObject *test;
214 PyObject *type;
215 PyObject *type_comment;
216 PyObject *type_ignore_type;
217 PyObject *type_ignores;
218 PyObject *unaryop_type;
219 PyObject *upper;
220 PyObject *value;
221 PyObject *values;
222 PyObject *vararg;
223 PyObject *withitem_type;
224} astmodulestate;
225
226
Victor Stinnerd2bea262020-08-10 15:55:54 +0200227static astmodulestate*
228get_ast_state(PyObject *module)
Victor Stinnerf8599272020-07-03 16:57:19 +0200229{
Victor Stinnerd2bea262020-08-10 15:55:54 +0200230 void *state = PyModule_GetState(module);
231 assert(state != NULL);
232 return (astmodulestate*)state;
233}
234
235static astmodulestate*
236get_global_ast_state(void)
237{
238 _Py_IDENTIFIER(_ast);
239 PyObject *name = _PyUnicode_FromId(&PyId__ast); // borrowed reference
240 if (name == NULL) {
241 return NULL;
242 }
243 PyObject *module = PyImport_GetModule(name);
244 if (module == NULL) {
245 if (PyErr_Occurred()) {
246 return NULL;
247 }
248 module = PyImport_Import(name);
249 if (module == NULL) {
250 return NULL;
251 }
252 }
253 astmodulestate *state = get_ast_state(module);
254 Py_DECREF(module);
255 return state;
Victor Stinnerf8599272020-07-03 16:57:19 +0200256}
Dino Viehlandac46eb42019-09-11 10:16:34 -0700257
258static int astmodule_clear(PyObject *module)
259{
Victor Stinnerf8599272020-07-03 16:57:19 +0200260 astmodulestate *state = get_ast_state(module);
261 Py_CLEAR(state->AST_type);
262 Py_CLEAR(state->Add_singleton);
263 Py_CLEAR(state->Add_type);
264 Py_CLEAR(state->And_singleton);
265 Py_CLEAR(state->And_type);
266 Py_CLEAR(state->AnnAssign_type);
267 Py_CLEAR(state->Assert_type);
268 Py_CLEAR(state->Assign_type);
269 Py_CLEAR(state->AsyncFor_type);
270 Py_CLEAR(state->AsyncFunctionDef_type);
271 Py_CLEAR(state->AsyncWith_type);
272 Py_CLEAR(state->Attribute_type);
273 Py_CLEAR(state->AugAssign_type);
274 Py_CLEAR(state->Await_type);
275 Py_CLEAR(state->BinOp_type);
276 Py_CLEAR(state->BitAnd_singleton);
277 Py_CLEAR(state->BitAnd_type);
278 Py_CLEAR(state->BitOr_singleton);
279 Py_CLEAR(state->BitOr_type);
280 Py_CLEAR(state->BitXor_singleton);
281 Py_CLEAR(state->BitXor_type);
282 Py_CLEAR(state->BoolOp_type);
283 Py_CLEAR(state->Break_type);
284 Py_CLEAR(state->Call_type);
285 Py_CLEAR(state->ClassDef_type);
286 Py_CLEAR(state->Compare_type);
287 Py_CLEAR(state->Constant_type);
288 Py_CLEAR(state->Continue_type);
289 Py_CLEAR(state->Del_singleton);
290 Py_CLEAR(state->Del_type);
291 Py_CLEAR(state->Delete_type);
292 Py_CLEAR(state->DictComp_type);
293 Py_CLEAR(state->Dict_type);
294 Py_CLEAR(state->Div_singleton);
295 Py_CLEAR(state->Div_type);
296 Py_CLEAR(state->Eq_singleton);
297 Py_CLEAR(state->Eq_type);
298 Py_CLEAR(state->ExceptHandler_type);
299 Py_CLEAR(state->Expr_type);
300 Py_CLEAR(state->Expression_type);
301 Py_CLEAR(state->FloorDiv_singleton);
302 Py_CLEAR(state->FloorDiv_type);
303 Py_CLEAR(state->For_type);
304 Py_CLEAR(state->FormattedValue_type);
305 Py_CLEAR(state->FunctionDef_type);
306 Py_CLEAR(state->FunctionType_type);
307 Py_CLEAR(state->GeneratorExp_type);
308 Py_CLEAR(state->Global_type);
309 Py_CLEAR(state->GtE_singleton);
310 Py_CLEAR(state->GtE_type);
311 Py_CLEAR(state->Gt_singleton);
312 Py_CLEAR(state->Gt_type);
313 Py_CLEAR(state->IfExp_type);
314 Py_CLEAR(state->If_type);
315 Py_CLEAR(state->ImportFrom_type);
316 Py_CLEAR(state->Import_type);
317 Py_CLEAR(state->In_singleton);
318 Py_CLEAR(state->In_type);
319 Py_CLEAR(state->Interactive_type);
320 Py_CLEAR(state->Invert_singleton);
321 Py_CLEAR(state->Invert_type);
322 Py_CLEAR(state->IsNot_singleton);
323 Py_CLEAR(state->IsNot_type);
324 Py_CLEAR(state->Is_singleton);
325 Py_CLEAR(state->Is_type);
326 Py_CLEAR(state->JoinedStr_type);
327 Py_CLEAR(state->LShift_singleton);
328 Py_CLEAR(state->LShift_type);
329 Py_CLEAR(state->Lambda_type);
330 Py_CLEAR(state->ListComp_type);
331 Py_CLEAR(state->List_type);
332 Py_CLEAR(state->Load_singleton);
333 Py_CLEAR(state->Load_type);
334 Py_CLEAR(state->LtE_singleton);
335 Py_CLEAR(state->LtE_type);
336 Py_CLEAR(state->Lt_singleton);
337 Py_CLEAR(state->Lt_type);
338 Py_CLEAR(state->MatMult_singleton);
339 Py_CLEAR(state->MatMult_type);
340 Py_CLEAR(state->Mod_singleton);
341 Py_CLEAR(state->Mod_type);
342 Py_CLEAR(state->Module_type);
343 Py_CLEAR(state->Mult_singleton);
344 Py_CLEAR(state->Mult_type);
345 Py_CLEAR(state->Name_type);
346 Py_CLEAR(state->NamedExpr_type);
347 Py_CLEAR(state->Nonlocal_type);
348 Py_CLEAR(state->NotEq_singleton);
349 Py_CLEAR(state->NotEq_type);
350 Py_CLEAR(state->NotIn_singleton);
351 Py_CLEAR(state->NotIn_type);
352 Py_CLEAR(state->Not_singleton);
353 Py_CLEAR(state->Not_type);
354 Py_CLEAR(state->Or_singleton);
355 Py_CLEAR(state->Or_type);
356 Py_CLEAR(state->Pass_type);
357 Py_CLEAR(state->Pow_singleton);
358 Py_CLEAR(state->Pow_type);
359 Py_CLEAR(state->RShift_singleton);
360 Py_CLEAR(state->RShift_type);
361 Py_CLEAR(state->Raise_type);
362 Py_CLEAR(state->Return_type);
363 Py_CLEAR(state->SetComp_type);
364 Py_CLEAR(state->Set_type);
365 Py_CLEAR(state->Slice_type);
366 Py_CLEAR(state->Starred_type);
367 Py_CLEAR(state->Store_singleton);
368 Py_CLEAR(state->Store_type);
369 Py_CLEAR(state->Sub_singleton);
370 Py_CLEAR(state->Sub_type);
371 Py_CLEAR(state->Subscript_type);
372 Py_CLEAR(state->Try_type);
373 Py_CLEAR(state->Tuple_type);
374 Py_CLEAR(state->TypeIgnore_type);
375 Py_CLEAR(state->UAdd_singleton);
376 Py_CLEAR(state->UAdd_type);
377 Py_CLEAR(state->USub_singleton);
378 Py_CLEAR(state->USub_type);
379 Py_CLEAR(state->UnaryOp_type);
380 Py_CLEAR(state->While_type);
381 Py_CLEAR(state->With_type);
382 Py_CLEAR(state->YieldFrom_type);
383 Py_CLEAR(state->Yield_type);
384 Py_CLEAR(state->__dict__);
385 Py_CLEAR(state->__doc__);
386 Py_CLEAR(state->__module__);
387 Py_CLEAR(state->_attributes);
388 Py_CLEAR(state->_fields);
389 Py_CLEAR(state->alias_type);
390 Py_CLEAR(state->annotation);
391 Py_CLEAR(state->arg);
392 Py_CLEAR(state->arg_type);
393 Py_CLEAR(state->args);
394 Py_CLEAR(state->argtypes);
395 Py_CLEAR(state->arguments_type);
396 Py_CLEAR(state->asname);
397 Py_CLEAR(state->ast);
398 Py_CLEAR(state->attr);
399 Py_CLEAR(state->bases);
400 Py_CLEAR(state->body);
401 Py_CLEAR(state->boolop_type);
402 Py_CLEAR(state->cause);
403 Py_CLEAR(state->cmpop_type);
404 Py_CLEAR(state->col_offset);
405 Py_CLEAR(state->comparators);
406 Py_CLEAR(state->comprehension_type);
407 Py_CLEAR(state->context_expr);
408 Py_CLEAR(state->conversion);
409 Py_CLEAR(state->ctx);
410 Py_CLEAR(state->decorator_list);
411 Py_CLEAR(state->defaults);
412 Py_CLEAR(state->elt);
413 Py_CLEAR(state->elts);
414 Py_CLEAR(state->end_col_offset);
415 Py_CLEAR(state->end_lineno);
416 Py_CLEAR(state->exc);
417 Py_CLEAR(state->excepthandler_type);
418 Py_CLEAR(state->expr_context_type);
419 Py_CLEAR(state->expr_type);
420 Py_CLEAR(state->finalbody);
421 Py_CLEAR(state->format_spec);
422 Py_CLEAR(state->func);
423 Py_CLEAR(state->generators);
424 Py_CLEAR(state->handlers);
425 Py_CLEAR(state->id);
426 Py_CLEAR(state->ifs);
427 Py_CLEAR(state->is_async);
428 Py_CLEAR(state->items);
429 Py_CLEAR(state->iter);
430 Py_CLEAR(state->key);
431 Py_CLEAR(state->keys);
432 Py_CLEAR(state->keyword_type);
433 Py_CLEAR(state->keywords);
434 Py_CLEAR(state->kind);
435 Py_CLEAR(state->kw_defaults);
436 Py_CLEAR(state->kwarg);
437 Py_CLEAR(state->kwonlyargs);
438 Py_CLEAR(state->left);
439 Py_CLEAR(state->level);
440 Py_CLEAR(state->lineno);
441 Py_CLEAR(state->lower);
442 Py_CLEAR(state->mod_type);
443 Py_CLEAR(state->module);
444 Py_CLEAR(state->msg);
445 Py_CLEAR(state->name);
446 Py_CLEAR(state->names);
447 Py_CLEAR(state->op);
448 Py_CLEAR(state->operand);
449 Py_CLEAR(state->operator_type);
450 Py_CLEAR(state->ops);
451 Py_CLEAR(state->optional_vars);
452 Py_CLEAR(state->orelse);
453 Py_CLEAR(state->posonlyargs);
454 Py_CLEAR(state->returns);
455 Py_CLEAR(state->right);
456 Py_CLEAR(state->simple);
457 Py_CLEAR(state->slice);
458 Py_CLEAR(state->step);
459 Py_CLEAR(state->stmt_type);
460 Py_CLEAR(state->tag);
461 Py_CLEAR(state->target);
462 Py_CLEAR(state->targets);
463 Py_CLEAR(state->test);
464 Py_CLEAR(state->type);
465 Py_CLEAR(state->type_comment);
466 Py_CLEAR(state->type_ignore_type);
467 Py_CLEAR(state->type_ignores);
468 Py_CLEAR(state->unaryop_type);
469 Py_CLEAR(state->upper);
470 Py_CLEAR(state->value);
471 Py_CLEAR(state->values);
472 Py_CLEAR(state->vararg);
473 Py_CLEAR(state->withitem_type);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700474
475 return 0;
476}
477
478static int astmodule_traverse(PyObject *module, visitproc visit, void* arg)
479{
Victor Stinnerf8599272020-07-03 16:57:19 +0200480 astmodulestate *state = get_ast_state(module);
481 Py_VISIT(state->AST_type);
482 Py_VISIT(state->Add_singleton);
483 Py_VISIT(state->Add_type);
484 Py_VISIT(state->And_singleton);
485 Py_VISIT(state->And_type);
486 Py_VISIT(state->AnnAssign_type);
487 Py_VISIT(state->Assert_type);
488 Py_VISIT(state->Assign_type);
489 Py_VISIT(state->AsyncFor_type);
490 Py_VISIT(state->AsyncFunctionDef_type);
491 Py_VISIT(state->AsyncWith_type);
492 Py_VISIT(state->Attribute_type);
493 Py_VISIT(state->AugAssign_type);
494 Py_VISIT(state->Await_type);
495 Py_VISIT(state->BinOp_type);
496 Py_VISIT(state->BitAnd_singleton);
497 Py_VISIT(state->BitAnd_type);
498 Py_VISIT(state->BitOr_singleton);
499 Py_VISIT(state->BitOr_type);
500 Py_VISIT(state->BitXor_singleton);
501 Py_VISIT(state->BitXor_type);
502 Py_VISIT(state->BoolOp_type);
503 Py_VISIT(state->Break_type);
504 Py_VISIT(state->Call_type);
505 Py_VISIT(state->ClassDef_type);
506 Py_VISIT(state->Compare_type);
507 Py_VISIT(state->Constant_type);
508 Py_VISIT(state->Continue_type);
509 Py_VISIT(state->Del_singleton);
510 Py_VISIT(state->Del_type);
511 Py_VISIT(state->Delete_type);
512 Py_VISIT(state->DictComp_type);
513 Py_VISIT(state->Dict_type);
514 Py_VISIT(state->Div_singleton);
515 Py_VISIT(state->Div_type);
516 Py_VISIT(state->Eq_singleton);
517 Py_VISIT(state->Eq_type);
518 Py_VISIT(state->ExceptHandler_type);
519 Py_VISIT(state->Expr_type);
520 Py_VISIT(state->Expression_type);
521 Py_VISIT(state->FloorDiv_singleton);
522 Py_VISIT(state->FloorDiv_type);
523 Py_VISIT(state->For_type);
524 Py_VISIT(state->FormattedValue_type);
525 Py_VISIT(state->FunctionDef_type);
526 Py_VISIT(state->FunctionType_type);
527 Py_VISIT(state->GeneratorExp_type);
528 Py_VISIT(state->Global_type);
529 Py_VISIT(state->GtE_singleton);
530 Py_VISIT(state->GtE_type);
531 Py_VISIT(state->Gt_singleton);
532 Py_VISIT(state->Gt_type);
533 Py_VISIT(state->IfExp_type);
534 Py_VISIT(state->If_type);
535 Py_VISIT(state->ImportFrom_type);
536 Py_VISIT(state->Import_type);
537 Py_VISIT(state->In_singleton);
538 Py_VISIT(state->In_type);
539 Py_VISIT(state->Interactive_type);
540 Py_VISIT(state->Invert_singleton);
541 Py_VISIT(state->Invert_type);
542 Py_VISIT(state->IsNot_singleton);
543 Py_VISIT(state->IsNot_type);
544 Py_VISIT(state->Is_singleton);
545 Py_VISIT(state->Is_type);
546 Py_VISIT(state->JoinedStr_type);
547 Py_VISIT(state->LShift_singleton);
548 Py_VISIT(state->LShift_type);
549 Py_VISIT(state->Lambda_type);
550 Py_VISIT(state->ListComp_type);
551 Py_VISIT(state->List_type);
552 Py_VISIT(state->Load_singleton);
553 Py_VISIT(state->Load_type);
554 Py_VISIT(state->LtE_singleton);
555 Py_VISIT(state->LtE_type);
556 Py_VISIT(state->Lt_singleton);
557 Py_VISIT(state->Lt_type);
558 Py_VISIT(state->MatMult_singleton);
559 Py_VISIT(state->MatMult_type);
560 Py_VISIT(state->Mod_singleton);
561 Py_VISIT(state->Mod_type);
562 Py_VISIT(state->Module_type);
563 Py_VISIT(state->Mult_singleton);
564 Py_VISIT(state->Mult_type);
565 Py_VISIT(state->Name_type);
566 Py_VISIT(state->NamedExpr_type);
567 Py_VISIT(state->Nonlocal_type);
568 Py_VISIT(state->NotEq_singleton);
569 Py_VISIT(state->NotEq_type);
570 Py_VISIT(state->NotIn_singleton);
571 Py_VISIT(state->NotIn_type);
572 Py_VISIT(state->Not_singleton);
573 Py_VISIT(state->Not_type);
574 Py_VISIT(state->Or_singleton);
575 Py_VISIT(state->Or_type);
576 Py_VISIT(state->Pass_type);
577 Py_VISIT(state->Pow_singleton);
578 Py_VISIT(state->Pow_type);
579 Py_VISIT(state->RShift_singleton);
580 Py_VISIT(state->RShift_type);
581 Py_VISIT(state->Raise_type);
582 Py_VISIT(state->Return_type);
583 Py_VISIT(state->SetComp_type);
584 Py_VISIT(state->Set_type);
585 Py_VISIT(state->Slice_type);
586 Py_VISIT(state->Starred_type);
587 Py_VISIT(state->Store_singleton);
588 Py_VISIT(state->Store_type);
589 Py_VISIT(state->Sub_singleton);
590 Py_VISIT(state->Sub_type);
591 Py_VISIT(state->Subscript_type);
592 Py_VISIT(state->Try_type);
593 Py_VISIT(state->Tuple_type);
594 Py_VISIT(state->TypeIgnore_type);
595 Py_VISIT(state->UAdd_singleton);
596 Py_VISIT(state->UAdd_type);
597 Py_VISIT(state->USub_singleton);
598 Py_VISIT(state->USub_type);
599 Py_VISIT(state->UnaryOp_type);
600 Py_VISIT(state->While_type);
601 Py_VISIT(state->With_type);
602 Py_VISIT(state->YieldFrom_type);
603 Py_VISIT(state->Yield_type);
604 Py_VISIT(state->__dict__);
605 Py_VISIT(state->__doc__);
606 Py_VISIT(state->__module__);
607 Py_VISIT(state->_attributes);
608 Py_VISIT(state->_fields);
609 Py_VISIT(state->alias_type);
610 Py_VISIT(state->annotation);
611 Py_VISIT(state->arg);
612 Py_VISIT(state->arg_type);
613 Py_VISIT(state->args);
614 Py_VISIT(state->argtypes);
615 Py_VISIT(state->arguments_type);
616 Py_VISIT(state->asname);
617 Py_VISIT(state->ast);
618 Py_VISIT(state->attr);
619 Py_VISIT(state->bases);
620 Py_VISIT(state->body);
621 Py_VISIT(state->boolop_type);
622 Py_VISIT(state->cause);
623 Py_VISIT(state->cmpop_type);
624 Py_VISIT(state->col_offset);
625 Py_VISIT(state->comparators);
626 Py_VISIT(state->comprehension_type);
627 Py_VISIT(state->context_expr);
628 Py_VISIT(state->conversion);
629 Py_VISIT(state->ctx);
630 Py_VISIT(state->decorator_list);
631 Py_VISIT(state->defaults);
632 Py_VISIT(state->elt);
633 Py_VISIT(state->elts);
634 Py_VISIT(state->end_col_offset);
635 Py_VISIT(state->end_lineno);
636 Py_VISIT(state->exc);
637 Py_VISIT(state->excepthandler_type);
638 Py_VISIT(state->expr_context_type);
639 Py_VISIT(state->expr_type);
640 Py_VISIT(state->finalbody);
641 Py_VISIT(state->format_spec);
642 Py_VISIT(state->func);
643 Py_VISIT(state->generators);
644 Py_VISIT(state->handlers);
645 Py_VISIT(state->id);
646 Py_VISIT(state->ifs);
647 Py_VISIT(state->is_async);
648 Py_VISIT(state->items);
649 Py_VISIT(state->iter);
650 Py_VISIT(state->key);
651 Py_VISIT(state->keys);
652 Py_VISIT(state->keyword_type);
653 Py_VISIT(state->keywords);
654 Py_VISIT(state->kind);
655 Py_VISIT(state->kw_defaults);
656 Py_VISIT(state->kwarg);
657 Py_VISIT(state->kwonlyargs);
658 Py_VISIT(state->left);
659 Py_VISIT(state->level);
660 Py_VISIT(state->lineno);
661 Py_VISIT(state->lower);
662 Py_VISIT(state->mod_type);
663 Py_VISIT(state->module);
664 Py_VISIT(state->msg);
665 Py_VISIT(state->name);
666 Py_VISIT(state->names);
667 Py_VISIT(state->op);
668 Py_VISIT(state->operand);
669 Py_VISIT(state->operator_type);
670 Py_VISIT(state->ops);
671 Py_VISIT(state->optional_vars);
672 Py_VISIT(state->orelse);
673 Py_VISIT(state->posonlyargs);
674 Py_VISIT(state->returns);
675 Py_VISIT(state->right);
676 Py_VISIT(state->simple);
677 Py_VISIT(state->slice);
678 Py_VISIT(state->step);
679 Py_VISIT(state->stmt_type);
680 Py_VISIT(state->tag);
681 Py_VISIT(state->target);
682 Py_VISIT(state->targets);
683 Py_VISIT(state->test);
684 Py_VISIT(state->type);
685 Py_VISIT(state->type_comment);
686 Py_VISIT(state->type_ignore_type);
687 Py_VISIT(state->type_ignores);
688 Py_VISIT(state->unaryop_type);
689 Py_VISIT(state->upper);
690 Py_VISIT(state->value);
691 Py_VISIT(state->values);
692 Py_VISIT(state->vararg);
693 Py_VISIT(state->withitem_type);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700694
695 return 0;
696}
697
698static void astmodule_free(void* module) {
699 astmodule_clear((PyObject*)module);
700}
701
Victor Stinnerf8599272020-07-03 16:57:19 +0200702static int init_identifiers(astmodulestate *state)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700703{
Dino Viehlandac46eb42019-09-11 10:16:34 -0700704 if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300705 if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700706 if ((state->__module__ = PyUnicode_InternFromString("__module__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700707 if ((state->_attributes = PyUnicode_InternFromString("_attributes")) == NULL) return 0;
708 if ((state->_fields = PyUnicode_InternFromString("_fields")) == NULL) return 0;
709 if ((state->annotation = PyUnicode_InternFromString("annotation")) == NULL) return 0;
710 if ((state->arg = PyUnicode_InternFromString("arg")) == NULL) return 0;
711 if ((state->args = PyUnicode_InternFromString("args")) == NULL) return 0;
712 if ((state->argtypes = PyUnicode_InternFromString("argtypes")) == NULL) return 0;
713 if ((state->asname = PyUnicode_InternFromString("asname")) == NULL) return 0;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200714 if ((state->ast = PyUnicode_InternFromString("ast")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700715 if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0;
716 if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0;
717 if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0;
718 if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0;
719 if ((state->col_offset = PyUnicode_InternFromString("col_offset")) == NULL) return 0;
720 if ((state->comparators = PyUnicode_InternFromString("comparators")) == NULL) return 0;
721 if ((state->context_expr = PyUnicode_InternFromString("context_expr")) == NULL) return 0;
722 if ((state->conversion = PyUnicode_InternFromString("conversion")) == NULL) return 0;
723 if ((state->ctx = PyUnicode_InternFromString("ctx")) == NULL) return 0;
724 if ((state->decorator_list = PyUnicode_InternFromString("decorator_list")) == NULL) return 0;
725 if ((state->defaults = PyUnicode_InternFromString("defaults")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700726 if ((state->elt = PyUnicode_InternFromString("elt")) == NULL) return 0;
727 if ((state->elts = PyUnicode_InternFromString("elts")) == NULL) return 0;
728 if ((state->end_col_offset = PyUnicode_InternFromString("end_col_offset")) == NULL) return 0;
729 if ((state->end_lineno = PyUnicode_InternFromString("end_lineno")) == NULL) return 0;
730 if ((state->exc = PyUnicode_InternFromString("exc")) == NULL) return 0;
731 if ((state->finalbody = PyUnicode_InternFromString("finalbody")) == NULL) return 0;
732 if ((state->format_spec = PyUnicode_InternFromString("format_spec")) == NULL) return 0;
733 if ((state->func = PyUnicode_InternFromString("func")) == NULL) return 0;
734 if ((state->generators = PyUnicode_InternFromString("generators")) == NULL) return 0;
735 if ((state->handlers = PyUnicode_InternFromString("handlers")) == NULL) return 0;
736 if ((state->id = PyUnicode_InternFromString("id")) == NULL) return 0;
737 if ((state->ifs = PyUnicode_InternFromString("ifs")) == NULL) return 0;
738 if ((state->is_async = PyUnicode_InternFromString("is_async")) == NULL) return 0;
739 if ((state->items = PyUnicode_InternFromString("items")) == NULL) return 0;
740 if ((state->iter = PyUnicode_InternFromString("iter")) == NULL) return 0;
741 if ((state->key = PyUnicode_InternFromString("key")) == NULL) return 0;
742 if ((state->keys = PyUnicode_InternFromString("keys")) == NULL) return 0;
743 if ((state->keywords = PyUnicode_InternFromString("keywords")) == NULL) return 0;
744 if ((state->kind = PyUnicode_InternFromString("kind")) == NULL) return 0;
745 if ((state->kw_defaults = PyUnicode_InternFromString("kw_defaults")) == NULL) return 0;
746 if ((state->kwarg = PyUnicode_InternFromString("kwarg")) == NULL) return 0;
747 if ((state->kwonlyargs = PyUnicode_InternFromString("kwonlyargs")) == NULL) return 0;
748 if ((state->left = PyUnicode_InternFromString("left")) == NULL) return 0;
749 if ((state->level = PyUnicode_InternFromString("level")) == NULL) return 0;
750 if ((state->lineno = PyUnicode_InternFromString("lineno")) == NULL) return 0;
751 if ((state->lower = PyUnicode_InternFromString("lower")) == NULL) return 0;
752 if ((state->module = PyUnicode_InternFromString("module")) == NULL) return 0;
753 if ((state->msg = PyUnicode_InternFromString("msg")) == NULL) return 0;
754 if ((state->name = PyUnicode_InternFromString("name")) == NULL) return 0;
755 if ((state->names = PyUnicode_InternFromString("names")) == NULL) return 0;
756 if ((state->op = PyUnicode_InternFromString("op")) == NULL) return 0;
757 if ((state->operand = PyUnicode_InternFromString("operand")) == NULL) return 0;
758 if ((state->ops = PyUnicode_InternFromString("ops")) == NULL) return 0;
759 if ((state->optional_vars = PyUnicode_InternFromString("optional_vars")) == NULL) return 0;
760 if ((state->orelse = PyUnicode_InternFromString("orelse")) == NULL) return 0;
761 if ((state->posonlyargs = PyUnicode_InternFromString("posonlyargs")) == NULL) return 0;
762 if ((state->returns = PyUnicode_InternFromString("returns")) == NULL) return 0;
763 if ((state->right = PyUnicode_InternFromString("right")) == NULL) return 0;
764 if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return 0;
765 if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return 0;
766 if ((state->step = PyUnicode_InternFromString("step")) == NULL) return 0;
767 if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return 0;
768 if ((state->target = PyUnicode_InternFromString("target")) == NULL) return 0;
769 if ((state->targets = PyUnicode_InternFromString("targets")) == NULL) return 0;
770 if ((state->test = PyUnicode_InternFromString("test")) == NULL) return 0;
771 if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0;
772 if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0;
773 if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0;
774 if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0;
775 if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0;
776 if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0;
777 if ((state->vararg = PyUnicode_InternFromString("vararg")) == NULL) return 0;
778 return 1;
779};
780
Victor Stinnerf8599272020-07-03 16:57:19 +0200781static PyObject* ast2obj_mod(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300782static const char * const Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200783 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800784 "type_ignores",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000785};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300786static const char * const Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200787 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000788};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300789static const char * const Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200790 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000791};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300792static const char * const FunctionType_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800793 "argtypes",
794 "returns",
795};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300796static const char * const stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200797 "lineno",
798 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000799 "end_lineno",
800 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000801};
Victor Stinnerf8599272020-07-03 16:57:19 +0200802static PyObject* ast2obj_stmt(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300803static const char * const FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200804 "name",
805 "args",
806 "body",
807 "decorator_list",
808 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800809 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000810};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300811static const char * const AsyncFunctionDef_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400812 "name",
813 "args",
814 "body",
815 "decorator_list",
816 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800817 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400818};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300819static const char * const ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200820 "name",
821 "bases",
822 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200823 "body",
824 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000825};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300826static const char * const Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200827 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000828};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300829static const char * const Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200830 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000831};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300832static const char * const Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200833 "targets",
834 "value",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800835 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000836};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300837static const char * const AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200838 "target",
839 "op",
840 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000841};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300842static const char * const AnnAssign_fields[]={
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700843 "target",
844 "annotation",
845 "value",
846 "simple",
847};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300848static const char * const For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200849 "target",
850 "iter",
851 "body",
852 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800853 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000854};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300855static const char * const AsyncFor_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400856 "target",
857 "iter",
858 "body",
859 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800860 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400861};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300862static const char * const While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200863 "test",
864 "body",
865 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000866};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300867static const char * const If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200868 "test",
869 "body",
870 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000871};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300872static const char * const With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200873 "items",
874 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800875 "type_comment",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000876};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300877static const char * const AsyncWith_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400878 "items",
879 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800880 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400881};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300882static const char * const Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200883 "exc",
884 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000885};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300886static const char * const Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200887 "body",
888 "handlers",
889 "orelse",
890 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000891};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300892static const char * const Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200893 "test",
894 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000895};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300896static const char * const Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200897 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000898};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300899static const char * const ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200900 "module",
901 "names",
902 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000903};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300904static const char * const Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200905 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000906};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300907static const char * const Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200908 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000909};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300910static const char * const Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200911 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000912};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300913static const char * const expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200914 "lineno",
915 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000916 "end_lineno",
917 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000918};
Victor Stinnerf8599272020-07-03 16:57:19 +0200919static PyObject* ast2obj_expr(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300920static const char * const BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200921 "op",
922 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000923};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300924static const char * const NamedExpr_fields[]={
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700925 "target",
926 "value",
927};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300928static const char * const BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200929 "left",
930 "op",
931 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000932};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300933static const char * const UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200934 "op",
935 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000936};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300937static const char * const Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200938 "args",
939 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000940};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300941static const char * const IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200942 "test",
943 "body",
944 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000945};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300946static const char * const Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200947 "keys",
948 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000949};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300950static const char * const Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200951 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000952};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300953static const char * const ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200954 "elt",
955 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000956};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300957static const char * const SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200958 "elt",
959 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000960};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300961static const char * const DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200962 "key",
963 "value",
964 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000965};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300966static const char * const GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200967 "elt",
968 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000969};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300970static const char * const Await_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400971 "value",
972};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300973static const char * const Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200974 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500975};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300976static const char * const YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200977 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000978};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300979static const char * const Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200980 "left",
981 "ops",
982 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000983};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300984static const char * const Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200985 "func",
986 "args",
987 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000988};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300989static const char * const FormattedValue_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400990 "value",
991 "conversion",
992 "format_spec",
993};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300994static const char * const JoinedStr_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400995 "values",
996};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300997static const char * const Constant_fields[]={
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100998 "value",
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700999 "kind",
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001000};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001001static const char * const Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001002 "value",
1003 "attr",
1004 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001005};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001006static const char * const Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001007 "value",
1008 "slice",
1009 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001010};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001011static const char * const Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001012 "value",
1013 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +00001014};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001015static const char * const Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001016 "id",
1017 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001018};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001019static const char * const List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001020 "elts",
1021 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001022};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001023static const char * const Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001024 "elts",
1025 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001026};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001027static const char * const Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001028 "lower",
1029 "upper",
1030 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001031};
Victor Stinnerf8599272020-07-03 16:57:19 +02001032static PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty);
1033static PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty);
1034static PyObject* ast2obj_operator(astmodulestate *state, operator_ty);
1035static PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty);
1036static PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty);
1037static PyObject* ast2obj_comprehension(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001038static const char * const comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001039 "target",
1040 "iter",
1041 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001042 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001043};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001044static const char * const excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001045 "lineno",
1046 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001047 "end_lineno",
1048 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +00001049};
Victor Stinnerf8599272020-07-03 16:57:19 +02001050static PyObject* ast2obj_excepthandler(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001051static const char * const ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001052 "type",
1053 "name",
1054 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001055};
Victor Stinnerf8599272020-07-03 16:57:19 +02001056static PyObject* ast2obj_arguments(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001057static const char * const arguments_fields[]={
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001058 "posonlyargs",
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001059 "args",
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001060 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001061 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001062 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +02001063 "kwarg",
1064 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001065};
Victor Stinnerf8599272020-07-03 16:57:19 +02001066static PyObject* ast2obj_arg(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001067static const char * const arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +02001068 "lineno",
1069 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001070 "end_lineno",
1071 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001072};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001073static const char * const arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001074 "arg",
1075 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001076 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +00001077};
Victor Stinnerf8599272020-07-03 16:57:19 +02001078static PyObject* ast2obj_keyword(astmodulestate *state, void*);
Pablo Galindo168660b2020-04-02 00:47:39 +01001079static const char * const keyword_attributes[] = {
1080 "lineno",
1081 "col_offset",
1082 "end_lineno",
1083 "end_col_offset",
1084};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001085static const char * const keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001086 "arg",
1087 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001088};
Victor Stinnerf8599272020-07-03 16:57:19 +02001089static PyObject* ast2obj_alias(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001090static const char * const alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001091 "name",
1092 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001093};
Victor Stinnerf8599272020-07-03 16:57:19 +02001094static PyObject* ast2obj_withitem(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001095static const char * const withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001096 "context_expr",
1097 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001098};
Victor Stinnerf8599272020-07-03 16:57:19 +02001099static PyObject* ast2obj_type_ignore(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001100static const char * const TypeIgnore_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001101 "lineno",
Michael J. Sullivan933e1502019-05-22 07:54:20 -07001102 "tag",
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001103};
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001104
1105
INADA Naokifc489082017-01-25 22:33:43 +09001106
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001107typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +01001108 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001109 PyObject *dict;
1110} AST_object;
1111
Benjamin Peterson1767e022012-03-14 21:50:29 -05001112static void
1113ast_dealloc(AST_object *self)
1114{
INADA Naokia6296d32017-08-24 14:55:17 +09001115 /* bpo-31095: UnTrack is needed before calling any callbacks */
Eddie Elizondo0247e802019-09-14 09:38:17 -04001116 PyTypeObject *tp = Py_TYPE(self);
INADA Naokia6296d32017-08-24 14:55:17 +09001117 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -05001118 Py_CLEAR(self->dict);
Eddie Elizondo0247e802019-09-14 09:38:17 -04001119 freefunc free_func = PyType_GetSlot(tp, Py_tp_free);
1120 assert(free_func != NULL);
1121 free_func(self);
1122 Py_DECREF(tp);
Benjamin Peterson1767e022012-03-14 21:50:29 -05001123}
1124
Neal Norwitz207c9f32008-03-31 04:42:11 +00001125static int
Benjamin Peterson81071762012-07-08 11:03:46 -07001126ast_traverse(AST_object *self, visitproc visit, void *arg)
1127{
Miss Islington (bot)bcbe5c52020-05-28 08:12:23 -07001128 Py_VISIT(Py_TYPE(self));
Benjamin Peterson81071762012-07-08 11:03:46 -07001129 Py_VISIT(self->dict);
1130 return 0;
1131}
1132
Serhiy Storchakaa5c42282018-05-31 07:34:34 +03001133static int
Benjamin Peterson81071762012-07-08 11:03:46 -07001134ast_clear(AST_object *self)
1135{
1136 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +03001137 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -07001138}
1139
1140static int
Neal Norwitz207c9f32008-03-31 04:42:11 +00001141ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
1142{
Victor Stinnerd2bea262020-08-10 15:55:54 +02001143 astmodulestate *state = get_global_ast_state();
1144 if (state == NULL) {
1145 return -1;
1146 }
1147
Neal Norwitz207c9f32008-03-31 04:42:11 +00001148 Py_ssize_t i, numfields = 0;
1149 int res = -1;
1150 PyObject *key, *value, *fields;
Victor Stinnerf8599272020-07-03 16:57:19 +02001151 if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001152 goto cleanup;
1153 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001154 if (fields) {
1155 numfields = PySequence_Size(fields);
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001156 if (numfields == -1) {
Neal Norwitz207c9f32008-03-31 04:42:11 +00001157 goto cleanup;
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001158 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001159 }
INADA Naoki4c78c522017-02-24 02:48:17 +09001160
Neal Norwitz207c9f32008-03-31 04:42:11 +00001161 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +09001162 if (numfields < PyTuple_GET_SIZE(args)) {
1163 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
1164 "%zd positional argument%s",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001165 _PyType_Name(Py_TYPE(self)),
INADA Naoki4c78c522017-02-24 02:48:17 +09001166 numfields, numfields == 1 ? "" : "s");
1167 res = -1;
1168 goto cleanup;
1169 }
1170 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
1171 /* cannot be reached when fields is NULL */
1172 PyObject *name = PySequence_GetItem(fields, i);
1173 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +00001174 res = -1;
1175 goto cleanup;
1176 }
INADA Naoki4c78c522017-02-24 02:48:17 +09001177 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
1178 Py_DECREF(name);
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001179 if (res < 0) {
INADA Naoki4c78c522017-02-24 02:48:17 +09001180 goto cleanup;
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001181 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001182 }
1183 if (kw) {
1184 i = 0; /* needed by PyDict_Next */
1185 while (PyDict_Next(kw, &i, &key, &value)) {
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001186 int contains = PySequence_Contains(fields, key);
1187 if (contains == -1) {
1188 res = -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001189 goto cleanup;
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001190 } else if (contains == 1) {
1191 Py_ssize_t p = PySequence_Index(fields, key);
1192 if (p == -1) {
1193 res = -1;
1194 goto cleanup;
1195 }
1196 if (p < PyTuple_GET_SIZE(args)) {
1197 PyErr_Format(PyExc_TypeError,
1198 "%.400s got multiple values for argument '%U'",
1199 Py_TYPE(self)->tp_name, key);
1200 res = -1;
1201 goto cleanup;
1202 }
1203 }
1204 res = PyObject_SetAttr(self, key, value);
1205 if (res < 0) {
1206 goto cleanup;
1207 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001208 }
1209 }
1210 cleanup:
1211 Py_XDECREF(fields);
1212 return res;
1213}
1214
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001215/* Pickling support */
1216static PyObject *
1217ast_type_reduce(PyObject *self, PyObject *unused)
1218{
Victor Stinnerf8599272020-07-03 16:57:19 +02001219 astmodulestate *state = get_global_ast_state();
Victor Stinnerd2bea262020-08-10 15:55:54 +02001220 if (state == NULL) {
1221 return NULL;
1222 }
1223
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001224 PyObject *dict;
Victor Stinnerf8599272020-07-03 16:57:19 +02001225 if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001226 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001227 }
1228 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001229 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001230 }
1231 return Py_BuildValue("O()", Py_TYPE(self));
1232}
1233
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001234static PyMemberDef ast_type_members[] = {
1235 {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY},
1236 {NULL} /* Sentinel */
1237};
1238
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001239static PyMethodDef ast_type_methods[] = {
1240 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
1241 {NULL}
1242};
1243
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001244static PyGetSetDef ast_type_getsets[] = {
1245 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
1246 {NULL}
1247};
1248
Dino Viehlandac46eb42019-09-11 10:16:34 -07001249static PyType_Slot AST_type_slots[] = {
1250 {Py_tp_dealloc, ast_dealloc},
1251 {Py_tp_getattro, PyObject_GenericGetAttr},
1252 {Py_tp_setattro, PyObject_GenericSetAttr},
1253 {Py_tp_traverse, ast_traverse},
1254 {Py_tp_clear, ast_clear},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001255 {Py_tp_members, ast_type_members},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001256 {Py_tp_methods, ast_type_methods},
1257 {Py_tp_getset, ast_type_getsets},
1258 {Py_tp_init, ast_type_init},
1259 {Py_tp_alloc, PyType_GenericAlloc},
1260 {Py_tp_new, PyType_GenericNew},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001261 {Py_tp_free, PyObject_GC_Del},
1262 {0, 0},
1263};
1264
1265static PyType_Spec AST_type_spec = {
Serhiy Storchakabace59d2020-03-22 20:33:34 +02001266 "ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001267 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +00001268 0,
Dino Viehlandac46eb42019-09-11 10:16:34 -07001269 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1270 AST_type_slots
Neal Norwitz207c9f32008-03-31 04:42:11 +00001271};
1272
Dino Viehlandac46eb42019-09-11 10:16:34 -07001273static PyObject *
Victor Stinnerf8599272020-07-03 16:57:19 +02001274make_type(astmodulestate *state, const char *type, PyObject* base,
1275 const char* const* fields, int num_fields, const char *doc)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001276{
1277 PyObject *fnames, *result;
1278 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001279 fnames = PyTuple_New(num_fields);
1280 if (!fnames) return NULL;
1281 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001282 PyObject *field = PyUnicode_InternFromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001283 if (!field) {
1284 Py_DECREF(fnames);
1285 return NULL;
1286 }
1287 PyTuple_SET_ITEM(fnames, i, field);
1288 }
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001289 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOs}",
INADA Naokifc489082017-01-25 22:33:43 +09001290 type, base,
Victor Stinnerf8599272020-07-03 16:57:19 +02001291 state->_fields, fnames,
1292 state->__module__,
1293 state->ast,
1294 state->__doc__, doc);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001295 Py_DECREF(fnames);
Dino Viehlandac46eb42019-09-11 10:16:34 -07001296 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001297}
1298
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001299static int
Victor Stinnerf8599272020-07-03 16:57:19 +02001300add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001301{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001302 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001303 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +00001304 if (!l)
1305 return 0;
1306 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001307 s = PyUnicode_InternFromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001308 if (!s) {
1309 Py_DECREF(l);
1310 return 0;
1311 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001312 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001313 }
Victor Stinnerf8599272020-07-03 16:57:19 +02001314 result = PyObject_SetAttr(type, state->_attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001315 Py_DECREF(l);
1316 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001317}
1318
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001319/* Conversion AST -> Python */
1320
Victor Stinnerf8599272020-07-03 16:57:19 +02001321static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*))
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001322{
Benjamin Peterson77fa9372012-05-15 10:10:27 -07001323 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001324 PyObject *result = PyList_New(n);
1325 PyObject *value;
1326 if (!result)
1327 return NULL;
1328 for (i = 0; i < n; i++) {
Victor Stinnerf8599272020-07-03 16:57:19 +02001329 value = func(state, asdl_seq_GET(seq, i));
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001330 if (!value) {
1331 Py_DECREF(result);
1332 return NULL;
1333 }
1334 PyList_SET_ITEM(result, i, value);
1335 }
1336 return result;
1337}
1338
Victor Stinnerf8599272020-07-03 16:57:19 +02001339static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001340{
1341 if (!o)
1342 o = Py_None;
1343 Py_INCREF((PyObject*)o);
1344 return (PyObject*)o;
1345}
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001346#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001347#define ast2obj_identifier ast2obj_object
1348#define ast2obj_string ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001349
Victor Stinnerf8599272020-07-03 16:57:19 +02001350static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001351{
Christian Heimes217cfd12007-12-02 14:31:20 +00001352 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001353}
1354
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001355/* Conversion Python -> AST */
1356
Victor Stinnerf8599272020-07-03 16:57:19 +02001357static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001358{
1359 if (obj == Py_None)
1360 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +02001361 if (obj) {
1362 if (PyArena_AddPyObject(arena, obj) < 0) {
1363 *out = NULL;
1364 return -1;
1365 }
1366 Py_INCREF(obj);
1367 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001368 *out = obj;
1369 return 0;
1370}
1371
Victor Stinnerf8599272020-07-03 16:57:19 +02001372static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001373{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001374 if (PyArena_AddPyObject(arena, obj) < 0) {
1375 *out = NULL;
1376 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001377 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001378 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001379 *out = obj;
1380 return 0;
1381}
1382
Victor Stinnerf8599272020-07-03 16:57:19 +02001383static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001384{
Benjamin Peterson180e6352011-07-22 11:09:07 -05001385 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
1386 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001387 return 1;
1388 }
Victor Stinnerf8599272020-07-03 16:57:19 +02001389 return obj2ast_object(state, obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001390}
1391
Victor Stinnerf8599272020-07-03 16:57:19 +02001392static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001393{
1394 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
1395 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
1396 return 1;
1397 }
Victor Stinnerf8599272020-07-03 16:57:19 +02001398 return obj2ast_object(state, obj, out, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001399}
1400
Victor Stinnerf8599272020-07-03 16:57:19 +02001401static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001402{
1403 int i;
1404 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +01001405 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001406 return 1;
1407 }
1408
Serhiy Storchaka56f6e762015-09-06 21:25:30 +03001409 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001410 if (i == -1 && PyErr_Occurred())
1411 return 1;
1412 *out = i;
1413 return 0;
1414}
1415
Victor Stinnerf8599272020-07-03 16:57:19 +02001416static int add_ast_fields(astmodulestate *state)
Benjamin Petersonce825f12008-10-24 23:11:02 +00001417{
Dino Viehlandac46eb42019-09-11 10:16:34 -07001418 PyObject *empty_tuple;
Benjamin Petersonce825f12008-10-24 23:11:02 +00001419 empty_tuple = PyTuple_New(0);
1420 if (!empty_tuple ||
Victor Stinnerf8599272020-07-03 16:57:19 +02001421 PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 ||
1422 PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +00001423 Py_XDECREF(empty_tuple);
1424 return -1;
1425 }
1426 Py_DECREF(empty_tuple);
1427 return 0;
1428}
1429
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001430
Victor Stinnerd2bea262020-08-10 15:55:54 +02001431static int init_types(astmodulestate *state)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001432{
Dino Viehlandac46eb42019-09-11 10:16:34 -07001433 if (state->initialized) return 1;
Victor Stinnerf8599272020-07-03 16:57:19 +02001434 if (init_identifiers(state) < 0) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -07001435 state->AST_type = PyType_FromSpec(&AST_type_spec);
1436 if (!state->AST_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001437 if (add_ast_fields(state) < 0) return 0;
1438 state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001439 "mod = Module(stmt* body, type_ignore* type_ignores)\n"
1440 " | Interactive(stmt* body)\n"
1441 " | Expression(expr body)\n"
1442 " | FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001443 if (!state->mod_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001444 if (!add_attributes(state, state->mod_type, NULL, 0)) return 0;
1445 state->Module_type = make_type(state, "Module", state->mod_type,
1446 Module_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001447 "Module(stmt* body, type_ignore* type_ignores)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001448 if (!state->Module_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001449 state->Interactive_type = make_type(state, "Interactive", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001450 Interactive_fields, 1,
1451 "Interactive(stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001452 if (!state->Interactive_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001453 state->Expression_type = make_type(state, "Expression", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001454 Expression_fields, 1,
1455 "Expression(expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001456 if (!state->Expression_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001457 state->FunctionType_type = make_type(state, "FunctionType",
1458 state->mod_type, FunctionType_fields,
1459 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001460 "FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001461 if (!state->FunctionType_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001462 state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001463 "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1464 " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1465 " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n"
1466 " | Return(expr? value)\n"
1467 " | Delete(expr* targets)\n"
1468 " | Assign(expr* targets, expr value, string? type_comment)\n"
1469 " | AugAssign(expr target, operator op, expr value)\n"
1470 " | AnnAssign(expr target, expr annotation, expr? value, int simple)\n"
1471 " | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1472 " | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1473 " | While(expr test, stmt* body, stmt* orelse)\n"
1474 " | If(expr test, stmt* body, stmt* orelse)\n"
1475 " | With(withitem* items, stmt* body, string? type_comment)\n"
1476 " | AsyncWith(withitem* items, stmt* body, string? type_comment)\n"
1477 " | Raise(expr? exc, expr? cause)\n"
1478 " | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n"
1479 " | Assert(expr test, expr? msg)\n"
1480 " | Import(alias* names)\n"
1481 " | ImportFrom(identifier? module, alias* names, int? level)\n"
1482 " | Global(identifier* names)\n"
1483 " | Nonlocal(identifier* names)\n"
1484 " | Expr(expr value)\n"
1485 " | Pass\n"
1486 " | Break\n"
1487 " | Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001488 if (!state->stmt_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001489 if (!add_attributes(state, state->stmt_type, stmt_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001490 if (PyObject_SetAttr(state->stmt_type, state->end_lineno, Py_None) == -1)
1491 return 0;
1492 if (PyObject_SetAttr(state->stmt_type, state->end_col_offset, Py_None) ==
1493 -1)
1494 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001495 state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001496 FunctionDef_fields, 6,
1497 "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001498 if (!state->FunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001499 if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) ==
1500 -1)
1501 return 0;
1502 if (PyObject_SetAttr(state->FunctionDef_type, state->type_comment, Py_None)
1503 == -1)
1504 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001505 state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001506 state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001507 AsyncFunctionDef_fields, 6,
1508 "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001509 if (!state->AsyncFunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001510 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None)
1511 == -1)
1512 return 0;
1513 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->type_comment,
1514 Py_None) == -1)
1515 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001516 state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001517 ClassDef_fields, 5,
1518 "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001519 if (!state->ClassDef_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001520 state->Return_type = make_type(state, "Return", state->stmt_type,
1521 Return_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001522 "Return(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001523 if (!state->Return_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001524 if (PyObject_SetAttr(state->Return_type, state->value, Py_None) == -1)
1525 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001526 state->Delete_type = make_type(state, "Delete", state->stmt_type,
1527 Delete_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001528 "Delete(expr* targets)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001529 if (!state->Delete_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001530 state->Assign_type = make_type(state, "Assign", state->stmt_type,
1531 Assign_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001532 "Assign(expr* targets, expr value, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001533 if (!state->Assign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001534 if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) ==
1535 -1)
1536 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001537 state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001538 AugAssign_fields, 3,
1539 "AugAssign(expr target, operator op, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001540 if (!state->AugAssign_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001541 state->AnnAssign_type = make_type(state, "AnnAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001542 AnnAssign_fields, 4,
1543 "AnnAssign(expr target, expr annotation, expr? value, int simple)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001544 if (!state->AnnAssign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001545 if (PyObject_SetAttr(state->AnnAssign_type, state->value, Py_None) == -1)
1546 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001547 state->For_type = make_type(state, "For", state->stmt_type, For_fields, 5,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001548 "For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001549 if (!state->For_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001550 if (PyObject_SetAttr(state->For_type, state->type_comment, Py_None) == -1)
1551 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001552 state->AsyncFor_type = make_type(state, "AsyncFor", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001553 AsyncFor_fields, 5,
1554 "AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001555 if (!state->AsyncFor_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001556 if (PyObject_SetAttr(state->AsyncFor_type, state->type_comment, Py_None) ==
1557 -1)
1558 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001559 state->While_type = make_type(state, "While", state->stmt_type,
1560 While_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001561 "While(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001562 if (!state->While_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001563 state->If_type = make_type(state, "If", state->stmt_type, If_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001564 "If(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001565 if (!state->If_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001566 state->With_type = make_type(state, "With", state->stmt_type, With_fields,
1567 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001568 "With(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001569 if (!state->With_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001570 if (PyObject_SetAttr(state->With_type, state->type_comment, Py_None) == -1)
1571 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001572 state->AsyncWith_type = make_type(state, "AsyncWith", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001573 AsyncWith_fields, 3,
1574 "AsyncWith(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001575 if (!state->AsyncWith_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001576 if (PyObject_SetAttr(state->AsyncWith_type, state->type_comment, Py_None)
1577 == -1)
1578 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001579 state->Raise_type = make_type(state, "Raise", state->stmt_type,
1580 Raise_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001581 "Raise(expr? exc, expr? cause)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001582 if (!state->Raise_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001583 if (PyObject_SetAttr(state->Raise_type, state->exc, Py_None) == -1)
1584 return 0;
1585 if (PyObject_SetAttr(state->Raise_type, state->cause, Py_None) == -1)
1586 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001587 state->Try_type = make_type(state, "Try", state->stmt_type, Try_fields, 4,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001588 "Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001589 if (!state->Try_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001590 state->Assert_type = make_type(state, "Assert", state->stmt_type,
1591 Assert_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001592 "Assert(expr test, expr? msg)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001593 if (!state->Assert_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001594 if (PyObject_SetAttr(state->Assert_type, state->msg, Py_None) == -1)
1595 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001596 state->Import_type = make_type(state, "Import", state->stmt_type,
1597 Import_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001598 "Import(alias* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001599 if (!state->Import_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001600 state->ImportFrom_type = make_type(state, "ImportFrom", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001601 ImportFrom_fields, 3,
1602 "ImportFrom(identifier? module, alias* names, int? level)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001603 if (!state->ImportFrom_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001604 if (PyObject_SetAttr(state->ImportFrom_type, state->module, Py_None) == -1)
1605 return 0;
1606 if (PyObject_SetAttr(state->ImportFrom_type, state->level, Py_None) == -1)
1607 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001608 state->Global_type = make_type(state, "Global", state->stmt_type,
1609 Global_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001610 "Global(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001611 if (!state->Global_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001612 state->Nonlocal_type = make_type(state, "Nonlocal", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001613 Nonlocal_fields, 1,
1614 "Nonlocal(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001615 if (!state->Nonlocal_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001616 state->Expr_type = make_type(state, "Expr", state->stmt_type, Expr_fields,
1617 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001618 "Expr(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001619 if (!state->Expr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001620 state->Pass_type = make_type(state, "Pass", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001621 "Pass");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001622 if (!state->Pass_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001623 state->Break_type = make_type(state, "Break", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001624 "Break");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001625 if (!state->Break_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001626 state->Continue_type = make_type(state, "Continue", state->stmt_type, NULL,
1627 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001628 "Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001629 if (!state->Continue_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001630 state->expr_type = make_type(state, "expr", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001631 "expr = BoolOp(boolop op, expr* values)\n"
1632 " | NamedExpr(expr target, expr value)\n"
1633 " | BinOp(expr left, operator op, expr right)\n"
1634 " | UnaryOp(unaryop op, expr operand)\n"
1635 " | Lambda(arguments args, expr body)\n"
1636 " | IfExp(expr test, expr body, expr orelse)\n"
1637 " | Dict(expr* keys, expr* values)\n"
1638 " | Set(expr* elts)\n"
1639 " | ListComp(expr elt, comprehension* generators)\n"
1640 " | SetComp(expr elt, comprehension* generators)\n"
1641 " | DictComp(expr key, expr value, comprehension* generators)\n"
1642 " | GeneratorExp(expr elt, comprehension* generators)\n"
1643 " | Await(expr value)\n"
1644 " | Yield(expr? value)\n"
1645 " | YieldFrom(expr value)\n"
1646 " | Compare(expr left, cmpop* ops, expr* comparators)\n"
1647 " | Call(expr func, expr* args, keyword* keywords)\n"
1648 " | FormattedValue(expr value, int? conversion, expr? format_spec)\n"
1649 " | JoinedStr(expr* values)\n"
1650 " | Constant(constant value, string? kind)\n"
1651 " | Attribute(expr value, identifier attr, expr_context ctx)\n"
1652 " | Subscript(expr value, expr slice, expr_context ctx)\n"
1653 " | Starred(expr value, expr_context ctx)\n"
1654 " | Name(identifier id, expr_context ctx)\n"
1655 " | List(expr* elts, expr_context ctx)\n"
1656 " | Tuple(expr* elts, expr_context ctx)\n"
1657 " | Slice(expr? lower, expr? upper, expr? step)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001658 if (!state->expr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001659 if (!add_attributes(state, state->expr_type, expr_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001660 if (PyObject_SetAttr(state->expr_type, state->end_lineno, Py_None) == -1)
1661 return 0;
1662 if (PyObject_SetAttr(state->expr_type, state->end_col_offset, Py_None) ==
1663 -1)
1664 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001665 state->BoolOp_type = make_type(state, "BoolOp", state->expr_type,
1666 BoolOp_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001667 "BoolOp(boolop op, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001668 if (!state->BoolOp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001669 state->NamedExpr_type = make_type(state, "NamedExpr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001670 NamedExpr_fields, 2,
1671 "NamedExpr(expr target, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001672 if (!state->NamedExpr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001673 state->BinOp_type = make_type(state, "BinOp", state->expr_type,
1674 BinOp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001675 "BinOp(expr left, operator op, expr right)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001676 if (!state->BinOp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001677 state->UnaryOp_type = make_type(state, "UnaryOp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001678 UnaryOp_fields, 2,
1679 "UnaryOp(unaryop op, expr operand)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001680 if (!state->UnaryOp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001681 state->Lambda_type = make_type(state, "Lambda", state->expr_type,
1682 Lambda_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001683 "Lambda(arguments args, expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001684 if (!state->Lambda_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001685 state->IfExp_type = make_type(state, "IfExp", state->expr_type,
1686 IfExp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001687 "IfExp(expr test, expr body, expr orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001688 if (!state->IfExp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001689 state->Dict_type = make_type(state, "Dict", state->expr_type, Dict_fields,
1690 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001691 "Dict(expr* keys, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001692 if (!state->Dict_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001693 state->Set_type = make_type(state, "Set", state->expr_type, Set_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001694 "Set(expr* elts)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001695 if (!state->Set_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001696 state->ListComp_type = make_type(state, "ListComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001697 ListComp_fields, 2,
1698 "ListComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001699 if (!state->ListComp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001700 state->SetComp_type = make_type(state, "SetComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001701 SetComp_fields, 2,
1702 "SetComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001703 if (!state->SetComp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001704 state->DictComp_type = make_type(state, "DictComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001705 DictComp_fields, 3,
1706 "DictComp(expr key, expr value, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001707 if (!state->DictComp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001708 state->GeneratorExp_type = make_type(state, "GeneratorExp",
1709 state->expr_type, GeneratorExp_fields,
1710 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001711 "GeneratorExp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001712 if (!state->GeneratorExp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001713 state->Await_type = make_type(state, "Await", state->expr_type,
1714 Await_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001715 "Await(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001716 if (!state->Await_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001717 state->Yield_type = make_type(state, "Yield", state->expr_type,
1718 Yield_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001719 "Yield(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001720 if (!state->Yield_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001721 if (PyObject_SetAttr(state->Yield_type, state->value, Py_None) == -1)
1722 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001723 state->YieldFrom_type = make_type(state, "YieldFrom", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001724 YieldFrom_fields, 1,
1725 "YieldFrom(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001726 if (!state->YieldFrom_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001727 state->Compare_type = make_type(state, "Compare", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001728 Compare_fields, 3,
1729 "Compare(expr left, cmpop* ops, expr* comparators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001730 if (!state->Compare_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001731 state->Call_type = make_type(state, "Call", state->expr_type, Call_fields,
1732 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001733 "Call(expr func, expr* args, keyword* keywords)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001734 if (!state->Call_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001735 state->FormattedValue_type = make_type(state, "FormattedValue",
1736 state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001737 FormattedValue_fields, 3,
1738 "FormattedValue(expr value, int? conversion, expr? format_spec)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001739 if (!state->FormattedValue_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001740 if (PyObject_SetAttr(state->FormattedValue_type, state->conversion,
1741 Py_None) == -1)
1742 return 0;
1743 if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec,
1744 Py_None) == -1)
1745 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001746 state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001747 JoinedStr_fields, 1,
1748 "JoinedStr(expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001749 if (!state->JoinedStr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001750 state->Constant_type = make_type(state, "Constant", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001751 Constant_fields, 2,
1752 "Constant(constant value, string? kind)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001753 if (!state->Constant_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001754 if (PyObject_SetAttr(state->Constant_type, state->kind, Py_None) == -1)
1755 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001756 state->Attribute_type = make_type(state, "Attribute", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001757 Attribute_fields, 3,
1758 "Attribute(expr value, identifier attr, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001759 if (!state->Attribute_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001760 state->Subscript_type = make_type(state, "Subscript", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001761 Subscript_fields, 3,
1762 "Subscript(expr value, expr slice, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001763 if (!state->Subscript_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001764 state->Starred_type = make_type(state, "Starred", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001765 Starred_fields, 2,
1766 "Starred(expr value, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001767 if (!state->Starred_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001768 state->Name_type = make_type(state, "Name", state->expr_type, Name_fields,
1769 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001770 "Name(identifier id, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001771 if (!state->Name_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001772 state->List_type = make_type(state, "List", state->expr_type, List_fields,
1773 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001774 "List(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001775 if (!state->List_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001776 state->Tuple_type = make_type(state, "Tuple", state->expr_type,
1777 Tuple_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001778 "Tuple(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001779 if (!state->Tuple_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001780 state->Slice_type = make_type(state, "Slice", state->expr_type,
1781 Slice_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001782 "Slice(expr? lower, expr? upper, expr? step)");
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001783 if (!state->Slice_type) return 0;
1784 if (PyObject_SetAttr(state->Slice_type, state->lower, Py_None) == -1)
1785 return 0;
1786 if (PyObject_SetAttr(state->Slice_type, state->upper, Py_None) == -1)
1787 return 0;
1788 if (PyObject_SetAttr(state->Slice_type, state->step, Py_None) == -1)
1789 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001790 state->expr_context_type = make_type(state, "expr_context",
1791 state->AST_type, NULL, 0,
Serhiy Storchaka6b975982020-03-17 23:41:08 +02001792 "expr_context = Load | Store | Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001793 if (!state->expr_context_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001794 if (!add_attributes(state, state->expr_context_type, NULL, 0)) return 0;
1795 state->Load_type = make_type(state, "Load", state->expr_context_type, NULL,
1796 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001797 "Load");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001798 if (!state->Load_type) return 0;
1799 state->Load_singleton = PyType_GenericNew((PyTypeObject *)state->Load_type,
1800 NULL, NULL);
1801 if (!state->Load_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001802 state->Store_type = make_type(state, "Store", state->expr_context_type,
1803 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001804 "Store");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001805 if (!state->Store_type) return 0;
1806 state->Store_singleton = PyType_GenericNew((PyTypeObject
1807 *)state->Store_type, NULL, NULL);
1808 if (!state->Store_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001809 state->Del_type = make_type(state, "Del", state->expr_context_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001810 "Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001811 if (!state->Del_type) return 0;
1812 state->Del_singleton = PyType_GenericNew((PyTypeObject *)state->Del_type,
1813 NULL, NULL);
1814 if (!state->Del_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001815 state->boolop_type = make_type(state, "boolop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001816 "boolop = And | Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001817 if (!state->boolop_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001818 if (!add_attributes(state, state->boolop_type, NULL, 0)) return 0;
1819 state->And_type = make_type(state, "And", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001820 "And");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001821 if (!state->And_type) return 0;
1822 state->And_singleton = PyType_GenericNew((PyTypeObject *)state->And_type,
1823 NULL, NULL);
1824 if (!state->And_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001825 state->Or_type = make_type(state, "Or", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001826 "Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001827 if (!state->Or_type) return 0;
1828 state->Or_singleton = PyType_GenericNew((PyTypeObject *)state->Or_type,
1829 NULL, NULL);
1830 if (!state->Or_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001831 state->operator_type = make_type(state, "operator", state->AST_type, NULL,
1832 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001833 "operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001834 if (!state->operator_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001835 if (!add_attributes(state, state->operator_type, NULL, 0)) return 0;
1836 state->Add_type = make_type(state, "Add", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001837 "Add");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001838 if (!state->Add_type) return 0;
1839 state->Add_singleton = PyType_GenericNew((PyTypeObject *)state->Add_type,
1840 NULL, NULL);
1841 if (!state->Add_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001842 state->Sub_type = make_type(state, "Sub", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001843 "Sub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001844 if (!state->Sub_type) return 0;
1845 state->Sub_singleton = PyType_GenericNew((PyTypeObject *)state->Sub_type,
1846 NULL, NULL);
1847 if (!state->Sub_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001848 state->Mult_type = make_type(state, "Mult", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001849 "Mult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001850 if (!state->Mult_type) return 0;
1851 state->Mult_singleton = PyType_GenericNew((PyTypeObject *)state->Mult_type,
1852 NULL, NULL);
1853 if (!state->Mult_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001854 state->MatMult_type = make_type(state, "MatMult", state->operator_type,
1855 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001856 "MatMult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001857 if (!state->MatMult_type) return 0;
1858 state->MatMult_singleton = PyType_GenericNew((PyTypeObject
1859 *)state->MatMult_type, NULL,
1860 NULL);
1861 if (!state->MatMult_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001862 state->Div_type = make_type(state, "Div", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001863 "Div");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001864 if (!state->Div_type) return 0;
1865 state->Div_singleton = PyType_GenericNew((PyTypeObject *)state->Div_type,
1866 NULL, NULL);
1867 if (!state->Div_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001868 state->Mod_type = make_type(state, "Mod", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001869 "Mod");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001870 if (!state->Mod_type) return 0;
1871 state->Mod_singleton = PyType_GenericNew((PyTypeObject *)state->Mod_type,
1872 NULL, NULL);
1873 if (!state->Mod_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001874 state->Pow_type = make_type(state, "Pow", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001875 "Pow");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001876 if (!state->Pow_type) return 0;
1877 state->Pow_singleton = PyType_GenericNew((PyTypeObject *)state->Pow_type,
1878 NULL, NULL);
1879 if (!state->Pow_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001880 state->LShift_type = make_type(state, "LShift", state->operator_type, NULL,
1881 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001882 "LShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001883 if (!state->LShift_type) return 0;
1884 state->LShift_singleton = PyType_GenericNew((PyTypeObject
1885 *)state->LShift_type, NULL,
1886 NULL);
1887 if (!state->LShift_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001888 state->RShift_type = make_type(state, "RShift", state->operator_type, NULL,
1889 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001890 "RShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001891 if (!state->RShift_type) return 0;
1892 state->RShift_singleton = PyType_GenericNew((PyTypeObject
1893 *)state->RShift_type, NULL,
1894 NULL);
1895 if (!state->RShift_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001896 state->BitOr_type = make_type(state, "BitOr", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001897 "BitOr");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001898 if (!state->BitOr_type) return 0;
1899 state->BitOr_singleton = PyType_GenericNew((PyTypeObject
1900 *)state->BitOr_type, NULL, NULL);
1901 if (!state->BitOr_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001902 state->BitXor_type = make_type(state, "BitXor", state->operator_type, NULL,
1903 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001904 "BitXor");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001905 if (!state->BitXor_type) return 0;
1906 state->BitXor_singleton = PyType_GenericNew((PyTypeObject
1907 *)state->BitXor_type, NULL,
1908 NULL);
1909 if (!state->BitXor_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001910 state->BitAnd_type = make_type(state, "BitAnd", state->operator_type, NULL,
1911 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001912 "BitAnd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001913 if (!state->BitAnd_type) return 0;
1914 state->BitAnd_singleton = PyType_GenericNew((PyTypeObject
1915 *)state->BitAnd_type, NULL,
1916 NULL);
1917 if (!state->BitAnd_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001918 state->FloorDiv_type = make_type(state, "FloorDiv", state->operator_type,
1919 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001920 "FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001921 if (!state->FloorDiv_type) return 0;
1922 state->FloorDiv_singleton = PyType_GenericNew((PyTypeObject
1923 *)state->FloorDiv_type, NULL,
1924 NULL);
1925 if (!state->FloorDiv_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001926 state->unaryop_type = make_type(state, "unaryop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001927 "unaryop = Invert | Not | UAdd | USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001928 if (!state->unaryop_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001929 if (!add_attributes(state, state->unaryop_type, NULL, 0)) return 0;
1930 state->Invert_type = make_type(state, "Invert", state->unaryop_type, NULL,
1931 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001932 "Invert");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001933 if (!state->Invert_type) return 0;
1934 state->Invert_singleton = PyType_GenericNew((PyTypeObject
1935 *)state->Invert_type, NULL,
1936 NULL);
1937 if (!state->Invert_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001938 state->Not_type = make_type(state, "Not", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001939 "Not");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001940 if (!state->Not_type) return 0;
1941 state->Not_singleton = PyType_GenericNew((PyTypeObject *)state->Not_type,
1942 NULL, NULL);
1943 if (!state->Not_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001944 state->UAdd_type = make_type(state, "UAdd", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001945 "UAdd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001946 if (!state->UAdd_type) return 0;
1947 state->UAdd_singleton = PyType_GenericNew((PyTypeObject *)state->UAdd_type,
1948 NULL, NULL);
1949 if (!state->UAdd_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001950 state->USub_type = make_type(state, "USub", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001951 "USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001952 if (!state->USub_type) return 0;
1953 state->USub_singleton = PyType_GenericNew((PyTypeObject *)state->USub_type,
1954 NULL, NULL);
1955 if (!state->USub_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001956 state->cmpop_type = make_type(state, "cmpop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001957 "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001958 if (!state->cmpop_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001959 if (!add_attributes(state, state->cmpop_type, NULL, 0)) return 0;
1960 state->Eq_type = make_type(state, "Eq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001961 "Eq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001962 if (!state->Eq_type) return 0;
1963 state->Eq_singleton = PyType_GenericNew((PyTypeObject *)state->Eq_type,
1964 NULL, NULL);
1965 if (!state->Eq_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001966 state->NotEq_type = make_type(state, "NotEq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001967 "NotEq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001968 if (!state->NotEq_type) return 0;
1969 state->NotEq_singleton = PyType_GenericNew((PyTypeObject
1970 *)state->NotEq_type, NULL, NULL);
1971 if (!state->NotEq_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001972 state->Lt_type = make_type(state, "Lt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001973 "Lt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001974 if (!state->Lt_type) return 0;
1975 state->Lt_singleton = PyType_GenericNew((PyTypeObject *)state->Lt_type,
1976 NULL, NULL);
1977 if (!state->Lt_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001978 state->LtE_type = make_type(state, "LtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001979 "LtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001980 if (!state->LtE_type) return 0;
1981 state->LtE_singleton = PyType_GenericNew((PyTypeObject *)state->LtE_type,
1982 NULL, NULL);
1983 if (!state->LtE_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001984 state->Gt_type = make_type(state, "Gt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001985 "Gt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001986 if (!state->Gt_type) return 0;
1987 state->Gt_singleton = PyType_GenericNew((PyTypeObject *)state->Gt_type,
1988 NULL, NULL);
1989 if (!state->Gt_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001990 state->GtE_type = make_type(state, "GtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001991 "GtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001992 if (!state->GtE_type) return 0;
1993 state->GtE_singleton = PyType_GenericNew((PyTypeObject *)state->GtE_type,
1994 NULL, NULL);
1995 if (!state->GtE_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001996 state->Is_type = make_type(state, "Is", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001997 "Is");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001998 if (!state->Is_type) return 0;
1999 state->Is_singleton = PyType_GenericNew((PyTypeObject *)state->Is_type,
2000 NULL, NULL);
2001 if (!state->Is_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002002 state->IsNot_type = make_type(state, "IsNot", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002003 "IsNot");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002004 if (!state->IsNot_type) return 0;
2005 state->IsNot_singleton = PyType_GenericNew((PyTypeObject
2006 *)state->IsNot_type, NULL, NULL);
2007 if (!state->IsNot_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002008 state->In_type = make_type(state, "In", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002009 "In");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002010 if (!state->In_type) return 0;
2011 state->In_singleton = PyType_GenericNew((PyTypeObject *)state->In_type,
2012 NULL, NULL);
2013 if (!state->In_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002014 state->NotIn_type = make_type(state, "NotIn", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002015 "NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002016 if (!state->NotIn_type) return 0;
2017 state->NotIn_singleton = PyType_GenericNew((PyTypeObject
2018 *)state->NotIn_type, NULL, NULL);
2019 if (!state->NotIn_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002020 state->comprehension_type = make_type(state, "comprehension",
2021 state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002022 comprehension_fields, 4,
2023 "comprehension(expr target, expr iter, expr* ifs, int is_async)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002024 if (!state->comprehension_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002025 if (!add_attributes(state, state->comprehension_type, NULL, 0)) return 0;
2026 state->excepthandler_type = make_type(state, "excepthandler",
2027 state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002028 "excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002029 if (!state->excepthandler_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002030 if (!add_attributes(state, state->excepthandler_type,
2031 excepthandler_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002032 if (PyObject_SetAttr(state->excepthandler_type, state->end_lineno, Py_None)
2033 == -1)
2034 return 0;
2035 if (PyObject_SetAttr(state->excepthandler_type, state->end_col_offset,
2036 Py_None) == -1)
2037 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002038 state->ExceptHandler_type = make_type(state, "ExceptHandler",
Dino Viehlandac46eb42019-09-11 10:16:34 -07002039 state->excepthandler_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002040 ExceptHandler_fields, 3,
2041 "ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002042 if (!state->ExceptHandler_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002043 if (PyObject_SetAttr(state->ExceptHandler_type, state->type, Py_None) == -1)
2044 return 0;
2045 if (PyObject_SetAttr(state->ExceptHandler_type, state->name, Py_None) == -1)
2046 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002047 state->arguments_type = make_type(state, "arguments", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002048 arguments_fields, 7,
2049 "arguments(arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002050 if (!state->arguments_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002051 if (!add_attributes(state, state->arguments_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002052 if (PyObject_SetAttr(state->arguments_type, state->vararg, Py_None) == -1)
2053 return 0;
2054 if (PyObject_SetAttr(state->arguments_type, state->kwarg, Py_None) == -1)
2055 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002056 state->arg_type = make_type(state, "arg", state->AST_type, arg_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002057 "arg(identifier arg, expr? annotation, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002058 if (!state->arg_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002059 if (!add_attributes(state, state->arg_type, arg_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002060 if (PyObject_SetAttr(state->arg_type, state->annotation, Py_None) == -1)
2061 return 0;
2062 if (PyObject_SetAttr(state->arg_type, state->type_comment, Py_None) == -1)
2063 return 0;
2064 if (PyObject_SetAttr(state->arg_type, state->end_lineno, Py_None) == -1)
2065 return 0;
2066 if (PyObject_SetAttr(state->arg_type, state->end_col_offset, Py_None) == -1)
2067 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002068 state->keyword_type = make_type(state, "keyword", state->AST_type,
2069 keyword_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002070 "keyword(identifier? arg, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002071 if (!state->keyword_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002072 if (!add_attributes(state, state->keyword_type, keyword_attributes, 4))
2073 return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002074 if (PyObject_SetAttr(state->keyword_type, state->arg, Py_None) == -1)
2075 return 0;
Pablo Galindo168660b2020-04-02 00:47:39 +01002076 if (PyObject_SetAttr(state->keyword_type, state->end_lineno, Py_None) == -1)
2077 return 0;
2078 if (PyObject_SetAttr(state->keyword_type, state->end_col_offset, Py_None)
2079 == -1)
2080 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002081 state->alias_type = make_type(state, "alias", state->AST_type,
2082 alias_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002083 "alias(identifier name, identifier? asname)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002084 if (!state->alias_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002085 if (!add_attributes(state, state->alias_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002086 if (PyObject_SetAttr(state->alias_type, state->asname, Py_None) == -1)
2087 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002088 state->withitem_type = make_type(state, "withitem", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002089 withitem_fields, 2,
2090 "withitem(expr context_expr, expr? optional_vars)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002091 if (!state->withitem_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002092 if (!add_attributes(state, state->withitem_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002093 if (PyObject_SetAttr(state->withitem_type, state->optional_vars, Py_None)
2094 == -1)
2095 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002096 state->type_ignore_type = make_type(state, "type_ignore", state->AST_type,
2097 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002098 "type_ignore = TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002099 if (!state->type_ignore_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002100 if (!add_attributes(state, state->type_ignore_type, NULL, 0)) return 0;
2101 state->TypeIgnore_type = make_type(state, "TypeIgnore",
2102 state->type_ignore_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002103 TypeIgnore_fields, 2,
2104 "TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002105 if (!state->TypeIgnore_type) return 0;
2106 state->initialized = 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002107 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002108}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002109
Victor Stinnerf8599272020-07-03 16:57:19 +02002110static int obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out,
2111 PyArena* arena);
2112static int obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out,
2113 PyArena* arena);
2114static int obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out,
2115 PyArena* arena);
2116static int obj2ast_expr_context(astmodulestate *state, PyObject* obj,
2117 expr_context_ty* out, PyArena* arena);
2118static int obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out,
2119 PyArena* arena);
2120static int obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty*
2121 out, PyArena* arena);
2122static int obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty*
2123 out, PyArena* arena);
2124static int obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out,
2125 PyArena* arena);
2126static int obj2ast_comprehension(astmodulestate *state, PyObject* obj,
2127 comprehension_ty* out, PyArena* arena);
2128static int obj2ast_excepthandler(astmodulestate *state, PyObject* obj,
2129 excepthandler_ty* out, PyArena* arena);
2130static int obj2ast_arguments(astmodulestate *state, PyObject* obj,
2131 arguments_ty* out, PyArena* arena);
2132static int obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out,
2133 PyArena* arena);
2134static int obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty*
2135 out, PyArena* arena);
2136static int obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out,
2137 PyArena* arena);
2138static int obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty*
2139 out, PyArena* arena);
2140static int obj2ast_type_ignore(astmodulestate *state, PyObject* obj,
2141 type_ignore_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002142
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002144Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002146 mod_ty p;
2147 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2148 if (!p)
2149 return NULL;
2150 p->kind = Module_kind;
2151 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002152 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002153 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154}
2155
2156mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002157Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002159 mod_ty p;
2160 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2161 if (!p)
2162 return NULL;
2163 p->kind = Interactive_kind;
2164 p->v.Interactive.body = body;
2165 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166}
2167
2168mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002169Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002171 mod_ty p;
2172 if (!body) {
2173 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002174 "field 'body' is required for Expression");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002175 return NULL;
2176 }
2177 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2178 if (!p)
2179 return NULL;
2180 p->kind = Expression_kind;
2181 p->v.Expression.body = body;
2182 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183}
2184
2185mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002186FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena)
2187{
2188 mod_ty p;
2189 if (!returns) {
2190 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002191 "field 'returns' is required for FunctionType");
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002192 return NULL;
2193 }
2194 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2195 if (!p)
2196 return NULL;
2197 p->kind = FunctionType_kind;
2198 p->v.FunctionType.argtypes = argtypes;
2199 p->v.FunctionType.returns = returns;
2200 return p;
2201}
2202
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203stmt_ty
2204FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002205 decorator_list, expr_ty returns, string type_comment, int lineno,
2206 int col_offset, int end_lineno, int 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 if (!name) {
2210 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002211 "field 'name' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002212 return NULL;
2213 }
2214 if (!args) {
2215 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002216 "field 'args' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002217 return NULL;
2218 }
2219 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2220 if (!p)
2221 return NULL;
2222 p->kind = FunctionDef_kind;
2223 p->v.FunctionDef.name = name;
2224 p->v.FunctionDef.args = args;
2225 p->v.FunctionDef.body = body;
2226 p->v.FunctionDef.decorator_list = decorator_list;
2227 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002228 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002229 p->lineno = lineno;
2230 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002231 p->end_lineno = end_lineno;
2232 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002233 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234}
2235
2236stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002237AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002238 * decorator_list, expr_ty returns, string type_comment, int
2239 lineno, int col_offset, int end_lineno, int end_col_offset,
2240 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002241{
2242 stmt_ty p;
2243 if (!name) {
2244 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002245 "field 'name' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002246 return NULL;
2247 }
2248 if (!args) {
2249 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002250 "field 'args' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002251 return NULL;
2252 }
2253 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2254 if (!p)
2255 return NULL;
2256 p->kind = AsyncFunctionDef_kind;
2257 p->v.AsyncFunctionDef.name = name;
2258 p->v.AsyncFunctionDef.args = args;
2259 p->v.AsyncFunctionDef.body = body;
2260 p->v.AsyncFunctionDef.decorator_list = decorator_list;
2261 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002262 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002263 p->lineno = lineno;
2264 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002265 p->end_lineno = end_lineno;
2266 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002267 return p;
2268}
2269
2270stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002271ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002272 body, asdl_seq * decorator_list, int lineno, int col_offset, int
2273 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002275 stmt_ty p;
2276 if (!name) {
2277 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002278 "field 'name' is required for ClassDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002279 return NULL;
2280 }
2281 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2282 if (!p)
2283 return NULL;
2284 p->kind = ClassDef_kind;
2285 p->v.ClassDef.name = name;
2286 p->v.ClassDef.bases = bases;
2287 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002288 p->v.ClassDef.body = body;
2289 p->v.ClassDef.decorator_list = decorator_list;
2290 p->lineno = lineno;
2291 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002292 p->end_lineno = end_lineno;
2293 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002294 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295}
2296
2297stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002298Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
2299 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002301 stmt_ty p;
2302 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2303 if (!p)
2304 return NULL;
2305 p->kind = Return_kind;
2306 p->v.Return.value = value;
2307 p->lineno = lineno;
2308 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002309 p->end_lineno = end_lineno;
2310 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002311 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312}
2313
2314stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002315Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int
2316 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002318 stmt_ty p;
2319 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2320 if (!p)
2321 return NULL;
2322 p->kind = Delete_kind;
2323 p->v.Delete.targets = targets;
2324 p->lineno = lineno;
2325 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002326 p->end_lineno = end_lineno;
2327 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002328 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329}
2330
2331stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002332Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int
2333 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002335 stmt_ty p;
2336 if (!value) {
2337 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002338 "field 'value' is required for Assign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002339 return NULL;
2340 }
2341 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2342 if (!p)
2343 return NULL;
2344 p->kind = Assign_kind;
2345 p->v.Assign.targets = targets;
2346 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002347 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002348 p->lineno = lineno;
2349 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002350 p->end_lineno = end_lineno;
2351 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002352 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353}
2354
2355stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002356AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002357 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002359 stmt_ty p;
2360 if (!target) {
2361 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002362 "field 'target' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002363 return NULL;
2364 }
2365 if (!op) {
2366 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002367 "field 'op' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002368 return NULL;
2369 }
2370 if (!value) {
2371 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002372 "field 'value' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002373 return NULL;
2374 }
2375 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2376 if (!p)
2377 return NULL;
2378 p->kind = AugAssign_kind;
2379 p->v.AugAssign.target = target;
2380 p->v.AugAssign.op = op;
2381 p->v.AugAssign.value = value;
2382 p->lineno = lineno;
2383 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002384 p->end_lineno = end_lineno;
2385 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002386 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387}
2388
2389stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002390AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002391 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2392 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002393{
2394 stmt_ty p;
2395 if (!target) {
2396 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002397 "field 'target' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002398 return NULL;
2399 }
2400 if (!annotation) {
2401 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002402 "field 'annotation' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002403 return NULL;
2404 }
2405 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2406 if (!p)
2407 return NULL;
2408 p->kind = AnnAssign_kind;
2409 p->v.AnnAssign.target = target;
2410 p->v.AnnAssign.annotation = annotation;
2411 p->v.AnnAssign.value = value;
2412 p->v.AnnAssign.simple = simple;
2413 p->lineno = lineno;
2414 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002415 p->end_lineno = end_lineno;
2416 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002417 return p;
2418}
2419
2420stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002421For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string
2422 type_comment, int lineno, int col_offset, int end_lineno, int
2423 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002425 stmt_ty p;
2426 if (!target) {
2427 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002428 "field 'target' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002429 return NULL;
2430 }
2431 if (!iter) {
2432 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002433 "field 'iter' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002434 return NULL;
2435 }
2436 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2437 if (!p)
2438 return NULL;
2439 p->kind = For_kind;
2440 p->v.For.target = target;
2441 p->v.For.iter = iter;
2442 p->v.For.body = body;
2443 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002444 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002445 p->lineno = lineno;
2446 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002447 p->end_lineno = end_lineno;
2448 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002449 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450}
2451
2452stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002453AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse,
2454 string type_comment, int lineno, int col_offset, int end_lineno, int
2455 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002456{
2457 stmt_ty p;
2458 if (!target) {
2459 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002460 "field 'target' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002461 return NULL;
2462 }
2463 if (!iter) {
2464 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002465 "field 'iter' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002466 return NULL;
2467 }
2468 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2469 if (!p)
2470 return NULL;
2471 p->kind = AsyncFor_kind;
2472 p->v.AsyncFor.target = target;
2473 p->v.AsyncFor.iter = iter;
2474 p->v.AsyncFor.body = body;
2475 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002476 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002477 p->lineno = lineno;
2478 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002479 p->end_lineno = end_lineno;
2480 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002481 return p;
2482}
2483
2484stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002485While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002486 col_offset, int end_lineno, 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 if (!test) {
2490 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002491 "field 'test' is required for While");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002492 return NULL;
2493 }
2494 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2495 if (!p)
2496 return NULL;
2497 p->kind = While_kind;
2498 p->v.While.test = test;
2499 p->v.While.body = body;
2500 p->v.While.orelse = orelse;
2501 p->lineno = lineno;
2502 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002503 p->end_lineno = end_lineno;
2504 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002505 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506}
2507
2508stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002509If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002510 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002512 stmt_ty p;
2513 if (!test) {
2514 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002515 "field 'test' is required for If");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002516 return NULL;
2517 }
2518 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2519 if (!p)
2520 return NULL;
2521 p->kind = If_kind;
2522 p->v.If.test = test;
2523 p->v.If.body = body;
2524 p->v.If.orelse = orelse;
2525 p->lineno = lineno;
2526 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002527 p->end_lineno = end_lineno;
2528 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002529 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530}
2531
2532stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002533With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int
2534 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002535{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002536 stmt_ty p;
2537 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2538 if (!p)
2539 return NULL;
2540 p->kind = With_kind;
2541 p->v.With.items = items;
2542 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002543 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002544 p->lineno = lineno;
2545 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002546 p->end_lineno = end_lineno;
2547 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002548 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002549}
2550
2551stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002552AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno,
2553 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002554{
2555 stmt_ty p;
2556 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2557 if (!p)
2558 return NULL;
2559 p->kind = AsyncWith_kind;
2560 p->v.AsyncWith.items = items;
2561 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002562 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002563 p->lineno = lineno;
2564 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002565 p->end_lineno = end_lineno;
2566 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002567 return p;
2568}
2569
2570stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002571Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
2572 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002574 stmt_ty p;
2575 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2576 if (!p)
2577 return NULL;
2578 p->kind = Raise_kind;
2579 p->v.Raise.exc = exc;
2580 p->v.Raise.cause = cause;
2581 p->lineno = lineno;
2582 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002583 p->end_lineno = end_lineno;
2584 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002585 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586}
2587
2588stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002589Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002590 finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset,
2591 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002593 stmt_ty p;
2594 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2595 if (!p)
2596 return NULL;
2597 p->kind = Try_kind;
2598 p->v.Try.body = body;
2599 p->v.Try.handlers = handlers;
2600 p->v.Try.orelse = orelse;
2601 p->v.Try.finalbody = finalbody;
2602 p->lineno = lineno;
2603 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002604 p->end_lineno = end_lineno;
2605 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002606 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607}
2608
2609stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002610Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
2611 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002613 stmt_ty p;
2614 if (!test) {
2615 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002616 "field 'test' is required for Assert");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002617 return NULL;
2618 }
2619 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2620 if (!p)
2621 return NULL;
2622 p->kind = Assert_kind;
2623 p->v.Assert.test = test;
2624 p->v.Assert.msg = msg;
2625 p->lineno = lineno;
2626 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002627 p->end_lineno = end_lineno;
2628 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002629 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630}
2631
2632stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002633Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
2634 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002636 stmt_ty p;
2637 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2638 if (!p)
2639 return NULL;
2640 p->kind = Import_kind;
2641 p->v.Import.names = names;
2642 p->lineno = lineno;
2643 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002644 p->end_lineno = end_lineno;
2645 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002646 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647}
2648
2649stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002650ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002651 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002653 stmt_ty p;
2654 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2655 if (!p)
2656 return NULL;
2657 p->kind = ImportFrom_kind;
2658 p->v.ImportFrom.module = module;
2659 p->v.ImportFrom.names = names;
2660 p->v.ImportFrom.level = level;
2661 p->lineno = lineno;
2662 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002663 p->end_lineno = end_lineno;
2664 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002665 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666}
2667
2668stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002669Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
2670 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002672 stmt_ty p;
2673 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2674 if (!p)
2675 return NULL;
2676 p->kind = Global_kind;
2677 p->v.Global.names = names;
2678 p->lineno = lineno;
2679 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002680 p->end_lineno = end_lineno;
2681 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002682 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683}
2684
2685stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002686Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
2687 end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00002688{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002689 stmt_ty p;
2690 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2691 if (!p)
2692 return NULL;
2693 p->kind = Nonlocal_kind;
2694 p->v.Nonlocal.names = names;
2695 p->lineno = lineno;
2696 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002697 p->end_lineno = end_lineno;
2698 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002699 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00002700}
2701
2702stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002703Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
2704 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002706 stmt_ty p;
2707 if (!value) {
2708 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002709 "field 'value' is required for Expr");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002710 return NULL;
2711 }
2712 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2713 if (!p)
2714 return NULL;
2715 p->kind = Expr_kind;
2716 p->v.Expr.value = value;
2717 p->lineno = lineno;
2718 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002719 p->end_lineno = end_lineno;
2720 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002721 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722}
2723
2724stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002725Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2726 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002728 stmt_ty p;
2729 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2730 if (!p)
2731 return NULL;
2732 p->kind = Pass_kind;
2733 p->lineno = lineno;
2734 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002735 p->end_lineno = end_lineno;
2736 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002737 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002738}
2739
2740stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002741Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2742 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002744 stmt_ty p;
2745 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2746 if (!p)
2747 return NULL;
2748 p->kind = Break_kind;
2749 p->lineno = lineno;
2750 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002751 p->end_lineno = end_lineno;
2752 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002753 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754}
2755
2756stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002757Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
2758 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002760 stmt_ty p;
2761 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2762 if (!p)
2763 return NULL;
2764 p->kind = Continue_kind;
2765 p->lineno = lineno;
2766 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002767 p->end_lineno = end_lineno;
2768 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002769 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770}
2771
2772expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002773BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int
2774 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002776 expr_ty p;
2777 if (!op) {
2778 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002779 "field 'op' is required for BoolOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002780 return NULL;
2781 }
2782 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2783 if (!p)
2784 return NULL;
2785 p->kind = BoolOp_kind;
2786 p->v.BoolOp.op = op;
2787 p->v.BoolOp.values = values;
2788 p->lineno = lineno;
2789 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002790 p->end_lineno = end_lineno;
2791 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002792 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793}
2794
2795expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002796NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
2797 end_lineno, int end_col_offset, PyArena *arena)
2798{
2799 expr_ty p;
2800 if (!target) {
2801 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002802 "field 'target' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002803 return NULL;
2804 }
2805 if (!value) {
2806 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002807 "field 'value' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002808 return NULL;
2809 }
2810 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2811 if (!p)
2812 return NULL;
2813 p->kind = NamedExpr_kind;
2814 p->v.NamedExpr.target = target;
2815 p->v.NamedExpr.value = value;
2816 p->lineno = lineno;
2817 p->col_offset = col_offset;
2818 p->end_lineno = end_lineno;
2819 p->end_col_offset = end_col_offset;
2820 return p;
2821}
2822
2823expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002824BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002825 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002827 expr_ty p;
2828 if (!left) {
2829 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002830 "field 'left' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002831 return NULL;
2832 }
2833 if (!op) {
2834 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002835 "field 'op' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002836 return NULL;
2837 }
2838 if (!right) {
2839 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002840 "field 'right' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002841 return NULL;
2842 }
2843 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2844 if (!p)
2845 return NULL;
2846 p->kind = BinOp_kind;
2847 p->v.BinOp.left = left;
2848 p->v.BinOp.op = op;
2849 p->v.BinOp.right = right;
2850 p->lineno = lineno;
2851 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002852 p->end_lineno = end_lineno;
2853 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002854 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855}
2856
2857expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002858UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
2859 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002861 expr_ty p;
2862 if (!op) {
2863 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002864 "field 'op' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002865 return NULL;
2866 }
2867 if (!operand) {
2868 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002869 "field 'operand' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002870 return NULL;
2871 }
2872 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2873 if (!p)
2874 return NULL;
2875 p->kind = UnaryOp_kind;
2876 p->v.UnaryOp.op = op;
2877 p->v.UnaryOp.operand = operand;
2878 p->lineno = lineno;
2879 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002880 p->end_lineno = end_lineno;
2881 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002882 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883}
2884
2885expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002886Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
2887 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002889 expr_ty p;
2890 if (!args) {
2891 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002892 "field 'args' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002893 return NULL;
2894 }
2895 if (!body) {
2896 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002897 "field 'body' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002898 return NULL;
2899 }
2900 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2901 if (!p)
2902 return NULL;
2903 p->kind = Lambda_kind;
2904 p->v.Lambda.args = args;
2905 p->v.Lambda.body = body;
2906 p->lineno = lineno;
2907 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002908 p->end_lineno = end_lineno;
2909 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002910 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911}
2912
2913expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002914IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002915 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002916{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002917 expr_ty p;
2918 if (!test) {
2919 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002920 "field 'test' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002921 return NULL;
2922 }
2923 if (!body) {
2924 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002925 "field 'body' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002926 return NULL;
2927 }
2928 if (!orelse) {
2929 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002930 "field 'orelse' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002931 return NULL;
2932 }
2933 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2934 if (!p)
2935 return NULL;
2936 p->kind = IfExp_kind;
2937 p->v.IfExp.test = test;
2938 p->v.IfExp.body = body;
2939 p->v.IfExp.orelse = orelse;
2940 p->lineno = lineno;
2941 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002942 p->end_lineno = end_lineno;
2943 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002944 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002945}
2946
2947expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002948Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int
2949 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002951 expr_ty p;
2952 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2953 if (!p)
2954 return NULL;
2955 p->kind = Dict_kind;
2956 p->v.Dict.keys = keys;
2957 p->v.Dict.values = values;
2958 p->lineno = lineno;
2959 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002960 p->end_lineno = end_lineno;
2961 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002962 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963}
2964
2965expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002966Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int
2967 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002968{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002969 expr_ty p;
2970 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2971 if (!p)
2972 return NULL;
2973 p->kind = Set_kind;
2974 p->v.Set.elts = elts;
2975 p->lineno = lineno;
2976 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002977 p->end_lineno = end_lineno;
2978 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002979 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002980}
2981
2982expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002983ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2984 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002986 expr_ty p;
2987 if (!elt) {
2988 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002989 "field 'elt' is required for ListComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002990 return NULL;
2991 }
2992 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2993 if (!p)
2994 return NULL;
2995 p->kind = ListComp_kind;
2996 p->v.ListComp.elt = elt;
2997 p->v.ListComp.generators = generators;
2998 p->lineno = lineno;
2999 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003000 p->end_lineno = end_lineno;
3001 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003002 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003}
3004
3005expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003006SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
3007 end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003008{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003009 expr_ty p;
3010 if (!elt) {
3011 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003012 "field 'elt' is required for SetComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003013 return NULL;
3014 }
3015 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3016 if (!p)
3017 return NULL;
3018 p->kind = SetComp_kind;
3019 p->v.SetComp.elt = elt;
3020 p->v.SetComp.generators = generators;
3021 p->lineno = lineno;
3022 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003023 p->end_lineno = end_lineno;
3024 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003025 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003026}
3027
3028expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00003029DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003030 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00003031{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003032 expr_ty p;
3033 if (!key) {
3034 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003035 "field 'key' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003036 return NULL;
3037 }
3038 if (!value) {
3039 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003040 "field 'value' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003041 return NULL;
3042 }
3043 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3044 if (!p)
3045 return NULL;
3046 p->kind = DictComp_kind;
3047 p->v.DictComp.key = key;
3048 p->v.DictComp.value = value;
3049 p->v.DictComp.generators = generators;
3050 p->lineno = lineno;
3051 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003052 p->end_lineno = end_lineno;
3053 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003054 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00003055}
3056
3057expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003058GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003059 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003061 expr_ty p;
3062 if (!elt) {
3063 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003064 "field 'elt' is required for GeneratorExp");
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 = GeneratorExp_kind;
3071 p->v.GeneratorExp.elt = elt;
3072 p->v.GeneratorExp.generators = generators;
3073 p->lineno = lineno;
3074 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003075 p->end_lineno = end_lineno;
3076 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003077 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078}
3079
3080expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003081Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
3082 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04003083{
3084 expr_ty p;
3085 if (!value) {
3086 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003087 "field 'value' is required for Await");
Yury Selivanov75445082015-05-11 22:57:16 -04003088 return NULL;
3089 }
3090 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3091 if (!p)
3092 return NULL;
3093 p->kind = Await_kind;
3094 p->v.Await.value = value;
3095 p->lineno = lineno;
3096 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003097 p->end_lineno = end_lineno;
3098 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04003099 return p;
3100}
3101
3102expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003103Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
3104 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003106 expr_ty p;
3107 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3108 if (!p)
3109 return NULL;
3110 p->kind = Yield_kind;
3111 p->v.Yield.value = value;
3112 p->lineno = lineno;
3113 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003114 p->end_lineno = end_lineno;
3115 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003116 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117}
3118
3119expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003120YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
3121 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05003122{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003123 expr_ty p;
3124 if (!value) {
3125 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003126 "field 'value' is required for YieldFrom");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003127 return NULL;
3128 }
3129 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3130 if (!p)
3131 return NULL;
3132 p->kind = YieldFrom_kind;
3133 p->v.YieldFrom.value = value;
3134 p->lineno = lineno;
3135 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003136 p->end_lineno = end_lineno;
3137 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003138 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05003139}
3140
3141expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003142Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003143 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003145 expr_ty p;
3146 if (!left) {
3147 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003148 "field 'left' is required for Compare");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003149 return NULL;
3150 }
3151 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3152 if (!p)
3153 return NULL;
3154 p->kind = Compare_kind;
3155 p->v.Compare.left = left;
3156 p->v.Compare.ops = ops;
3157 p->v.Compare.comparators = comparators;
3158 p->lineno = lineno;
3159 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003160 p->end_lineno = end_lineno;
3161 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003162 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163}
3164
3165expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003166Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003167 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003169 expr_ty p;
3170 if (!func) {
3171 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003172 "field 'func' is required for Call");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003173 return NULL;
3174 }
3175 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3176 if (!p)
3177 return NULL;
3178 p->kind = Call_kind;
3179 p->v.Call.func = func;
3180 p->v.Call.args = args;
3181 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003182 p->lineno = lineno;
3183 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003184 p->end_lineno = end_lineno;
3185 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003186 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187}
3188
3189expr_ty
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04003190FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
3191 int col_offset, int end_lineno, int end_col_offset, PyArena
3192 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003193{
3194 expr_ty p;
3195 if (!value) {
3196 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003197 "field 'value' is required for FormattedValue");
Eric V. Smith235a6f02015-09-19 14:51:32 -04003198 return NULL;
3199 }
3200 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3201 if (!p)
3202 return NULL;
3203 p->kind = FormattedValue_kind;
3204 p->v.FormattedValue.value = value;
3205 p->v.FormattedValue.conversion = conversion;
3206 p->v.FormattedValue.format_spec = format_spec;
3207 p->lineno = lineno;
3208 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003209 p->end_lineno = end_lineno;
3210 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003211 return p;
3212}
3213
3214expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003215JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int
3216 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003217{
3218 expr_ty p;
3219 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3220 if (!p)
3221 return NULL;
3222 p->kind = JoinedStr_kind;
3223 p->v.JoinedStr.values = values;
3224 p->lineno = lineno;
3225 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003226 p->end_lineno = end_lineno;
3227 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003228 return p;
3229}
3230
3231expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003232Constant(constant value, string kind, int lineno, int col_offset, int
3233 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003234{
3235 expr_ty p;
3236 if (!value) {
3237 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003238 "field 'value' is required for Constant");
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003239 return NULL;
3240 }
3241 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3242 if (!p)
3243 return NULL;
3244 p->kind = Constant_kind;
3245 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003246 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003247 p->lineno = lineno;
3248 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003249 p->end_lineno = end_lineno;
3250 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003251 return p;
3252}
3253
3254expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003255Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003256 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003258 expr_ty p;
3259 if (!value) {
3260 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003261 "field 'value' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003262 return NULL;
3263 }
3264 if (!attr) {
3265 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003266 "field 'attr' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003267 return NULL;
3268 }
3269 if (!ctx) {
3270 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003271 "field 'ctx' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003272 return NULL;
3273 }
3274 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3275 if (!p)
3276 return NULL;
3277 p->kind = Attribute_kind;
3278 p->v.Attribute.value = value;
3279 p->v.Attribute.attr = attr;
3280 p->v.Attribute.ctx = ctx;
3281 p->lineno = lineno;
3282 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003283 p->end_lineno = end_lineno;
3284 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003285 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286}
3287
3288expr_ty
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003289Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003290 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003292 expr_ty p;
3293 if (!value) {
3294 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003295 "field 'value' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003296 return NULL;
3297 }
3298 if (!slice) {
3299 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003300 "field 'slice' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003301 return NULL;
3302 }
3303 if (!ctx) {
3304 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003305 "field 'ctx' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003306 return NULL;
3307 }
3308 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3309 if (!p)
3310 return NULL;
3311 p->kind = Subscript_kind;
3312 p->v.Subscript.value = value;
3313 p->v.Subscript.slice = slice;
3314 p->v.Subscript.ctx = ctx;
3315 p->lineno = lineno;
3316 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003317 p->end_lineno = end_lineno;
3318 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003319 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320}
3321
3322expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003323Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
3324 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00003325{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003326 expr_ty p;
3327 if (!value) {
3328 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003329 "field 'value' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003330 return NULL;
3331 }
3332 if (!ctx) {
3333 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003334 "field 'ctx' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003335 return NULL;
3336 }
3337 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3338 if (!p)
3339 return NULL;
3340 p->kind = Starred_kind;
3341 p->v.Starred.value = value;
3342 p->v.Starred.ctx = ctx;
3343 p->lineno = lineno;
3344 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003345 p->end_lineno = end_lineno;
3346 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003347 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00003348}
3349
3350expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003351Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
3352 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003354 expr_ty p;
3355 if (!id) {
3356 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003357 "field 'id' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003358 return NULL;
3359 }
3360 if (!ctx) {
3361 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003362 "field 'ctx' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003363 return NULL;
3364 }
3365 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3366 if (!p)
3367 return NULL;
3368 p->kind = Name_kind;
3369 p->v.Name.id = id;
3370 p->v.Name.ctx = ctx;
3371 p->lineno = lineno;
3372 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003373 p->end_lineno = end_lineno;
3374 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003375 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376}
3377
3378expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003379List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
3380 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003382 expr_ty p;
3383 if (!ctx) {
3384 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003385 "field 'ctx' is required for List");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003386 return NULL;
3387 }
3388 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3389 if (!p)
3390 return NULL;
3391 p->kind = List_kind;
3392 p->v.List.elts = elts;
3393 p->v.List.ctx = ctx;
3394 p->lineno = lineno;
3395 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003396 p->end_lineno = end_lineno;
3397 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003398 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399}
3400
3401expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003402Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
3403 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003405 expr_ty p;
3406 if (!ctx) {
3407 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003408 "field 'ctx' is required for Tuple");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003409 return NULL;
3410 }
3411 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3412 if (!p)
3413 return NULL;
3414 p->kind = Tuple_kind;
3415 p->v.Tuple.elts = elts;
3416 p->v.Tuple.ctx = ctx;
3417 p->lineno = lineno;
3418 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003419 p->end_lineno = end_lineno;
3420 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003421 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003422}
3423
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003424expr_ty
3425Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset,
3426 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003428 expr_ty p;
3429 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003430 if (!p)
3431 return NULL;
3432 p->kind = Slice_kind;
3433 p->v.Slice.lower = lower;
3434 p->v.Slice.upper = upper;
3435 p->v.Slice.step = step;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003436 p->lineno = lineno;
3437 p->col_offset = col_offset;
3438 p->end_lineno = end_lineno;
3439 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003440 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003441}
3442
3443comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003444comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
3445 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003446{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003447 comprehension_ty p;
3448 if (!target) {
3449 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003450 "field 'target' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003451 return NULL;
3452 }
3453 if (!iter) {
3454 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003455 "field 'iter' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003456 return NULL;
3457 }
3458 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
3459 if (!p)
3460 return NULL;
3461 p->target = target;
3462 p->iter = iter;
3463 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003464 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003465 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003466}
3467
3468excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00003469ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003470 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003471{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003472 excepthandler_ty p;
3473 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
3474 if (!p)
3475 return NULL;
3476 p->kind = ExceptHandler_kind;
3477 p->v.ExceptHandler.type = type;
3478 p->v.ExceptHandler.name = name;
3479 p->v.ExceptHandler.body = body;
3480 p->lineno = lineno;
3481 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003482 p->end_lineno = end_lineno;
3483 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003484 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003485}
3486
3487arguments_ty
Pablo Galindocd6e83b2019-07-15 01:32:18 +02003488arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty vararg, asdl_seq *
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003489 kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, asdl_seq *
3490 defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003491{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003492 arguments_ty p;
3493 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
3494 if (!p)
3495 return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003496 p->posonlyargs = posonlyargs;
Pablo Galindocd6e83b2019-07-15 01:32:18 +02003497 p->args = args;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003498 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003499 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003500 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003501 p->kwarg = kwarg;
3502 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003503 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003504}
3505
Neal Norwitzc1505362006-12-28 06:47:50 +00003506arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003507arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
3508 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00003509{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003510 arg_ty p;
3511 if (!arg) {
3512 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003513 "field 'arg' is required for arg");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003514 return NULL;
3515 }
3516 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
3517 if (!p)
3518 return NULL;
3519 p->arg = arg;
3520 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003521 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01003522 p->lineno = lineno;
3523 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003524 p->end_lineno = end_lineno;
3525 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003526 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00003527}
3528
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003529keyword_ty
Pablo Galindo168660b2020-04-02 00:47:39 +01003530keyword(identifier arg, expr_ty value, int lineno, int col_offset, int
3531 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003533 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003534 if (!value) {
3535 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003536 "field 'value' is required for keyword");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003537 return NULL;
3538 }
3539 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
3540 if (!p)
3541 return NULL;
3542 p->arg = arg;
3543 p->value = value;
Pablo Galindo168660b2020-04-02 00:47:39 +01003544 p->lineno = lineno;
3545 p->col_offset = col_offset;
3546 p->end_lineno = end_lineno;
3547 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003548 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003549}
3550
3551alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003552alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003554 alias_ty p;
3555 if (!name) {
3556 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003557 "field 'name' is required for alias");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003558 return NULL;
3559 }
3560 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
3561 if (!p)
3562 return NULL;
3563 p->name = name;
3564 p->asname = asname;
3565 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003566}
3567
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003568withitem_ty
3569withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
3570{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003571 withitem_ty p;
3572 if (!context_expr) {
3573 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003574 "field 'context_expr' is required for withitem");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003575 return NULL;
3576 }
3577 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
3578 if (!p)
3579 return NULL;
3580 p->context_expr = context_expr;
3581 p->optional_vars = optional_vars;
3582 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003583}
3584
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003585type_ignore_ty
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003586TypeIgnore(int lineno, string tag, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003587{
3588 type_ignore_ty p;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003589 if (!tag) {
3590 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003591 "field 'tag' is required for TypeIgnore");
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003592 return NULL;
3593 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003594 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
3595 if (!p)
3596 return NULL;
3597 p->kind = TypeIgnore_kind;
3598 p->v.TypeIgnore.lineno = lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003599 p->v.TypeIgnore.tag = tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003600 return p;
3601}
3602
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003603
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003604PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02003605ast2obj_mod(astmodulestate *state, void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003606{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003607 mod_ty o = (mod_ty)_o;
3608 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003609 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003610 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003611 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003612 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003613 switch (o->kind) {
3614 case Module_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003615 tp = (PyTypeObject *)state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003616 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003617 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003618 value = ast2obj_list(state, o->v.Module.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003619 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003620 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003621 goto failed;
3622 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003623 value = ast2obj_list(state, o->v.Module.type_ignores,
3624 ast2obj_type_ignore);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003625 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003626 if (PyObject_SetAttr(result, state->type_ignores, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003627 goto failed;
3628 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003629 break;
3630 case Interactive_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003631 tp = (PyTypeObject *)state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003632 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003633 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003634 value = ast2obj_list(state, o->v.Interactive.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003635 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003636 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003637 goto failed;
3638 Py_DECREF(value);
3639 break;
3640 case Expression_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003641 tp = (PyTypeObject *)state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003642 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003643 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003644 value = ast2obj_expr(state, o->v.Expression.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003645 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003646 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003647 goto failed;
3648 Py_DECREF(value);
3649 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003650 case FunctionType_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003651 tp = (PyTypeObject *)state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003652 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003653 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003654 value = ast2obj_list(state, o->v.FunctionType.argtypes, ast2obj_expr);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003655 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003656 if (PyObject_SetAttr(result, state->argtypes, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003657 goto failed;
3658 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003659 value = ast2obj_expr(state, o->v.FunctionType.returns);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003660 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003661 if (PyObject_SetAttr(result, state->returns, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003662 goto failed;
3663 Py_DECREF(value);
3664 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003665 }
3666 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003667failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003668 Py_XDECREF(value);
3669 Py_XDECREF(result);
3670 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671}
3672
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003673PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02003674ast2obj_stmt(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003675{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003676 stmt_ty o = (stmt_ty)_o;
3677 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003678 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003679 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003680 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003681 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003682 switch (o->kind) {
3683 case FunctionDef_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003684 tp = (PyTypeObject *)state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003685 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003686 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003687 value = ast2obj_identifier(state, o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003688 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003689 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003690 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003691 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003692 value = ast2obj_arguments(state, o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003693 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003694 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003695 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003696 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003697 value = ast2obj_list(state, o->v.FunctionDef.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003698 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003699 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003700 goto failed;
3701 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003702 value = ast2obj_list(state, o->v.FunctionDef.decorator_list,
3703 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003704 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003705 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003706 goto failed;
3707 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003708 value = ast2obj_expr(state, o->v.FunctionDef.returns);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003709 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003710 if (PyObject_SetAttr(result, state->returns, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003711 goto failed;
3712 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003713 value = ast2obj_string(state, o->v.FunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003714 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003715 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003716 goto failed;
3717 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003718 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003719 case AsyncFunctionDef_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003720 tp = (PyTypeObject *)state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003721 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003722 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003723 value = ast2obj_identifier(state, o->v.AsyncFunctionDef.name);
Yury Selivanov75445082015-05-11 22:57:16 -04003724 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003725 if (PyObject_SetAttr(result, state->name, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003726 goto failed;
3727 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003728 value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args);
Yury Selivanov75445082015-05-11 22:57:16 -04003729 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003730 if (PyObject_SetAttr(result, state->args, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003731 goto failed;
3732 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003733 value = ast2obj_list(state, o->v.AsyncFunctionDef.body, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003734 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003735 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003736 goto failed;
3737 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003738 value = ast2obj_list(state, o->v.AsyncFunctionDef.decorator_list,
Yury Selivanov75445082015-05-11 22:57:16 -04003739 ast2obj_expr);
3740 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003741 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003742 goto failed;
3743 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003744 value = ast2obj_expr(state, o->v.AsyncFunctionDef.returns);
Yury Selivanov75445082015-05-11 22:57:16 -04003745 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003746 if (PyObject_SetAttr(result, state->returns, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003747 goto failed;
3748 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003749 value = ast2obj_string(state, o->v.AsyncFunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003750 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003751 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003752 goto failed;
3753 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003754 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003755 case ClassDef_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003756 tp = (PyTypeObject *)state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003757 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003758 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003759 value = ast2obj_identifier(state, o->v.ClassDef.name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003760 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003761 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003762 goto failed;
3763 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003764 value = ast2obj_list(state, o->v.ClassDef.bases, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003765 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003766 if (PyObject_SetAttr(result, state->bases, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003767 goto failed;
3768 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003769 value = ast2obj_list(state, o->v.ClassDef.keywords, ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003770 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003771 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003772 goto failed;
3773 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003774 value = ast2obj_list(state, o->v.ClassDef.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003775 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003776 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003777 goto failed;
3778 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003779 value = ast2obj_list(state, o->v.ClassDef.decorator_list, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003780 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003781 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003782 goto failed;
3783 Py_DECREF(value);
3784 break;
3785 case Return_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003786 tp = (PyTypeObject *)state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003787 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003788 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003789 value = ast2obj_expr(state, o->v.Return.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003790 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003791 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003792 goto failed;
3793 Py_DECREF(value);
3794 break;
3795 case Delete_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003796 tp = (PyTypeObject *)state->Delete_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;
Victor Stinnerf8599272020-07-03 16:57:19 +02003799 value = ast2obj_list(state, o->v.Delete.targets, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003800 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003801 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003802 goto failed;
3803 Py_DECREF(value);
3804 break;
3805 case Assign_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003806 tp = (PyTypeObject *)state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003807 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003808 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003809 value = ast2obj_list(state, o->v.Assign.targets, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003810 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003811 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003812 goto failed;
3813 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003814 value = ast2obj_expr(state, o->v.Assign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003815 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003816 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003817 goto failed;
3818 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003819 value = ast2obj_string(state, o->v.Assign.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003820 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003821 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003822 goto failed;
3823 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003824 break;
3825 case AugAssign_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003826 tp = (PyTypeObject *)state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003827 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003828 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003829 value = ast2obj_expr(state, o->v.AugAssign.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003830 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003831 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003832 goto failed;
3833 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003834 value = ast2obj_operator(state, o->v.AugAssign.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003835 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003836 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003837 goto failed;
3838 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003839 value = ast2obj_expr(state, o->v.AugAssign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003840 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003841 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003842 goto failed;
3843 Py_DECREF(value);
3844 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003845 case AnnAssign_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003846 tp = (PyTypeObject *)state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003847 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003848 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003849 value = ast2obj_expr(state, o->v.AnnAssign.target);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003850 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003851 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003852 goto failed;
3853 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003854 value = ast2obj_expr(state, o->v.AnnAssign.annotation);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003855 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003856 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003857 goto failed;
3858 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003859 value = ast2obj_expr(state, o->v.AnnAssign.value);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003860 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003861 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003862 goto failed;
3863 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003864 value = ast2obj_int(state, o->v.AnnAssign.simple);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003865 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003866 if (PyObject_SetAttr(result, state->simple, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003867 goto failed;
3868 Py_DECREF(value);
3869 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003870 case For_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003871 tp = (PyTypeObject *)state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003872 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003873 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003874 value = ast2obj_expr(state, o->v.For.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003875 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003876 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003877 goto failed;
3878 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003879 value = ast2obj_expr(state, o->v.For.iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003880 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003881 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003882 goto failed;
3883 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003884 value = ast2obj_list(state, o->v.For.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003885 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003886 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003887 goto failed;
3888 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003889 value = ast2obj_list(state, o->v.For.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003890 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003891 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003892 goto failed;
3893 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003894 value = ast2obj_string(state, o->v.For.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003895 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003896 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003897 goto failed;
3898 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003899 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003900 case AsyncFor_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003901 tp = (PyTypeObject *)state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003902 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003903 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003904 value = ast2obj_expr(state, o->v.AsyncFor.target);
Yury Selivanov75445082015-05-11 22:57:16 -04003905 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003906 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003907 goto failed;
3908 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003909 value = ast2obj_expr(state, o->v.AsyncFor.iter);
Yury Selivanov75445082015-05-11 22:57:16 -04003910 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003911 if (PyObject_SetAttr(result, state->iter, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003912 goto failed;
3913 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003914 value = ast2obj_list(state, o->v.AsyncFor.body, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003915 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003916 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003917 goto failed;
3918 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003919 value = ast2obj_list(state, o->v.AsyncFor.orelse, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003920 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003921 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003922 goto failed;
3923 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003924 value = ast2obj_string(state, o->v.AsyncFor.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003925 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003926 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003927 goto failed;
3928 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003929 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003930 case While_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003931 tp = (PyTypeObject *)state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003932 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003933 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003934 value = ast2obj_expr(state, o->v.While.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003935 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003936 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003937 goto failed;
3938 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003939 value = ast2obj_list(state, o->v.While.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003940 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003941 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003942 goto failed;
3943 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003944 value = ast2obj_list(state, o->v.While.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003945 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003946 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003947 goto failed;
3948 Py_DECREF(value);
3949 break;
3950 case If_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003951 tp = (PyTypeObject *)state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003952 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003953 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003954 value = ast2obj_expr(state, o->v.If.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003955 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003956 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003957 goto failed;
3958 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003959 value = ast2obj_list(state, o->v.If.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003960 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003961 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003962 goto failed;
3963 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003964 value = ast2obj_list(state, o->v.If.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003965 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003966 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003967 goto failed;
3968 Py_DECREF(value);
3969 break;
3970 case With_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003971 tp = (PyTypeObject *)state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003972 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003973 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003974 value = ast2obj_list(state, o->v.With.items, ast2obj_withitem);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003975 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003976 if (PyObject_SetAttr(result, state->items, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003977 goto failed;
3978 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003979 value = ast2obj_list(state, o->v.With.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003980 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003981 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003982 goto failed;
3983 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003984 value = ast2obj_string(state, o->v.With.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003985 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003986 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003987 goto failed;
3988 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003989 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003990 case AsyncWith_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003991 tp = (PyTypeObject *)state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003992 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003993 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003994 value = ast2obj_list(state, o->v.AsyncWith.items, ast2obj_withitem);
Yury Selivanov75445082015-05-11 22:57:16 -04003995 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003996 if (PyObject_SetAttr(result, state->items, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003997 goto failed;
3998 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003999 value = ast2obj_list(state, o->v.AsyncWith.body, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04004000 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004001 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04004002 goto failed;
4003 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004004 value = ast2obj_string(state, o->v.AsyncWith.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004005 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004006 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004007 goto failed;
4008 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04004009 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004010 case Raise_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004011 tp = (PyTypeObject *)state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004012 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004013 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004014 value = ast2obj_expr(state, o->v.Raise.exc);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004015 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004016 if (PyObject_SetAttr(result, state->exc, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004017 goto failed;
4018 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004019 value = ast2obj_expr(state, o->v.Raise.cause);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004020 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004021 if (PyObject_SetAttr(result, state->cause, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004022 goto failed;
4023 Py_DECREF(value);
4024 break;
4025 case Try_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004026 tp = (PyTypeObject *)state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004027 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004028 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004029 value = ast2obj_list(state, o->v.Try.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004030 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004031 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004032 goto failed;
4033 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004034 value = ast2obj_list(state, o->v.Try.handlers, ast2obj_excepthandler);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004035 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004036 if (PyObject_SetAttr(result, state->handlers, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004037 goto failed;
4038 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004039 value = ast2obj_list(state, o->v.Try.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004040 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004041 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004042 goto failed;
4043 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004044 value = ast2obj_list(state, o->v.Try.finalbody, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004045 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004046 if (PyObject_SetAttr(result, state->finalbody, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004047 goto failed;
4048 Py_DECREF(value);
4049 break;
4050 case Assert_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004051 tp = (PyTypeObject *)state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004052 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004053 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004054 value = ast2obj_expr(state, o->v.Assert.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004055 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004056 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004057 goto failed;
4058 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004059 value = ast2obj_expr(state, o->v.Assert.msg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004060 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004061 if (PyObject_SetAttr(result, state->msg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004062 goto failed;
4063 Py_DECREF(value);
4064 break;
4065 case Import_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004066 tp = (PyTypeObject *)state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004067 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004068 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004069 value = ast2obj_list(state, o->v.Import.names, ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004070 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004071 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004072 goto failed;
4073 Py_DECREF(value);
4074 break;
4075 case ImportFrom_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004076 tp = (PyTypeObject *)state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004077 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004078 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004079 value = ast2obj_identifier(state, o->v.ImportFrom.module);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004080 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004081 if (PyObject_SetAttr(result, state->module, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 goto failed;
4083 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004084 value = ast2obj_list(state, o->v.ImportFrom.names, ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004085 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004086 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004087 goto failed;
4088 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004089 value = ast2obj_int(state, o->v.ImportFrom.level);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004090 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004091 if (PyObject_SetAttr(result, state->level, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004092 goto failed;
4093 Py_DECREF(value);
4094 break;
4095 case Global_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004096 tp = (PyTypeObject *)state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004097 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004098 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004099 value = ast2obj_list(state, o->v.Global.names, ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004100 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004101 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004102 goto failed;
4103 Py_DECREF(value);
4104 break;
4105 case Nonlocal_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004106 tp = (PyTypeObject *)state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004107 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004108 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004109 value = ast2obj_list(state, o->v.Nonlocal.names, ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004110 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004111 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004112 goto failed;
4113 Py_DECREF(value);
4114 break;
4115 case Expr_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004116 tp = (PyTypeObject *)state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004117 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004118 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004119 value = ast2obj_expr(state, o->v.Expr.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004120 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004121 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004122 goto failed;
4123 Py_DECREF(value);
4124 break;
4125 case Pass_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004126 tp = (PyTypeObject *)state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004127 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004128 if (!result) goto failed;
4129 break;
4130 case Break_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004131 tp = (PyTypeObject *)state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004132 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004133 if (!result) goto failed;
4134 break;
4135 case Continue_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004136 tp = (PyTypeObject *)state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004137 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004138 if (!result) goto failed;
4139 break;
4140 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004141 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004142 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004143 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004144 goto failed;
4145 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004146 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004147 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004148 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004149 goto failed;
4150 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004151 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004152 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004153 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004154 goto failed;
4155 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004156 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004157 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004158 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004159 goto failed;
4160 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004161 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004162failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004163 Py_XDECREF(value);
4164 Py_XDECREF(result);
4165 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004166}
4167
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004168PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004169ast2obj_expr(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004170{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004171 expr_ty o = (expr_ty)_o;
4172 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004173 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004174 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004175 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004176 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004177 switch (o->kind) {
4178 case BoolOp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004179 tp = (PyTypeObject *)state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004180 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004181 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004182 value = ast2obj_boolop(state, o->v.BoolOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004183 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004184 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004185 goto failed;
4186 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004187 value = ast2obj_list(state, o->v.BoolOp.values, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004188 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004189 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004190 goto failed;
4191 Py_DECREF(value);
4192 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004193 case NamedExpr_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004194 tp = (PyTypeObject *)state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004195 result = PyType_GenericNew(tp, NULL, NULL);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004196 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004197 value = ast2obj_expr(state, o->v.NamedExpr.target);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004198 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004199 if (PyObject_SetAttr(result, state->target, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004200 goto failed;
4201 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004202 value = ast2obj_expr(state, o->v.NamedExpr.value);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004203 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004204 if (PyObject_SetAttr(result, state->value, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004205 goto failed;
4206 Py_DECREF(value);
4207 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004208 case BinOp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004209 tp = (PyTypeObject *)state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004210 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004211 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004212 value = ast2obj_expr(state, o->v.BinOp.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004213 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004214 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004215 goto failed;
4216 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004217 value = ast2obj_operator(state, o->v.BinOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004218 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004219 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004220 goto failed;
4221 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004222 value = ast2obj_expr(state, o->v.BinOp.right);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004223 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004224 if (PyObject_SetAttr(result, state->right, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004225 goto failed;
4226 Py_DECREF(value);
4227 break;
4228 case UnaryOp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004229 tp = (PyTypeObject *)state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004230 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004231 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004232 value = ast2obj_unaryop(state, o->v.UnaryOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004233 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004234 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004235 goto failed;
4236 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004237 value = ast2obj_expr(state, o->v.UnaryOp.operand);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004238 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004239 if (PyObject_SetAttr(result, state->operand, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004240 goto failed;
4241 Py_DECREF(value);
4242 break;
4243 case Lambda_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004244 tp = (PyTypeObject *)state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004245 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004246 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004247 value = ast2obj_arguments(state, o->v.Lambda.args);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004248 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004249 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004250 goto failed;
4251 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004252 value = ast2obj_expr(state, o->v.Lambda.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004253 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004254 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004255 goto failed;
4256 Py_DECREF(value);
4257 break;
4258 case IfExp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004259 tp = (PyTypeObject *)state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004260 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004261 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004262 value = ast2obj_expr(state, o->v.IfExp.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004263 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004264 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004265 goto failed;
4266 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004267 value = ast2obj_expr(state, o->v.IfExp.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004268 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004269 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004270 goto failed;
4271 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004272 value = ast2obj_expr(state, o->v.IfExp.orelse);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004273 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004274 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004275 goto failed;
4276 Py_DECREF(value);
4277 break;
4278 case Dict_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004279 tp = (PyTypeObject *)state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004280 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004281 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004282 value = ast2obj_list(state, o->v.Dict.keys, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004283 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004284 if (PyObject_SetAttr(result, state->keys, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004285 goto failed;
4286 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004287 value = ast2obj_list(state, o->v.Dict.values, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004288 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004289 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004290 goto failed;
4291 Py_DECREF(value);
4292 break;
4293 case Set_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004294 tp = (PyTypeObject *)state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004295 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004296 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004297 value = ast2obj_list(state, o->v.Set.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004298 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004299 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004300 goto failed;
4301 Py_DECREF(value);
4302 break;
4303 case ListComp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004304 tp = (PyTypeObject *)state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004305 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004306 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004307 value = ast2obj_expr(state, o->v.ListComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004308 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004309 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004310 goto failed;
4311 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004312 value = ast2obj_list(state, o->v.ListComp.generators,
4313 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004314 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004315 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004316 goto failed;
4317 Py_DECREF(value);
4318 break;
4319 case SetComp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004320 tp = (PyTypeObject *)state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004321 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004322 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004323 value = ast2obj_expr(state, o->v.SetComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004324 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004325 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004326 goto failed;
4327 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004328 value = ast2obj_list(state, o->v.SetComp.generators,
4329 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004330 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004331 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004332 goto failed;
4333 Py_DECREF(value);
4334 break;
4335 case DictComp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004336 tp = (PyTypeObject *)state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004337 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004338 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004339 value = ast2obj_expr(state, o->v.DictComp.key);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004340 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004341 if (PyObject_SetAttr(result, state->key, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004342 goto failed;
4343 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004344 value = ast2obj_expr(state, o->v.DictComp.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004345 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004346 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004347 goto failed;
4348 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004349 value = ast2obj_list(state, o->v.DictComp.generators,
4350 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004351 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004352 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004353 goto failed;
4354 Py_DECREF(value);
4355 break;
4356 case GeneratorExp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004357 tp = (PyTypeObject *)state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004358 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004359 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004360 value = ast2obj_expr(state, o->v.GeneratorExp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004361 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004362 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004363 goto failed;
4364 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004365 value = ast2obj_list(state, o->v.GeneratorExp.generators,
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004366 ast2obj_comprehension);
4367 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004368 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004369 goto failed;
4370 Py_DECREF(value);
4371 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004372 case Await_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004373 tp = (PyTypeObject *)state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004374 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04004375 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004376 value = ast2obj_expr(state, o->v.Await.value);
Yury Selivanov75445082015-05-11 22:57:16 -04004377 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004378 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04004379 goto failed;
4380 Py_DECREF(value);
4381 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004382 case Yield_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004383 tp = (PyTypeObject *)state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004384 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004385 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004386 value = ast2obj_expr(state, o->v.Yield.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004387 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004388 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004389 goto failed;
4390 Py_DECREF(value);
4391 break;
4392 case YieldFrom_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004393 tp = (PyTypeObject *)state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004394 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004395 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004396 value = ast2obj_expr(state, o->v.YieldFrom.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004397 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004398 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004399 goto failed;
4400 Py_DECREF(value);
4401 break;
4402 case Compare_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004403 tp = (PyTypeObject *)state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004404 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004405 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004406 value = ast2obj_expr(state, o->v.Compare.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004407 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004408 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004409 goto failed;
4410 Py_DECREF(value);
4411 {
4412 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
4413 value = PyList_New(n);
4414 if (!value) goto failed;
4415 for(i = 0; i < n; i++)
Victor Stinnerf8599272020-07-03 16:57:19 +02004416 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 +00004417 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00004418 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004419 if (PyObject_SetAttr(result, state->ops, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004420 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004421 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004422 value = ast2obj_list(state, o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00004423 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004424 if (PyObject_SetAttr(result, state->comparators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004425 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004426 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004427 break;
4428 case Call_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004429 tp = (PyTypeObject *)state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004430 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004431 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004432 value = ast2obj_expr(state, o->v.Call.func);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004433 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004434 if (PyObject_SetAttr(result, state->func, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004435 goto failed;
4436 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004437 value = ast2obj_list(state, o->v.Call.args, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004438 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004439 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004440 goto failed;
4441 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004442 value = ast2obj_list(state, o->v.Call.keywords, ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004443 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004444 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004445 goto failed;
4446 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004447 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004448 case FormattedValue_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004449 tp = (PyTypeObject *)state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004450 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004451 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004452 value = ast2obj_expr(state, o->v.FormattedValue.value);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004453 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004454 if (PyObject_SetAttr(result, state->value, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004455 goto failed;
4456 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004457 value = ast2obj_int(state, o->v.FormattedValue.conversion);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004458 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004459 if (PyObject_SetAttr(result, state->conversion, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004460 goto failed;
4461 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004462 value = ast2obj_expr(state, o->v.FormattedValue.format_spec);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004463 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004464 if (PyObject_SetAttr(result, state->format_spec, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004465 goto failed;
4466 Py_DECREF(value);
4467 break;
4468 case JoinedStr_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004469 tp = (PyTypeObject *)state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004470 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004471 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004472 value = ast2obj_list(state, o->v.JoinedStr.values, ast2obj_expr);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004473 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004474 if (PyObject_SetAttr(result, state->values, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004475 goto failed;
4476 Py_DECREF(value);
4477 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004478 case Constant_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004479 tp = (PyTypeObject *)state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004480 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004481 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004482 value = ast2obj_constant(state, o->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004483 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004484 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004485 goto failed;
4486 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004487 value = ast2obj_string(state, o->v.Constant.kind);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004488 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004489 if (PyObject_SetAttr(result, state->kind, value) == -1)
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004490 goto failed;
4491 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004492 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004493 case Attribute_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004494 tp = (PyTypeObject *)state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004495 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004496 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004497 value = ast2obj_expr(state, o->v.Attribute.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004498 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004499 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004500 goto failed;
4501 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004502 value = ast2obj_identifier(state, o->v.Attribute.attr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004503 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004504 if (PyObject_SetAttr(result, state->attr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004505 goto failed;
4506 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004507 value = ast2obj_expr_context(state, o->v.Attribute.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004508 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004509 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004510 goto failed;
4511 Py_DECREF(value);
4512 break;
4513 case Subscript_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004514 tp = (PyTypeObject *)state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004515 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004516 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004517 value = ast2obj_expr(state, o->v.Subscript.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004518 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004519 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004520 goto failed;
4521 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004522 value = ast2obj_expr(state, o->v.Subscript.slice);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004523 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004524 if (PyObject_SetAttr(result, state->slice, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004525 goto failed;
4526 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004527 value = ast2obj_expr_context(state, o->v.Subscript.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004528 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004529 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004530 goto failed;
4531 Py_DECREF(value);
4532 break;
4533 case Starred_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004534 tp = (PyTypeObject *)state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004535 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004536 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004537 value = ast2obj_expr(state, o->v.Starred.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004538 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004539 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004540 goto failed;
4541 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004542 value = ast2obj_expr_context(state, o->v.Starred.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004543 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004544 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004545 goto failed;
4546 Py_DECREF(value);
4547 break;
4548 case Name_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004549 tp = (PyTypeObject *)state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004550 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004551 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004552 value = ast2obj_identifier(state, o->v.Name.id);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004553 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004554 if (PyObject_SetAttr(result, state->id, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004555 goto failed;
4556 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004557 value = ast2obj_expr_context(state, o->v.Name.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004558 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004559 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004560 goto failed;
4561 Py_DECREF(value);
4562 break;
4563 case List_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004564 tp = (PyTypeObject *)state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004565 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004566 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004567 value = ast2obj_list(state, o->v.List.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004568 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004569 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004570 goto failed;
4571 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004572 value = ast2obj_expr_context(state, o->v.List.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004573 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004574 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004575 goto failed;
4576 Py_DECREF(value);
4577 break;
4578 case Tuple_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004579 tp = (PyTypeObject *)state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004580 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004581 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004582 value = ast2obj_list(state, o->v.Tuple.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004583 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004584 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004585 goto failed;
4586 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004587 value = ast2obj_expr_context(state, o->v.Tuple.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004588 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004589 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004590 goto failed;
4591 Py_DECREF(value);
4592 break;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004593 case Slice_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004594 tp = (PyTypeObject *)state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004595 result = PyType_GenericNew(tp, NULL, NULL);
4596 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004597 value = ast2obj_expr(state, o->v.Slice.lower);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004598 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004599 if (PyObject_SetAttr(result, state->lower, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004600 goto failed;
4601 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004602 value = ast2obj_expr(state, o->v.Slice.upper);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004603 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004604 if (PyObject_SetAttr(result, state->upper, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004605 goto failed;
4606 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004607 value = ast2obj_expr(state, o->v.Slice.step);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004608 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004609 if (PyObject_SetAttr(result, state->step, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004610 goto failed;
4611 Py_DECREF(value);
4612 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004613 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004614 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004615 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004616 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004617 goto failed;
4618 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004619 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004620 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004621 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004622 goto failed;
4623 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004624 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004625 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004626 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004627 goto failed;
4628 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004629 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004630 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004631 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004632 goto failed;
4633 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004634 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004635failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004636 Py_XDECREF(value);
4637 Py_XDECREF(result);
4638 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004639}
4640
Victor Stinnerf8599272020-07-03 16:57:19 +02004641PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004642{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004643 switch(o) {
4644 case Load:
Victor Stinnerf8599272020-07-03 16:57:19 +02004645 Py_INCREF(state->Load_singleton);
4646 return state->Load_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004647 case Store:
Victor Stinnerf8599272020-07-03 16:57:19 +02004648 Py_INCREF(state->Store_singleton);
4649 return state->Store_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004650 case Del:
Victor Stinnerf8599272020-07-03 16:57:19 +02004651 Py_INCREF(state->Del_singleton);
4652 return state->Del_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004653 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004654 Py_UNREACHABLE();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004655}
Victor Stinnerf8599272020-07-03 16:57:19 +02004656PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004657{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004658 switch(o) {
4659 case And:
Victor Stinnerf8599272020-07-03 16:57:19 +02004660 Py_INCREF(state->And_singleton);
4661 return state->And_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004662 case Or:
Victor Stinnerf8599272020-07-03 16:57:19 +02004663 Py_INCREF(state->Or_singleton);
4664 return state->Or_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004665 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004666 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004667}
Victor Stinnerf8599272020-07-03 16:57:19 +02004668PyObject* ast2obj_operator(astmodulestate *state, operator_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004669{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004670 switch(o) {
4671 case Add:
Victor Stinnerf8599272020-07-03 16:57:19 +02004672 Py_INCREF(state->Add_singleton);
4673 return state->Add_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004674 case Sub:
Victor Stinnerf8599272020-07-03 16:57:19 +02004675 Py_INCREF(state->Sub_singleton);
4676 return state->Sub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004677 case Mult:
Victor Stinnerf8599272020-07-03 16:57:19 +02004678 Py_INCREF(state->Mult_singleton);
4679 return state->Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04004680 case MatMult:
Victor Stinnerf8599272020-07-03 16:57:19 +02004681 Py_INCREF(state->MatMult_singleton);
4682 return state->MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004683 case Div:
Victor Stinnerf8599272020-07-03 16:57:19 +02004684 Py_INCREF(state->Div_singleton);
4685 return state->Div_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004686 case Mod:
Victor Stinnerf8599272020-07-03 16:57:19 +02004687 Py_INCREF(state->Mod_singleton);
4688 return state->Mod_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004689 case Pow:
Victor Stinnerf8599272020-07-03 16:57:19 +02004690 Py_INCREF(state->Pow_singleton);
4691 return state->Pow_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004692 case LShift:
Victor Stinnerf8599272020-07-03 16:57:19 +02004693 Py_INCREF(state->LShift_singleton);
4694 return state->LShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004695 case RShift:
Victor Stinnerf8599272020-07-03 16:57:19 +02004696 Py_INCREF(state->RShift_singleton);
4697 return state->RShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004698 case BitOr:
Victor Stinnerf8599272020-07-03 16:57:19 +02004699 Py_INCREF(state->BitOr_singleton);
4700 return state->BitOr_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004701 case BitXor:
Victor Stinnerf8599272020-07-03 16:57:19 +02004702 Py_INCREF(state->BitXor_singleton);
4703 return state->BitXor_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004704 case BitAnd:
Victor Stinnerf8599272020-07-03 16:57:19 +02004705 Py_INCREF(state->BitAnd_singleton);
4706 return state->BitAnd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004707 case FloorDiv:
Victor Stinnerf8599272020-07-03 16:57:19 +02004708 Py_INCREF(state->FloorDiv_singleton);
4709 return state->FloorDiv_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004710 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004711 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004712}
Victor Stinnerf8599272020-07-03 16:57:19 +02004713PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004714{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004715 switch(o) {
4716 case Invert:
Victor Stinnerf8599272020-07-03 16:57:19 +02004717 Py_INCREF(state->Invert_singleton);
4718 return state->Invert_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004719 case Not:
Victor Stinnerf8599272020-07-03 16:57:19 +02004720 Py_INCREF(state->Not_singleton);
4721 return state->Not_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004722 case UAdd:
Victor Stinnerf8599272020-07-03 16:57:19 +02004723 Py_INCREF(state->UAdd_singleton);
4724 return state->UAdd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004725 case USub:
Victor Stinnerf8599272020-07-03 16:57:19 +02004726 Py_INCREF(state->USub_singleton);
4727 return state->USub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004728 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004729 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004730}
Victor Stinnerf8599272020-07-03 16:57:19 +02004731PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004732{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004733 switch(o) {
4734 case Eq:
Victor Stinnerf8599272020-07-03 16:57:19 +02004735 Py_INCREF(state->Eq_singleton);
4736 return state->Eq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004737 case NotEq:
Victor Stinnerf8599272020-07-03 16:57:19 +02004738 Py_INCREF(state->NotEq_singleton);
4739 return state->NotEq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004740 case Lt:
Victor Stinnerf8599272020-07-03 16:57:19 +02004741 Py_INCREF(state->Lt_singleton);
4742 return state->Lt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004743 case LtE:
Victor Stinnerf8599272020-07-03 16:57:19 +02004744 Py_INCREF(state->LtE_singleton);
4745 return state->LtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004746 case Gt:
Victor Stinnerf8599272020-07-03 16:57:19 +02004747 Py_INCREF(state->Gt_singleton);
4748 return state->Gt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004749 case GtE:
Victor Stinnerf8599272020-07-03 16:57:19 +02004750 Py_INCREF(state->GtE_singleton);
4751 return state->GtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004752 case Is:
Victor Stinnerf8599272020-07-03 16:57:19 +02004753 Py_INCREF(state->Is_singleton);
4754 return state->Is_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004755 case IsNot:
Victor Stinnerf8599272020-07-03 16:57:19 +02004756 Py_INCREF(state->IsNot_singleton);
4757 return state->IsNot_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004758 case In:
Victor Stinnerf8599272020-07-03 16:57:19 +02004759 Py_INCREF(state->In_singleton);
4760 return state->In_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004761 case NotIn:
Victor Stinnerf8599272020-07-03 16:57:19 +02004762 Py_INCREF(state->NotIn_singleton);
4763 return state->NotIn_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004764 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004765 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004766}
4767PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004768ast2obj_comprehension(astmodulestate *state, void* _o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004769{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004770 comprehension_ty o = (comprehension_ty)_o;
4771 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004772 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004774 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004775 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004776 tp = (PyTypeObject *)state->comprehension_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004777 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004778 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004779 value = ast2obj_expr(state, o->target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004780 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004781 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004782 goto failed;
4783 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004784 value = ast2obj_expr(state, o->iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004785 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004786 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004787 goto failed;
4788 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004789 value = ast2obj_list(state, o->ifs, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004790 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004791 if (PyObject_SetAttr(result, state->ifs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004792 goto failed;
4793 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004794 value = ast2obj_int(state, o->is_async);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004795 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004796 if (PyObject_SetAttr(result, state->is_async, value) == -1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004797 goto failed;
4798 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004799 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004800failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004801 Py_XDECREF(value);
4802 Py_XDECREF(result);
4803 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004804}
4805
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004806PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004807ast2obj_excepthandler(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004808{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004809 excepthandler_ty o = (excepthandler_ty)_o;
4810 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004811 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004812 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004813 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004814 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004815 switch (o->kind) {
4816 case ExceptHandler_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004817 tp = (PyTypeObject *)state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004818 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004819 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004820 value = ast2obj_expr(state, o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004821 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004822 if (PyObject_SetAttr(result, state->type, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004823 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004824 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004825 value = ast2obj_identifier(state, o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004826 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004827 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004828 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004829 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004830 value = ast2obj_list(state, o->v.ExceptHandler.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004831 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004832 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004833 goto failed;
4834 Py_DECREF(value);
4835 break;
4836 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004837 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004838 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004839 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004840 goto failed;
4841 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004842 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004843 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004844 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004845 goto failed;
4846 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004847 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004848 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004849 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004850 goto failed;
4851 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004852 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004853 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004854 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004855 goto failed;
4856 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004857 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004858failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004859 Py_XDECREF(value);
4860 Py_XDECREF(result);
4861 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004862}
4863
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004864PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004865ast2obj_arguments(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004866{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004867 arguments_ty o = (arguments_ty)_o;
4868 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004869 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004870 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004871 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004872 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004873 tp = (PyTypeObject *)state->arguments_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004874 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004875 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004876 value = ast2obj_list(state, o->posonlyargs, ast2obj_arg);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004877 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004878 if (PyObject_SetAttr(result, state->posonlyargs, value) == -1)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004879 goto failed;
4880 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004881 value = ast2obj_list(state, o->args, ast2obj_arg);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004882 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004883 if (PyObject_SetAttr(result, state->args, value) == -1)
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004884 goto failed;
4885 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004886 value = ast2obj_arg(state, o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004887 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004888 if (PyObject_SetAttr(result, state->vararg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004889 goto failed;
4890 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004891 value = ast2obj_list(state, o->kwonlyargs, ast2obj_arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004892 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004893 if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004894 goto failed;
4895 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004896 value = ast2obj_list(state, o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004897 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004898 if (PyObject_SetAttr(result, state->kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004899 goto failed;
4900 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004901 value = ast2obj_arg(state, o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004902 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004903 if (PyObject_SetAttr(result, state->kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004904 goto failed;
4905 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004906 value = ast2obj_list(state, o->defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004907 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004908 if (PyObject_SetAttr(result, state->defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004909 goto failed;
4910 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004911 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004912failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004913 Py_XDECREF(value);
4914 Py_XDECREF(result);
4915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004916}
4917
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004918PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004919ast2obj_arg(astmodulestate *state, void* _o)
Neal Norwitzc1505362006-12-28 06:47:50 +00004920{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004921 arg_ty o = (arg_ty)_o;
4922 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004923 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004924 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004925 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004926 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004927 tp = (PyTypeObject *)state->arg_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004928 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004929 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004930 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004931 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004932 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004933 goto failed;
4934 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004935 value = ast2obj_expr(state, o->annotation);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004936 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004937 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004938 goto failed;
4939 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004940 value = ast2obj_string(state, o->type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004941 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004942 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004943 goto failed;
4944 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004945 value = ast2obj_int(state, o->lineno);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004946 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004947 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004948 goto failed;
4949 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004950 value = ast2obj_int(state, o->col_offset);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004951 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004952 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004953 goto failed;
4954 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004955 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004956 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004957 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004958 goto failed;
4959 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004960 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004961 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004962 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004963 goto failed;
4964 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004965 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004966failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004967 Py_XDECREF(value);
4968 Py_XDECREF(result);
4969 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004970}
4971
4972PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004973ast2obj_keyword(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004974{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004975 keyword_ty o = (keyword_ty)_o;
4976 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004977 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004978 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004979 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004980 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004981 tp = (PyTypeObject *)state->keyword_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004982 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004983 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004984 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004985 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004986 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004987 goto failed;
4988 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004989 value = ast2obj_expr(state, o->value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004990 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004991 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004992 goto failed;
4993 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004994 value = ast2obj_int(state, o->lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01004995 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004996 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004997 goto failed;
4998 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004999 value = ast2obj_int(state, o->col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01005000 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005001 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01005002 goto failed;
5003 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005004 value = ast2obj_int(state, o->end_lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01005005 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005006 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01005007 goto failed;
5008 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005009 value = ast2obj_int(state, o->end_col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01005010 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005011 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01005012 goto failed;
5013 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005014 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005015failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005016 Py_XDECREF(value);
5017 Py_XDECREF(result);
5018 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005019}
5020
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005021PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02005022ast2obj_alias(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005023{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005024 alias_ty o = (alias_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 Stinnerf8599272020-07-03 16:57:19 +02005030 tp = (PyTypeObject *)state->alias_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 Stinnerf8599272020-07-03 16:57:19 +02005033 value = ast2obj_identifier(state, o->name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005034 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005035 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005036 goto failed;
5037 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005038 value = ast2obj_identifier(state, o->asname);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005039 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005040 if (PyObject_SetAttr(result, state->asname, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005041 goto failed;
5042 Py_DECREF(value);
5043 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005044failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005045 Py_XDECREF(value);
5046 Py_XDECREF(result);
5047 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005048}
5049
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005050PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02005051ast2obj_withitem(astmodulestate *state, void* _o)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005052{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005053 withitem_ty o = (withitem_ty)_o;
5054 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005055 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005056 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005057 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005058 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005059 tp = (PyTypeObject *)state->withitem_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005060 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005061 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02005062 value = ast2obj_expr(state, o->context_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005063 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005064 if (PyObject_SetAttr(result, state->context_expr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005065 goto failed;
5066 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005067 value = ast2obj_expr(state, o->optional_vars);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005068 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005069 if (PyObject_SetAttr(result, state->optional_vars, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005070 goto failed;
5071 Py_DECREF(value);
5072 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005073failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005074 Py_XDECREF(value);
5075 Py_XDECREF(result);
5076 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005077}
5078
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005079PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02005080ast2obj_type_ignore(astmodulestate *state, void* _o)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005081{
5082 type_ignore_ty o = (type_ignore_ty)_o;
5083 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005084 PyTypeObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005085 if (!o) {
5086 Py_RETURN_NONE;
5087 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005088 switch (o->kind) {
5089 case TypeIgnore_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02005090 tp = (PyTypeObject *)state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005091 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005092 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005093 value = ast2obj_int(state, o->v.TypeIgnore.lineno);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005094 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005095 if (PyObject_SetAttr(result, state->lineno, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005096 goto failed;
5097 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005098 value = ast2obj_string(state, o->v.TypeIgnore.tag);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07005099 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005100 if (PyObject_SetAttr(result, state->tag, value) == -1)
Michael J. Sullivan933e1502019-05-22 07:54:20 -07005101 goto failed;
5102 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005103 break;
5104 }
5105 return result;
5106failed:
5107 Py_XDECREF(value);
5108 Py_XDECREF(result);
5109 return NULL;
5110}
5111
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005112
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005113int
Victor Stinnerf8599272020-07-03 16:57:19 +02005114obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005115{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005116 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005117
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005118 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005119 PyObject *tp;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005120
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005121 if (obj == Py_None) {
5122 *out = NULL;
5123 return 0;
5124 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005125 tp = state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005126 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005127 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005128 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005129 }
5130 if (isinstance) {
5131 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005132 asdl_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005133
Victor Stinnerf8599272020-07-03 16:57:19 +02005134 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005135 return 1;
5136 }
5137 if (tmp == NULL) {
5138 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
5139 return 1;
5140 }
5141 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005142 int res;
5143 Py_ssize_t len;
5144 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005145 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005146 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 +02005147 goto failed;
5148 }
5149 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005150 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005151 if (body == NULL) goto failed;
5152 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005153 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005154 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5155 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005156 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005157 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005158 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005159 if (len != PyList_GET_SIZE(tmp)) {
5160 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
5161 goto failed;
5162 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005163 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005164 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005165 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005166 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005167 if (_PyObject_LookupAttr(obj, state->type_ignores, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005168 return 1;
5169 }
5170 if (tmp == NULL) {
5171 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
5172 return 1;
5173 }
5174 else {
5175 int res;
5176 Py_ssize_t len;
5177 Py_ssize_t i;
5178 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005179 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 -08005180 goto failed;
5181 }
5182 len = PyList_GET_SIZE(tmp);
5183 type_ignores = _Py_asdl_seq_new(len, arena);
5184 if (type_ignores == NULL) goto failed;
5185 for (i = 0; i < len; i++) {
5186 type_ignore_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005187 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5188 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005189 res = obj2ast_type_ignore(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005190 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005191 if (res != 0) goto failed;
5192 if (len != PyList_GET_SIZE(tmp)) {
5193 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
5194 goto failed;
5195 }
5196 asdl_seq_SET(type_ignores, i, val);
5197 }
5198 Py_CLEAR(tmp);
5199 }
5200 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005201 if (*out == NULL) goto failed;
5202 return 0;
5203 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005204 tp = state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005205 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005206 if (isinstance == -1) {
5207 return 1;
5208 }
5209 if (isinstance) {
5210 asdl_seq* body;
5211
Victor Stinnerf8599272020-07-03 16:57:19 +02005212 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005213 return 1;
5214 }
5215 if (tmp == NULL) {
5216 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
5217 return 1;
5218 }
5219 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005220 int res;
5221 Py_ssize_t len;
5222 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005223 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005224 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 +02005225 goto failed;
5226 }
5227 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005228 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005229 if (body == NULL) goto failed;
5230 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005231 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005232 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5233 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005234 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005235 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005236 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005237 if (len != PyList_GET_SIZE(tmp)) {
5238 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
5239 goto failed;
5240 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005241 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005242 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005243 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005244 }
5245 *out = Interactive(body, arena);
5246 if (*out == NULL) goto failed;
5247 return 0;
5248 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005249 tp = state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005250 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005251 if (isinstance == -1) {
5252 return 1;
5253 }
5254 if (isinstance) {
5255 expr_ty body;
5256
Victor Stinnerf8599272020-07-03 16:57:19 +02005257 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005258 return 1;
5259 }
5260 if (tmp == NULL) {
5261 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
5262 return 1;
5263 }
5264 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005265 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005266 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005267 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005268 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005269 }
5270 *out = Expression(body, arena);
5271 if (*out == NULL) goto failed;
5272 return 0;
5273 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005274 tp = state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005275 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005276 if (isinstance == -1) {
5277 return 1;
5278 }
5279 if (isinstance) {
5280 asdl_seq* argtypes;
5281 expr_ty returns;
5282
Victor Stinnerf8599272020-07-03 16:57:19 +02005283 if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005284 return 1;
5285 }
5286 if (tmp == NULL) {
5287 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
5288 return 1;
5289 }
5290 else {
5291 int res;
5292 Py_ssize_t len;
5293 Py_ssize_t i;
5294 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005295 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 -08005296 goto failed;
5297 }
5298 len = PyList_GET_SIZE(tmp);
5299 argtypes = _Py_asdl_seq_new(len, arena);
5300 if (argtypes == NULL) goto failed;
5301 for (i = 0; i < len; i++) {
5302 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005303 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5304 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005305 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005306 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005307 if (res != 0) goto failed;
5308 if (len != PyList_GET_SIZE(tmp)) {
5309 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
5310 goto failed;
5311 }
5312 asdl_seq_SET(argtypes, i, val);
5313 }
5314 Py_CLEAR(tmp);
5315 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005316 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005317 return 1;
5318 }
5319 if (tmp == NULL) {
5320 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
5321 return 1;
5322 }
5323 else {
5324 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005325 res = obj2ast_expr(state, tmp, &returns, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005326 if (res != 0) goto failed;
5327 Py_CLEAR(tmp);
5328 }
5329 *out = FunctionType(argtypes, returns, arena);
5330 if (*out == NULL) goto failed;
5331 return 0;
5332 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005333
5334 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
5335 failed:
5336 Py_XDECREF(tmp);
5337 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005338}
5339
5340int
Victor Stinnerf8599272020-07-03 16:57:19 +02005341obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005342{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005343 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005344
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005345 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005346 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005347 int lineno;
5348 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005349 int end_lineno;
5350 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005351
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005352 if (obj == Py_None) {
5353 *out = NULL;
5354 return 0;
5355 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005356 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005357 return 1;
5358 }
5359 if (tmp == NULL) {
5360 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
5361 return 1;
5362 }
5363 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005364 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005365 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005366 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005367 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005368 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005369 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005370 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005371 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005372 if (tmp == NULL) {
5373 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
5374 return 1;
5375 }
5376 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005377 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005378 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005379 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005380 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005381 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005382 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005383 return 1;
5384 }
5385 if (tmp == NULL || tmp == Py_None) {
5386 Py_CLEAR(tmp);
5387 end_lineno = 0;
5388 }
5389 else {
5390 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005391 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005392 if (res != 0) goto failed;
5393 Py_CLEAR(tmp);
5394 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005395 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005396 return 1;
5397 }
5398 if (tmp == NULL || tmp == Py_None) {
5399 Py_CLEAR(tmp);
5400 end_col_offset = 0;
5401 }
5402 else {
5403 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005404 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005405 if (res != 0) goto failed;
5406 Py_CLEAR(tmp);
5407 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005408 tp = state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005409 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005410 if (isinstance == -1) {
5411 return 1;
5412 }
5413 if (isinstance) {
5414 identifier name;
5415 arguments_ty args;
5416 asdl_seq* body;
5417 asdl_seq* decorator_list;
5418 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005419 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005420
Victor Stinnerf8599272020-07-03 16:57:19 +02005421 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005422 return 1;
5423 }
5424 if (tmp == NULL) {
5425 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
5426 return 1;
5427 }
5428 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005429 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005430 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005431 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005432 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005433 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005434 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005435 return 1;
5436 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005437 if (tmp == NULL) {
5438 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
5439 return 1;
5440 }
5441 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005442 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005443 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005444 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005445 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005446 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005447 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005448 return 1;
5449 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005450 if (tmp == NULL) {
5451 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
5452 return 1;
5453 }
5454 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005455 int res;
5456 Py_ssize_t len;
5457 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005458 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005459 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 +02005460 goto failed;
5461 }
5462 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005463 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005464 if (body == NULL) goto failed;
5465 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005466 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005467 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5468 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005469 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005470 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005471 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005472 if (len != PyList_GET_SIZE(tmp)) {
5473 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
5474 goto failed;
5475 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005476 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005477 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005478 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005479 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005480 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005481 return 1;
5482 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005483 if (tmp == NULL) {
5484 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
5485 return 1;
5486 }
5487 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005488 int res;
5489 Py_ssize_t len;
5490 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005491 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005492 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 +02005493 goto failed;
5494 }
5495 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005496 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005497 if (decorator_list == NULL) goto failed;
5498 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005499 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005500 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5501 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005502 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005503 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005504 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005505 if (len != PyList_GET_SIZE(tmp)) {
5506 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
5507 goto failed;
5508 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005509 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005510 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005511 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005512 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005513 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005514 return 1;
5515 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005516 if (tmp == NULL || tmp == Py_None) {
5517 Py_CLEAR(tmp);
5518 returns = NULL;
5519 }
5520 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005521 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005522 res = obj2ast_expr(state, tmp, &returns, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005523 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005524 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005525 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005526 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005527 return 1;
5528 }
5529 if (tmp == NULL || tmp == Py_None) {
5530 Py_CLEAR(tmp);
5531 type_comment = NULL;
5532 }
5533 else {
5534 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005535 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005536 if (res != 0) goto failed;
5537 Py_CLEAR(tmp);
5538 }
5539 *out = FunctionDef(name, args, body, decorator_list, returns,
5540 type_comment, lineno, col_offset, end_lineno,
5541 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005542 if (*out == NULL) goto failed;
5543 return 0;
5544 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005545 tp = state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005546 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04005547 if (isinstance == -1) {
5548 return 1;
5549 }
5550 if (isinstance) {
5551 identifier name;
5552 arguments_ty args;
5553 asdl_seq* body;
5554 asdl_seq* decorator_list;
5555 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005556 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005557
Victor Stinnerf8599272020-07-03 16:57:19 +02005558 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005559 return 1;
5560 }
5561 if (tmp == NULL) {
5562 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
5563 return 1;
5564 }
5565 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005566 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005567 res = obj2ast_identifier(state, tmp, &name, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005568 if (res != 0) goto failed;
5569 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005570 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005571 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005572 return 1;
5573 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005574 if (tmp == NULL) {
5575 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
5576 return 1;
5577 }
5578 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005579 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005580 res = obj2ast_arguments(state, tmp, &args, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005581 if (res != 0) goto failed;
5582 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005583 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005584 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005585 return 1;
5586 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005587 if (tmp == NULL) {
5588 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
5589 return 1;
5590 }
5591 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005592 int res;
5593 Py_ssize_t len;
5594 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005595 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005596 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 -04005597 goto failed;
5598 }
5599 len = PyList_GET_SIZE(tmp);
5600 body = _Py_asdl_seq_new(len, arena);
5601 if (body == NULL) goto failed;
5602 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005603 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005604 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5605 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005606 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005607 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005608 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005609 if (len != PyList_GET_SIZE(tmp)) {
5610 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
5611 goto failed;
5612 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005613 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005614 }
5615 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005616 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005617 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005618 return 1;
5619 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005620 if (tmp == NULL) {
5621 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
5622 return 1;
5623 }
5624 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005625 int res;
5626 Py_ssize_t len;
5627 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005628 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005629 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 -04005630 goto failed;
5631 }
5632 len = PyList_GET_SIZE(tmp);
5633 decorator_list = _Py_asdl_seq_new(len, arena);
5634 if (decorator_list == NULL) goto failed;
5635 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005636 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005637 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5638 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005639 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005640 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005641 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005642 if (len != PyList_GET_SIZE(tmp)) {
5643 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
5644 goto failed;
5645 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005646 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005647 }
5648 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005649 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005650 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005651 return 1;
5652 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005653 if (tmp == NULL || tmp == Py_None) {
5654 Py_CLEAR(tmp);
5655 returns = NULL;
5656 }
5657 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005658 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005659 res = obj2ast_expr(state, tmp, &returns, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005660 if (res != 0) goto failed;
5661 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005662 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005663 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005664 return 1;
5665 }
5666 if (tmp == NULL || tmp == Py_None) {
5667 Py_CLEAR(tmp);
5668 type_comment = NULL;
5669 }
5670 else {
5671 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005672 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005673 if (res != 0) goto failed;
5674 Py_CLEAR(tmp);
5675 }
Yury Selivanov75445082015-05-11 22:57:16 -04005676 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005677 type_comment, lineno, col_offset, end_lineno,
5678 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005679 if (*out == NULL) goto failed;
5680 return 0;
5681 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005682 tp = state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005683 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005684 if (isinstance == -1) {
5685 return 1;
5686 }
5687 if (isinstance) {
5688 identifier name;
5689 asdl_seq* bases;
5690 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005691 asdl_seq* body;
5692 asdl_seq* decorator_list;
5693
Victor Stinnerf8599272020-07-03 16:57:19 +02005694 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005695 return 1;
5696 }
5697 if (tmp == NULL) {
5698 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
5699 return 1;
5700 }
5701 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005702 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005703 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005704 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005705 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005706 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005707 if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005708 return 1;
5709 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005710 if (tmp == NULL) {
5711 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
5712 return 1;
5713 }
5714 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005715 int res;
5716 Py_ssize_t len;
5717 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005718 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005719 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 +02005720 goto failed;
5721 }
5722 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005723 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005724 if (bases == NULL) goto failed;
5725 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005726 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005727 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5728 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005729 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005730 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005731 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005732 if (len != PyList_GET_SIZE(tmp)) {
5733 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
5734 goto failed;
5735 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005736 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005737 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005738 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005739 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005740 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005741 return 1;
5742 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005743 if (tmp == NULL) {
5744 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
5745 return 1;
5746 }
5747 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005748 int res;
5749 Py_ssize_t len;
5750 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005751 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005752 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 +02005753 goto failed;
5754 }
5755 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005756 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005757 if (keywords == NULL) goto failed;
5758 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005759 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005760 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5761 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005762 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005763 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005764 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005765 if (len != PyList_GET_SIZE(tmp)) {
5766 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
5767 goto failed;
5768 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005769 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005770 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005771 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005772 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005773 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005774 return 1;
5775 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005776 if (tmp == NULL) {
5777 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
5778 return 1;
5779 }
5780 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005781 int res;
5782 Py_ssize_t len;
5783 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005784 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005785 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 +02005786 goto failed;
5787 }
5788 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005789 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005790 if (body == NULL) goto failed;
5791 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005792 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005793 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5794 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005795 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005796 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005797 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005798 if (len != PyList_GET_SIZE(tmp)) {
5799 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
5800 goto failed;
5801 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005802 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005803 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005804 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005805 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005806 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005807 return 1;
5808 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005809 if (tmp == NULL) {
5810 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
5811 return 1;
5812 }
5813 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005814 int res;
5815 Py_ssize_t len;
5816 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005817 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005818 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 +02005819 goto failed;
5820 }
5821 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005822 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005823 if (decorator_list == NULL) goto failed;
5824 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005825 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005826 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5827 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005828 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005829 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005830 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005831 if (len != PyList_GET_SIZE(tmp)) {
5832 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
5833 goto failed;
5834 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005835 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005836 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005837 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005838 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03005839 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005840 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005841 if (*out == NULL) goto failed;
5842 return 0;
5843 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005844 tp = state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005845 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005846 if (isinstance == -1) {
5847 return 1;
5848 }
5849 if (isinstance) {
5850 expr_ty value;
5851
Victor Stinnerf8599272020-07-03 16:57:19 +02005852 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005853 return 1;
5854 }
5855 if (tmp == NULL || tmp == Py_None) {
5856 Py_CLEAR(tmp);
5857 value = NULL;
5858 }
5859 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005860 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005861 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005862 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005863 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005864 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005865 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
5866 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005867 if (*out == NULL) goto failed;
5868 return 0;
5869 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005870 tp = state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005871 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005872 if (isinstance == -1) {
5873 return 1;
5874 }
5875 if (isinstance) {
5876 asdl_seq* targets;
5877
Victor Stinnerf8599272020-07-03 16:57:19 +02005878 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005879 return 1;
5880 }
5881 if (tmp == NULL) {
5882 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
5883 return 1;
5884 }
5885 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005886 int res;
5887 Py_ssize_t len;
5888 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005889 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005890 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 +02005891 goto failed;
5892 }
5893 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005894 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005895 if (targets == NULL) goto failed;
5896 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005897 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005898 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5899 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005900 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005901 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005902 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005903 if (len != PyList_GET_SIZE(tmp)) {
5904 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
5905 goto failed;
5906 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005907 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005908 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005909 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005910 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005911 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
5912 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005913 if (*out == NULL) goto failed;
5914 return 0;
5915 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005916 tp = state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005917 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005918 if (isinstance == -1) {
5919 return 1;
5920 }
5921 if (isinstance) {
5922 asdl_seq* targets;
5923 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005924 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005925
Victor Stinnerf8599272020-07-03 16:57:19 +02005926 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005927 return 1;
5928 }
5929 if (tmp == NULL) {
5930 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
5931 return 1;
5932 }
5933 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005934 int res;
5935 Py_ssize_t len;
5936 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005937 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005938 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 +02005939 goto failed;
5940 }
5941 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005942 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005943 if (targets == NULL) goto failed;
5944 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005945 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005946 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5947 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005948 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005949 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005950 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005951 if (len != PyList_GET_SIZE(tmp)) {
5952 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
5953 goto failed;
5954 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005955 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005956 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005957 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005958 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005959 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005960 return 1;
5961 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005962 if (tmp == NULL) {
5963 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
5964 return 1;
5965 }
5966 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005967 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005968 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005969 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005970 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005971 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005972 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005973 return 1;
5974 }
5975 if (tmp == NULL || tmp == Py_None) {
5976 Py_CLEAR(tmp);
5977 type_comment = NULL;
5978 }
5979 else {
5980 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005981 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005982 if (res != 0) goto failed;
5983 Py_CLEAR(tmp);
5984 }
5985 *out = Assign(targets, value, type_comment, lineno, col_offset,
5986 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005987 if (*out == NULL) goto failed;
5988 return 0;
5989 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005990 tp = state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005991 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005992 if (isinstance == -1) {
5993 return 1;
5994 }
5995 if (isinstance) {
5996 expr_ty target;
5997 operator_ty op;
5998 expr_ty value;
5999
Victor Stinnerf8599272020-07-03 16:57:19 +02006000 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006001 return 1;
6002 }
6003 if (tmp == NULL) {
6004 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
6005 return 1;
6006 }
6007 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006008 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006009 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006010 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006011 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006012 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006013 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006014 return 1;
6015 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006016 if (tmp == NULL) {
6017 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
6018 return 1;
6019 }
6020 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006021 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006022 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006023 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006024 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006025 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006026 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006027 return 1;
6028 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006029 if (tmp == NULL) {
6030 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
6031 return 1;
6032 }
6033 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006034 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006035 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006036 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006037 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006038 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006039 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
6040 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006041 if (*out == NULL) goto failed;
6042 return 0;
6043 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006044 tp = state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006045 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006046 if (isinstance == -1) {
6047 return 1;
6048 }
6049 if (isinstance) {
6050 expr_ty target;
6051 expr_ty annotation;
6052 expr_ty value;
6053 int simple;
6054
Victor Stinnerf8599272020-07-03 16:57:19 +02006055 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006056 return 1;
6057 }
6058 if (tmp == NULL) {
6059 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
6060 return 1;
6061 }
6062 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006063 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006064 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006065 if (res != 0) goto failed;
6066 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006067 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006068 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006069 return 1;
6070 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006071 if (tmp == NULL) {
6072 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
6073 return 1;
6074 }
6075 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006076 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006077 res = obj2ast_expr(state, tmp, &annotation, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006078 if (res != 0) goto failed;
6079 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006080 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006081 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006082 return 1;
6083 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006084 if (tmp == NULL || tmp == Py_None) {
6085 Py_CLEAR(tmp);
6086 value = NULL;
6087 }
6088 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006089 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006090 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006091 if (res != 0) goto failed;
6092 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006093 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006094 if (_PyObject_LookupAttr(obj, state->simple, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006095 return 1;
6096 }
6097 if (tmp == NULL) {
6098 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
6099 return 1;
6100 }
6101 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006102 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006103 res = obj2ast_int(state, tmp, &simple, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006104 if (res != 0) goto failed;
6105 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006106 }
6107 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006108 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006109 if (*out == NULL) goto failed;
6110 return 0;
6111 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006112 tp = state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006113 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006114 if (isinstance == -1) {
6115 return 1;
6116 }
6117 if (isinstance) {
6118 expr_ty target;
6119 expr_ty iter;
6120 asdl_seq* body;
6121 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006122 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006123
Victor Stinnerf8599272020-07-03 16:57:19 +02006124 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006125 return 1;
6126 }
6127 if (tmp == NULL) {
6128 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
6129 return 1;
6130 }
6131 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006132 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006133 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006134 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006135 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006136 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006137 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006138 return 1;
6139 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006140 if (tmp == NULL) {
6141 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
6142 return 1;
6143 }
6144 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006145 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006146 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006147 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006148 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006149 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006150 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006151 return 1;
6152 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006153 if (tmp == NULL) {
6154 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
6155 return 1;
6156 }
6157 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006158 int res;
6159 Py_ssize_t len;
6160 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006161 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006162 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 +02006163 goto failed;
6164 }
6165 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006166 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006167 if (body == NULL) goto failed;
6168 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006169 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006170 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6171 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006172 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006173 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006174 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006175 if (len != PyList_GET_SIZE(tmp)) {
6176 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
6177 goto failed;
6178 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006179 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006180 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006181 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006182 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006183 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006184 return 1;
6185 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006186 if (tmp == NULL) {
6187 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
6188 return 1;
6189 }
6190 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006191 int res;
6192 Py_ssize_t len;
6193 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006194 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006195 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 +02006196 goto failed;
6197 }
6198 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006199 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006200 if (orelse == NULL) goto failed;
6201 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006202 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006203 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6204 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006205 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006206 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006207 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006208 if (len != PyList_GET_SIZE(tmp)) {
6209 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
6210 goto failed;
6211 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006212 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006213 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006214 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006215 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006216 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006217 return 1;
6218 }
6219 if (tmp == NULL || tmp == Py_None) {
6220 Py_CLEAR(tmp);
6221 type_comment = NULL;
6222 }
6223 else {
6224 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006225 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006226 if (res != 0) goto failed;
6227 Py_CLEAR(tmp);
6228 }
6229 *out = For(target, iter, body, orelse, type_comment, lineno,
6230 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006231 if (*out == NULL) goto failed;
6232 return 0;
6233 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006234 tp = state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006235 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006236 if (isinstance == -1) {
6237 return 1;
6238 }
6239 if (isinstance) {
6240 expr_ty target;
6241 expr_ty iter;
6242 asdl_seq* body;
6243 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006244 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006245
Victor Stinnerf8599272020-07-03 16:57:19 +02006246 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006247 return 1;
6248 }
6249 if (tmp == NULL) {
6250 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
6251 return 1;
6252 }
6253 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006254 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006255 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006256 if (res != 0) goto failed;
6257 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006258 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006259 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006260 return 1;
6261 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006262 if (tmp == NULL) {
6263 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
6264 return 1;
6265 }
6266 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006267 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006268 res = obj2ast_expr(state, tmp, &iter, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006269 if (res != 0) goto failed;
6270 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006271 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006272 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006273 return 1;
6274 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006275 if (tmp == NULL) {
6276 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
6277 return 1;
6278 }
6279 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006280 int res;
6281 Py_ssize_t len;
6282 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006283 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006284 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 -04006285 goto failed;
6286 }
6287 len = PyList_GET_SIZE(tmp);
6288 body = _Py_asdl_seq_new(len, arena);
6289 if (body == NULL) goto failed;
6290 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006291 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006292 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6293 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006294 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006295 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006296 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006297 if (len != PyList_GET_SIZE(tmp)) {
6298 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
6299 goto failed;
6300 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006301 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006302 }
6303 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006304 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006305 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006306 return 1;
6307 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006308 if (tmp == NULL) {
6309 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
6310 return 1;
6311 }
6312 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006313 int res;
6314 Py_ssize_t len;
6315 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006316 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006317 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 -04006318 goto failed;
6319 }
6320 len = PyList_GET_SIZE(tmp);
6321 orelse = _Py_asdl_seq_new(len, arena);
6322 if (orelse == NULL) goto failed;
6323 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006324 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006325 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6326 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006327 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006328 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006329 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006330 if (len != PyList_GET_SIZE(tmp)) {
6331 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
6332 goto failed;
6333 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006334 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006335 }
6336 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006337 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006338 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006339 return 1;
6340 }
6341 if (tmp == NULL || tmp == Py_None) {
6342 Py_CLEAR(tmp);
6343 type_comment = NULL;
6344 }
6345 else {
6346 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006347 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006348 if (res != 0) goto failed;
6349 Py_CLEAR(tmp);
6350 }
6351 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
6352 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006353 if (*out == NULL) goto failed;
6354 return 0;
6355 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006356 tp = state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006357 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006358 if (isinstance == -1) {
6359 return 1;
6360 }
6361 if (isinstance) {
6362 expr_ty test;
6363 asdl_seq* body;
6364 asdl_seq* orelse;
6365
Victor Stinnerf8599272020-07-03 16:57:19 +02006366 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006367 return 1;
6368 }
6369 if (tmp == NULL) {
6370 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
6371 return 1;
6372 }
6373 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006374 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006375 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006376 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006377 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006378 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006379 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006380 return 1;
6381 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006382 if (tmp == NULL) {
6383 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
6384 return 1;
6385 }
6386 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006387 int res;
6388 Py_ssize_t len;
6389 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006390 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006391 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 +02006392 goto failed;
6393 }
6394 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006395 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006396 if (body == NULL) goto failed;
6397 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006398 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006399 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6400 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006401 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006402 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006403 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006404 if (len != PyList_GET_SIZE(tmp)) {
6405 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
6406 goto failed;
6407 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006408 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006409 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006410 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006411 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006412 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006413 return 1;
6414 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006415 if (tmp == NULL) {
6416 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
6417 return 1;
6418 }
6419 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006420 int res;
6421 Py_ssize_t len;
6422 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006423 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006424 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 +02006425 goto failed;
6426 }
6427 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006428 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006429 if (orelse == NULL) goto failed;
6430 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006431 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006432 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6433 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006434 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006435 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006436 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006437 if (len != PyList_GET_SIZE(tmp)) {
6438 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
6439 goto failed;
6440 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006441 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006442 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006443 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006444 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006445 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
6446 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006447 if (*out == NULL) goto failed;
6448 return 0;
6449 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006450 tp = state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006451 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006452 if (isinstance == -1) {
6453 return 1;
6454 }
6455 if (isinstance) {
6456 expr_ty test;
6457 asdl_seq* body;
6458 asdl_seq* orelse;
6459
Victor Stinnerf8599272020-07-03 16:57:19 +02006460 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006461 return 1;
6462 }
6463 if (tmp == NULL) {
6464 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
6465 return 1;
6466 }
6467 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006468 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006469 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006470 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006471 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006472 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006473 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006474 return 1;
6475 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006476 if (tmp == NULL) {
6477 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
6478 return 1;
6479 }
6480 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006481 int res;
6482 Py_ssize_t len;
6483 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006484 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006485 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 +02006486 goto failed;
6487 }
6488 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006489 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006490 if (body == NULL) goto failed;
6491 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006492 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006493 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6494 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006495 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006496 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006497 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006498 if (len != PyList_GET_SIZE(tmp)) {
6499 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
6500 goto failed;
6501 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006502 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006503 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006504 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006505 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006506 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006507 return 1;
6508 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006509 if (tmp == NULL) {
6510 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
6511 return 1;
6512 }
6513 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006514 int res;
6515 Py_ssize_t len;
6516 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006517 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006518 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 +02006519 goto failed;
6520 }
6521 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006522 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006523 if (orelse == NULL) goto failed;
6524 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006525 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006526 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6527 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006528 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006529 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006530 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006531 if (len != PyList_GET_SIZE(tmp)) {
6532 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
6533 goto failed;
6534 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006535 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006536 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006537 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006538 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006539 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
6540 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006541 if (*out == NULL) goto failed;
6542 return 0;
6543 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006544 tp = state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006545 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006546 if (isinstance == -1) {
6547 return 1;
6548 }
6549 if (isinstance) {
6550 asdl_seq* items;
6551 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006552 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006553
Victor Stinnerf8599272020-07-03 16:57:19 +02006554 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006555 return 1;
6556 }
6557 if (tmp == NULL) {
6558 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
6559 return 1;
6560 }
6561 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006562 int res;
6563 Py_ssize_t len;
6564 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006565 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006566 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 +02006567 goto failed;
6568 }
6569 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006570 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006571 if (items == NULL) goto failed;
6572 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006573 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006574 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6575 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006576 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006577 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006578 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006579 if (len != PyList_GET_SIZE(tmp)) {
6580 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
6581 goto failed;
6582 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006583 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006584 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006585 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006586 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006587 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006588 return 1;
6589 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006590 if (tmp == NULL) {
6591 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
6592 return 1;
6593 }
6594 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006595 int res;
6596 Py_ssize_t len;
6597 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006598 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006599 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 +02006600 goto failed;
6601 }
6602 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006603 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006604 if (body == NULL) goto failed;
6605 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006606 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006607 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6608 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006609 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006610 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006611 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006612 if (len != PyList_GET_SIZE(tmp)) {
6613 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
6614 goto failed;
6615 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006616 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006617 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006618 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006619 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006620 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006621 return 1;
6622 }
6623 if (tmp == NULL || tmp == Py_None) {
6624 Py_CLEAR(tmp);
6625 type_comment = NULL;
6626 }
6627 else {
6628 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006629 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006630 if (res != 0) goto failed;
6631 Py_CLEAR(tmp);
6632 }
6633 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006634 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006635 if (*out == NULL) goto failed;
6636 return 0;
6637 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006638 tp = state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006639 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006640 if (isinstance == -1) {
6641 return 1;
6642 }
6643 if (isinstance) {
6644 asdl_seq* items;
6645 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006646 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006647
Victor Stinnerf8599272020-07-03 16:57:19 +02006648 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006649 return 1;
6650 }
6651 if (tmp == NULL) {
6652 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
6653 return 1;
6654 }
6655 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006656 int res;
6657 Py_ssize_t len;
6658 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006659 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006660 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 -04006661 goto failed;
6662 }
6663 len = PyList_GET_SIZE(tmp);
6664 items = _Py_asdl_seq_new(len, arena);
6665 if (items == NULL) goto failed;
6666 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006667 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006668 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6669 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006670 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006671 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006672 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006673 if (len != PyList_GET_SIZE(tmp)) {
6674 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
6675 goto failed;
6676 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006677 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006678 }
6679 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006680 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006681 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006682 return 1;
6683 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006684 if (tmp == NULL) {
6685 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
6686 return 1;
6687 }
6688 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006689 int res;
6690 Py_ssize_t len;
6691 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006692 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006693 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 -04006694 goto failed;
6695 }
6696 len = PyList_GET_SIZE(tmp);
6697 body = _Py_asdl_seq_new(len, arena);
6698 if (body == NULL) goto failed;
6699 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006700 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006701 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6702 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006703 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006704 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006705 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006706 if (len != PyList_GET_SIZE(tmp)) {
6707 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
6708 goto failed;
6709 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006710 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006711 }
6712 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006713 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006714 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006715 return 1;
6716 }
6717 if (tmp == NULL || tmp == Py_None) {
6718 Py_CLEAR(tmp);
6719 type_comment = NULL;
6720 }
6721 else {
6722 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006723 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006724 if (res != 0) goto failed;
6725 Py_CLEAR(tmp);
6726 }
6727 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
6728 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006729 if (*out == NULL) goto failed;
6730 return 0;
6731 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006732 tp = state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006733 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006734 if (isinstance == -1) {
6735 return 1;
6736 }
6737 if (isinstance) {
6738 expr_ty exc;
6739 expr_ty cause;
6740
Victor Stinnerf8599272020-07-03 16:57:19 +02006741 if (_PyObject_LookupAttr(obj, state->exc, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006742 return 1;
6743 }
6744 if (tmp == NULL || tmp == Py_None) {
6745 Py_CLEAR(tmp);
6746 exc = NULL;
6747 }
6748 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006749 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006750 res = obj2ast_expr(state, tmp, &exc, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006751 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006752 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006753 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006754 if (_PyObject_LookupAttr(obj, state->cause, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006755 return 1;
6756 }
6757 if (tmp == NULL || tmp == Py_None) {
6758 Py_CLEAR(tmp);
6759 cause = NULL;
6760 }
6761 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006762 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006763 res = obj2ast_expr(state, tmp, &cause, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006764 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006765 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006766 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006767 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
6768 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006769 if (*out == NULL) goto failed;
6770 return 0;
6771 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006772 tp = state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006773 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006774 if (isinstance == -1) {
6775 return 1;
6776 }
6777 if (isinstance) {
6778 asdl_seq* body;
6779 asdl_seq* handlers;
6780 asdl_seq* orelse;
6781 asdl_seq* finalbody;
6782
Victor Stinnerf8599272020-07-03 16:57:19 +02006783 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006784 return 1;
6785 }
6786 if (tmp == NULL) {
6787 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
6788 return 1;
6789 }
6790 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006791 int res;
6792 Py_ssize_t len;
6793 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006794 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006795 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 +02006796 goto failed;
6797 }
6798 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006799 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006800 if (body == NULL) goto failed;
6801 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006802 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006803 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6804 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006805 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006806 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006807 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006808 if (len != PyList_GET_SIZE(tmp)) {
6809 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
6810 goto failed;
6811 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006812 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006813 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006814 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006815 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006816 if (_PyObject_LookupAttr(obj, state->handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006817 return 1;
6818 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006819 if (tmp == NULL) {
6820 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
6821 return 1;
6822 }
6823 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006824 int res;
6825 Py_ssize_t len;
6826 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006827 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006828 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 +02006829 goto failed;
6830 }
6831 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006832 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006833 if (handlers == NULL) goto failed;
6834 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006835 excepthandler_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006836 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6837 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006838 res = obj2ast_excepthandler(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006839 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006840 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006841 if (len != PyList_GET_SIZE(tmp)) {
6842 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
6843 goto failed;
6844 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006845 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006846 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006847 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006848 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006849 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006850 return 1;
6851 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006852 if (tmp == NULL) {
6853 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
6854 return 1;
6855 }
6856 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006857 int res;
6858 Py_ssize_t len;
6859 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006860 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006861 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 +02006862 goto failed;
6863 }
6864 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006865 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006866 if (orelse == NULL) goto failed;
6867 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006868 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006869 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6870 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006871 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006872 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006873 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006874 if (len != PyList_GET_SIZE(tmp)) {
6875 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
6876 goto failed;
6877 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006878 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006879 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006880 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006881 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006882 if (_PyObject_LookupAttr(obj, state->finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006883 return 1;
6884 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006885 if (tmp == NULL) {
6886 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
6887 return 1;
6888 }
6889 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006890 int res;
6891 Py_ssize_t len;
6892 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006893 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006894 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 +02006895 goto failed;
6896 }
6897 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006898 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006899 if (finalbody == NULL) goto failed;
6900 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006901 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006902 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6903 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006904 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006905 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006906 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006907 if (len != PyList_GET_SIZE(tmp)) {
6908 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
6909 goto failed;
6910 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006911 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006912 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006913 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006914 }
6915 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006916 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006917 if (*out == NULL) goto failed;
6918 return 0;
6919 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006920 tp = state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006921 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006922 if (isinstance == -1) {
6923 return 1;
6924 }
6925 if (isinstance) {
6926 expr_ty test;
6927 expr_ty msg;
6928
Victor Stinnerf8599272020-07-03 16:57:19 +02006929 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006930 return 1;
6931 }
6932 if (tmp == NULL) {
6933 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
6934 return 1;
6935 }
6936 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006937 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006938 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006939 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006940 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006941 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006942 if (_PyObject_LookupAttr(obj, state->msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006943 return 1;
6944 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006945 if (tmp == NULL || tmp == Py_None) {
6946 Py_CLEAR(tmp);
6947 msg = NULL;
6948 }
6949 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006950 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006951 res = obj2ast_expr(state, tmp, &msg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006952 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006953 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006954 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006955 *out = Assert(test, msg, lineno, col_offset, end_lineno,
6956 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006957 if (*out == NULL) goto failed;
6958 return 0;
6959 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006960 tp = state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006961 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006962 if (isinstance == -1) {
6963 return 1;
6964 }
6965 if (isinstance) {
6966 asdl_seq* names;
6967
Victor Stinnerf8599272020-07-03 16:57:19 +02006968 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006969 return 1;
6970 }
6971 if (tmp == NULL) {
6972 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
6973 return 1;
6974 }
6975 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006976 int res;
6977 Py_ssize_t len;
6978 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006979 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006980 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 +02006981 goto failed;
6982 }
6983 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006984 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006985 if (names == NULL) goto failed;
6986 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006987 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006988 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6989 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006990 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006991 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006992 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006993 if (len != PyList_GET_SIZE(tmp)) {
6994 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
6995 goto failed;
6996 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006997 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006998 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006999 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007000 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007001 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
7002 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007003 if (*out == NULL) goto failed;
7004 return 0;
7005 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007006 tp = state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007007 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007008 if (isinstance == -1) {
7009 return 1;
7010 }
7011 if (isinstance) {
7012 identifier module;
7013 asdl_seq* names;
7014 int level;
7015
Victor Stinnerf8599272020-07-03 16:57:19 +02007016 if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007017 return 1;
7018 }
7019 if (tmp == NULL || tmp == Py_None) {
7020 Py_CLEAR(tmp);
7021 module = NULL;
7022 }
7023 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007024 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007025 res = obj2ast_identifier(state, tmp, &module, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007026 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007027 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007028 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007029 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007030 return 1;
7031 }
7032 if (tmp == NULL) {
7033 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
7034 return 1;
7035 }
7036 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007037 int res;
7038 Py_ssize_t len;
7039 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007040 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007041 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 +02007042 goto failed;
7043 }
7044 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007045 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007046 if (names == NULL) goto failed;
7047 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007048 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007049 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7050 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007051 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007052 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007053 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007054 if (len != PyList_GET_SIZE(tmp)) {
7055 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
7056 goto failed;
7057 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007058 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007059 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007060 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007061 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007062 if (_PyObject_LookupAttr(obj, state->level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007063 return 1;
7064 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007065 if (tmp == NULL || tmp == Py_None) {
7066 Py_CLEAR(tmp);
7067 level = 0;
7068 }
7069 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007070 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007071 res = obj2ast_int(state, tmp, &level, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007072 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007073 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007074 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007075 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
7076 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007077 if (*out == NULL) goto failed;
7078 return 0;
7079 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007080 tp = state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007081 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007082 if (isinstance == -1) {
7083 return 1;
7084 }
7085 if (isinstance) {
7086 asdl_seq* names;
7087
Victor Stinnerf8599272020-07-03 16:57:19 +02007088 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007089 return 1;
7090 }
7091 if (tmp == NULL) {
7092 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
7093 return 1;
7094 }
7095 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007096 int res;
7097 Py_ssize_t len;
7098 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007099 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007100 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 +02007101 goto failed;
7102 }
7103 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007104 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007105 if (names == NULL) goto failed;
7106 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007107 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007108 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7109 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007110 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007111 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007112 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007113 if (len != PyList_GET_SIZE(tmp)) {
7114 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
7115 goto failed;
7116 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007117 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007118 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007119 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007120 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007121 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
7122 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007123 if (*out == NULL) goto failed;
7124 return 0;
7125 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007126 tp = state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007127 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007128 if (isinstance == -1) {
7129 return 1;
7130 }
7131 if (isinstance) {
7132 asdl_seq* names;
7133
Victor Stinnerf8599272020-07-03 16:57:19 +02007134 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007135 return 1;
7136 }
7137 if (tmp == NULL) {
7138 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
7139 return 1;
7140 }
7141 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007142 int res;
7143 Py_ssize_t len;
7144 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007145 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007146 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 +02007147 goto failed;
7148 }
7149 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007150 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007151 if (names == NULL) goto failed;
7152 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007153 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007154 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7155 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007156 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007157 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007158 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007159 if (len != PyList_GET_SIZE(tmp)) {
7160 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
7161 goto failed;
7162 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007163 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007164 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007165 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007166 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007167 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
7168 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007169 if (*out == NULL) goto failed;
7170 return 0;
7171 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007172 tp = state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007173 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007174 if (isinstance == -1) {
7175 return 1;
7176 }
7177 if (isinstance) {
7178 expr_ty value;
7179
Victor Stinnerf8599272020-07-03 16:57:19 +02007180 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007181 return 1;
7182 }
7183 if (tmp == NULL) {
7184 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
7185 return 1;
7186 }
7187 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007188 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007189 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007190 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007191 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007192 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007193 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
7194 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007195 if (*out == NULL) goto failed;
7196 return 0;
7197 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007198 tp = state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007199 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007200 if (isinstance == -1) {
7201 return 1;
7202 }
7203 if (isinstance) {
7204
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007205 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007206 if (*out == NULL) goto failed;
7207 return 0;
7208 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007209 tp = state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007210 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007211 if (isinstance == -1) {
7212 return 1;
7213 }
7214 if (isinstance) {
7215
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007216 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007217 if (*out == NULL) goto failed;
7218 return 0;
7219 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007220 tp = state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007221 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007222 if (isinstance == -1) {
7223 return 1;
7224 }
7225 if (isinstance) {
7226
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007227 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007228 if (*out == NULL) goto failed;
7229 return 0;
7230 }
7231
7232 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
7233 failed:
7234 Py_XDECREF(tmp);
7235 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007236}
7237
7238int
Victor Stinnerf8599272020-07-03 16:57:19 +02007239obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007240{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007241 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007242
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007243 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007244 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007245 int lineno;
7246 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007247 int end_lineno;
7248 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007249
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007250 if (obj == Py_None) {
7251 *out = NULL;
7252 return 0;
7253 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007254 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007255 return 1;
7256 }
7257 if (tmp == NULL) {
7258 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
7259 return 1;
7260 }
7261 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007262 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007263 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007264 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007265 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007266 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007267 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007268 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007269 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007270 if (tmp == NULL) {
7271 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
7272 return 1;
7273 }
7274 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007275 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007276 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007277 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007278 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007279 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007280 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007281 return 1;
7282 }
7283 if (tmp == NULL || tmp == Py_None) {
7284 Py_CLEAR(tmp);
7285 end_lineno = 0;
7286 }
7287 else {
7288 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007289 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007290 if (res != 0) goto failed;
7291 Py_CLEAR(tmp);
7292 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007293 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007294 return 1;
7295 }
7296 if (tmp == NULL || tmp == Py_None) {
7297 Py_CLEAR(tmp);
7298 end_col_offset = 0;
7299 }
7300 else {
7301 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007302 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007303 if (res != 0) goto failed;
7304 Py_CLEAR(tmp);
7305 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007306 tp = state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007307 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007308 if (isinstance == -1) {
7309 return 1;
7310 }
7311 if (isinstance) {
7312 boolop_ty op;
7313 asdl_seq* values;
7314
Victor Stinnerf8599272020-07-03 16:57:19 +02007315 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007316 return 1;
7317 }
7318 if (tmp == NULL) {
7319 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
7320 return 1;
7321 }
7322 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007323 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007324 res = obj2ast_boolop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007325 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007326 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007327 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007328 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007329 return 1;
7330 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007331 if (tmp == NULL) {
7332 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
7333 return 1;
7334 }
7335 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007336 int res;
7337 Py_ssize_t len;
7338 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007339 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007340 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 +02007341 goto failed;
7342 }
7343 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007344 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007345 if (values == NULL) goto failed;
7346 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007347 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007348 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7349 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007350 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007351 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007352 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007353 if (len != PyList_GET_SIZE(tmp)) {
7354 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
7355 goto failed;
7356 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007357 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007358 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007359 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007360 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007361 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
7362 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007363 if (*out == NULL) goto failed;
7364 return 0;
7365 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007366 tp = state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007367 isinstance = PyObject_IsInstance(obj, tp);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007368 if (isinstance == -1) {
7369 return 1;
7370 }
7371 if (isinstance) {
7372 expr_ty target;
7373 expr_ty value;
7374
Victor Stinnerf8599272020-07-03 16:57:19 +02007375 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007376 return 1;
7377 }
7378 if (tmp == NULL) {
7379 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
7380 return 1;
7381 }
7382 else {
7383 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007384 res = obj2ast_expr(state, tmp, &target, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007385 if (res != 0) goto failed;
7386 Py_CLEAR(tmp);
7387 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007388 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007389 return 1;
7390 }
7391 if (tmp == NULL) {
7392 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
7393 return 1;
7394 }
7395 else {
7396 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007397 res = obj2ast_expr(state, tmp, &value, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007398 if (res != 0) goto failed;
7399 Py_CLEAR(tmp);
7400 }
7401 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
7402 end_col_offset, arena);
7403 if (*out == NULL) goto failed;
7404 return 0;
7405 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007406 tp = state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007407 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007408 if (isinstance == -1) {
7409 return 1;
7410 }
7411 if (isinstance) {
7412 expr_ty left;
7413 operator_ty op;
7414 expr_ty right;
7415
Victor Stinnerf8599272020-07-03 16:57:19 +02007416 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007417 return 1;
7418 }
7419 if (tmp == NULL) {
7420 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
7421 return 1;
7422 }
7423 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007424 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007425 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007426 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007427 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007428 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007429 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007430 return 1;
7431 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007432 if (tmp == NULL) {
7433 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
7434 return 1;
7435 }
7436 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007437 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007438 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007439 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007440 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007441 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007442 if (_PyObject_LookupAttr(obj, state->right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007443 return 1;
7444 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007445 if (tmp == NULL) {
7446 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
7447 return 1;
7448 }
7449 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007450 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007451 res = obj2ast_expr(state, tmp, &right, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007452 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007453 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007454 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007455 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
7456 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007457 if (*out == NULL) goto failed;
7458 return 0;
7459 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007460 tp = state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007461 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007462 if (isinstance == -1) {
7463 return 1;
7464 }
7465 if (isinstance) {
7466 unaryop_ty op;
7467 expr_ty operand;
7468
Victor Stinnerf8599272020-07-03 16:57:19 +02007469 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007470 return 1;
7471 }
7472 if (tmp == NULL) {
7473 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
7474 return 1;
7475 }
7476 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007477 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007478 res = obj2ast_unaryop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007479 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007480 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007481 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007482 if (_PyObject_LookupAttr(obj, state->operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007483 return 1;
7484 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007485 if (tmp == NULL) {
7486 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
7487 return 1;
7488 }
7489 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007490 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007491 res = obj2ast_expr(state, tmp, &operand, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007492 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007493 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007494 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007495 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
7496 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007497 if (*out == NULL) goto failed;
7498 return 0;
7499 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007500 tp = state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007501 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007502 if (isinstance == -1) {
7503 return 1;
7504 }
7505 if (isinstance) {
7506 arguments_ty args;
7507 expr_ty body;
7508
Victor Stinnerf8599272020-07-03 16:57:19 +02007509 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007510 return 1;
7511 }
7512 if (tmp == NULL) {
7513 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
7514 return 1;
7515 }
7516 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007517 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007518 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007519 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007520 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007521 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007522 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007523 return 1;
7524 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007525 if (tmp == NULL) {
7526 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
7527 return 1;
7528 }
7529 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007530 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007531 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007532 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007533 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007534 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007535 *out = Lambda(args, body, lineno, col_offset, end_lineno,
7536 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007537 if (*out == NULL) goto failed;
7538 return 0;
7539 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007540 tp = state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007541 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007542 if (isinstance == -1) {
7543 return 1;
7544 }
7545 if (isinstance) {
7546 expr_ty test;
7547 expr_ty body;
7548 expr_ty orelse;
7549
Victor Stinnerf8599272020-07-03 16:57:19 +02007550 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007551 return 1;
7552 }
7553 if (tmp == NULL) {
7554 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
7555 return 1;
7556 }
7557 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007558 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007559 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007560 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007561 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007562 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007563 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007564 return 1;
7565 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007566 if (tmp == NULL) {
7567 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
7568 return 1;
7569 }
7570 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007571 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007572 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007573 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007574 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007575 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007576 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007577 return 1;
7578 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007579 if (tmp == NULL) {
7580 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
7581 return 1;
7582 }
7583 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007584 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007585 res = obj2ast_expr(state, tmp, &orelse, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007586 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007587 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007588 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007589 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
7590 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007591 if (*out == NULL) goto failed;
7592 return 0;
7593 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007594 tp = state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007595 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007596 if (isinstance == -1) {
7597 return 1;
7598 }
7599 if (isinstance) {
7600 asdl_seq* keys;
7601 asdl_seq* values;
7602
Victor Stinnerf8599272020-07-03 16:57:19 +02007603 if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007604 return 1;
7605 }
7606 if (tmp == NULL) {
7607 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
7608 return 1;
7609 }
7610 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007611 int res;
7612 Py_ssize_t len;
7613 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007614 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007615 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 +02007616 goto failed;
7617 }
7618 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007619 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007620 if (keys == NULL) goto failed;
7621 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007622 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007623 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7624 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007625 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007626 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007627 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007628 if (len != PyList_GET_SIZE(tmp)) {
7629 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
7630 goto failed;
7631 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007632 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007633 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007634 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007635 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007636 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007637 return 1;
7638 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007639 if (tmp == NULL) {
7640 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
7641 return 1;
7642 }
7643 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007644 int res;
7645 Py_ssize_t len;
7646 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007647 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007648 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 +02007649 goto failed;
7650 }
7651 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007652 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007653 if (values == NULL) goto failed;
7654 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007655 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007656 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7657 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007658 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007659 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007660 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007661 if (len != PyList_GET_SIZE(tmp)) {
7662 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
7663 goto failed;
7664 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007665 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007666 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007667 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007668 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007669 *out = Dict(keys, values, lineno, col_offset, end_lineno,
7670 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007671 if (*out == NULL) goto failed;
7672 return 0;
7673 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007674 tp = state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007675 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007676 if (isinstance == -1) {
7677 return 1;
7678 }
7679 if (isinstance) {
7680 asdl_seq* elts;
7681
Victor Stinnerf8599272020-07-03 16:57:19 +02007682 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007683 return 1;
7684 }
7685 if (tmp == NULL) {
7686 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
7687 return 1;
7688 }
7689 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007690 int res;
7691 Py_ssize_t len;
7692 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007693 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007694 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 +02007695 goto failed;
7696 }
7697 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007698 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007699 if (elts == NULL) goto failed;
7700 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007701 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007702 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7703 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007704 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007705 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007706 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007707 if (len != PyList_GET_SIZE(tmp)) {
7708 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
7709 goto failed;
7710 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007711 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007712 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007713 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007714 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007715 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007716 if (*out == NULL) goto failed;
7717 return 0;
7718 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007719 tp = state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007720 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007721 if (isinstance == -1) {
7722 return 1;
7723 }
7724 if (isinstance) {
7725 expr_ty elt;
7726 asdl_seq* generators;
7727
Victor Stinnerf8599272020-07-03 16:57:19 +02007728 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007729 return 1;
7730 }
7731 if (tmp == NULL) {
7732 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
7733 return 1;
7734 }
7735 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007736 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007737 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007738 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007739 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007740 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007741 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007742 return 1;
7743 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007744 if (tmp == NULL) {
7745 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
7746 return 1;
7747 }
7748 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007749 int res;
7750 Py_ssize_t len;
7751 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007752 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007753 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 +02007754 goto failed;
7755 }
7756 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007757 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007758 if (generators == NULL) goto failed;
7759 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007760 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007761 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7762 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007763 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007764 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007765 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007766 if (len != PyList_GET_SIZE(tmp)) {
7767 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
7768 goto failed;
7769 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007770 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007771 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007772 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007773 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007774 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
7775 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007776 if (*out == NULL) goto failed;
7777 return 0;
7778 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007779 tp = state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007780 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007781 if (isinstance == -1) {
7782 return 1;
7783 }
7784 if (isinstance) {
7785 expr_ty elt;
7786 asdl_seq* generators;
7787
Victor Stinnerf8599272020-07-03 16:57:19 +02007788 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007789 return 1;
7790 }
7791 if (tmp == NULL) {
7792 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
7793 return 1;
7794 }
7795 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007796 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007797 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007798 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007799 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007800 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007801 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007802 return 1;
7803 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007804 if (tmp == NULL) {
7805 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
7806 return 1;
7807 }
7808 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007809 int res;
7810 Py_ssize_t len;
7811 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007812 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007813 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 +02007814 goto failed;
7815 }
7816 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007817 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007818 if (generators == NULL) goto failed;
7819 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007820 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007821 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7822 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007823 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007824 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007825 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007826 if (len != PyList_GET_SIZE(tmp)) {
7827 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
7828 goto failed;
7829 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007830 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007831 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007832 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007833 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007834 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
7835 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007836 if (*out == NULL) goto failed;
7837 return 0;
7838 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007839 tp = state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007840 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007841 if (isinstance == -1) {
7842 return 1;
7843 }
7844 if (isinstance) {
7845 expr_ty key;
7846 expr_ty value;
7847 asdl_seq* generators;
7848
Victor Stinnerf8599272020-07-03 16:57:19 +02007849 if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007850 return 1;
7851 }
7852 if (tmp == NULL) {
7853 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
7854 return 1;
7855 }
7856 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007857 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007858 res = obj2ast_expr(state, tmp, &key, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007859 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007860 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007861 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007862 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007863 return 1;
7864 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007865 if (tmp == NULL) {
7866 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
7867 return 1;
7868 }
7869 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007870 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007871 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007872 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007873 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007874 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007875 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007876 return 1;
7877 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007878 if (tmp == NULL) {
7879 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
7880 return 1;
7881 }
7882 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007883 int res;
7884 Py_ssize_t len;
7885 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007886 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007887 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 +02007888 goto failed;
7889 }
7890 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007891 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007892 if (generators == NULL) goto failed;
7893 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007894 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007895 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7896 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007897 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007898 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007899 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007900 if (len != PyList_GET_SIZE(tmp)) {
7901 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
7902 goto failed;
7903 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007904 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007905 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007906 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007907 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007908 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
7909 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007910 if (*out == NULL) goto failed;
7911 return 0;
7912 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007913 tp = state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007914 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007915 if (isinstance == -1) {
7916 return 1;
7917 }
7918 if (isinstance) {
7919 expr_ty elt;
7920 asdl_seq* generators;
7921
Victor Stinnerf8599272020-07-03 16:57:19 +02007922 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007923 return 1;
7924 }
7925 if (tmp == NULL) {
7926 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
7927 return 1;
7928 }
7929 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007930 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007931 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007932 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007933 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007934 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007935 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007936 return 1;
7937 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007938 if (tmp == NULL) {
7939 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
7940 return 1;
7941 }
7942 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007943 int res;
7944 Py_ssize_t len;
7945 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007946 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007947 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 +02007948 goto failed;
7949 }
7950 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007951 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007952 if (generators == NULL) goto failed;
7953 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007954 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007955 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7956 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007957 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007958 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007959 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007960 if (len != PyList_GET_SIZE(tmp)) {
7961 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
7962 goto failed;
7963 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007964 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007965 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007966 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007967 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007968 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
7969 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007970 if (*out == NULL) goto failed;
7971 return 0;
7972 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007973 tp = state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007974 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04007975 if (isinstance == -1) {
7976 return 1;
7977 }
7978 if (isinstance) {
7979 expr_ty value;
7980
Victor Stinnerf8599272020-07-03 16:57:19 +02007981 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007982 return 1;
7983 }
7984 if (tmp == NULL) {
7985 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
7986 return 1;
7987 }
7988 else {
Yury Selivanov75445082015-05-11 22:57:16 -04007989 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007990 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007991 if (res != 0) goto failed;
7992 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04007993 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007994 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
7995 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007996 if (*out == NULL) goto failed;
7997 return 0;
7998 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007999 tp = state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008000 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008001 if (isinstance == -1) {
8002 return 1;
8003 }
8004 if (isinstance) {
8005 expr_ty value;
8006
Victor Stinnerf8599272020-07-03 16:57:19 +02008007 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008008 return 1;
8009 }
8010 if (tmp == NULL || tmp == Py_None) {
8011 Py_CLEAR(tmp);
8012 value = NULL;
8013 }
8014 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008015 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +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);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008019 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008020 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
8021 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008022 if (*out == NULL) goto failed;
8023 return 0;
8024 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008025 tp = state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008026 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008027 if (isinstance == -1) {
8028 return 1;
8029 }
8030 if (isinstance) {
8031 expr_ty value;
8032
Victor Stinnerf8599272020-07-03 16:57:19 +02008033 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008034 return 1;
8035 }
8036 if (tmp == NULL) {
8037 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
8038 return 1;
8039 }
8040 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008041 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008042 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008043 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008044 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008045 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008046 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
8047 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008048 if (*out == NULL) goto failed;
8049 return 0;
8050 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008051 tp = state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008052 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008053 if (isinstance == -1) {
8054 return 1;
8055 }
8056 if (isinstance) {
8057 expr_ty left;
8058 asdl_int_seq* ops;
8059 asdl_seq* comparators;
8060
Victor Stinnerf8599272020-07-03 16:57:19 +02008061 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008062 return 1;
8063 }
8064 if (tmp == NULL) {
8065 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
8066 return 1;
8067 }
8068 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008069 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008070 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008071 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008072 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008073 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008074 if (_PyObject_LookupAttr(obj, state->ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008075 return 1;
8076 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008077 if (tmp == NULL) {
8078 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
8079 return 1;
8080 }
8081 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008082 int res;
8083 Py_ssize_t len;
8084 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008085 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008086 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 +02008087 goto failed;
8088 }
8089 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008090 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008091 if (ops == NULL) goto failed;
8092 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008093 cmpop_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008094 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8095 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008096 res = obj2ast_cmpop(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008097 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008098 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008099 if (len != PyList_GET_SIZE(tmp)) {
8100 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
8101 goto failed;
8102 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008103 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008104 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008105 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008106 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008107 if (_PyObject_LookupAttr(obj, state->comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008108 return 1;
8109 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008110 if (tmp == NULL) {
8111 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
8112 return 1;
8113 }
8114 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008115 int res;
8116 Py_ssize_t len;
8117 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008118 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008119 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 +02008120 goto failed;
8121 }
8122 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008123 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008124 if (comparators == NULL) goto failed;
8125 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008126 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008127 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8128 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008129 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008130 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008131 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008132 if (len != PyList_GET_SIZE(tmp)) {
8133 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
8134 goto failed;
8135 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008136 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008137 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008138 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008139 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008140 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
8141 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008142 if (*out == NULL) goto failed;
8143 return 0;
8144 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008145 tp = state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008146 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008147 if (isinstance == -1) {
8148 return 1;
8149 }
8150 if (isinstance) {
8151 expr_ty func;
8152 asdl_seq* args;
8153 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008154
Victor Stinnerf8599272020-07-03 16:57:19 +02008155 if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008156 return 1;
8157 }
8158 if (tmp == NULL) {
8159 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
8160 return 1;
8161 }
8162 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008163 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008164 res = obj2ast_expr(state, tmp, &func, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008165 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008166 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008167 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008168 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008169 return 1;
8170 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008171 if (tmp == NULL) {
8172 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
8173 return 1;
8174 }
8175 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008176 int res;
8177 Py_ssize_t len;
8178 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008179 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008180 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 +02008181 goto failed;
8182 }
8183 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008184 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008185 if (args == NULL) goto failed;
8186 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008187 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008188 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8189 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008190 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008191 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008192 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008193 if (len != PyList_GET_SIZE(tmp)) {
8194 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
8195 goto failed;
8196 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008197 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008198 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008199 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008200 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008201 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008202 return 1;
8203 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008204 if (tmp == NULL) {
8205 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
8206 return 1;
8207 }
8208 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008209 int res;
8210 Py_ssize_t len;
8211 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008212 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008213 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 +02008214 goto failed;
8215 }
8216 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008217 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008218 if (keywords == NULL) goto failed;
8219 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008220 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008221 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8222 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008223 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008224 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008225 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008226 if (len != PyList_GET_SIZE(tmp)) {
8227 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
8228 goto failed;
8229 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008230 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008231 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008232 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008233 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008234 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
8235 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008236 if (*out == NULL) goto failed;
8237 return 0;
8238 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008239 tp = state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008240 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008241 if (isinstance == -1) {
8242 return 1;
8243 }
8244 if (isinstance) {
8245 expr_ty value;
8246 int conversion;
8247 expr_ty format_spec;
8248
Victor Stinnerf8599272020-07-03 16:57:19 +02008249 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008250 return 1;
8251 }
8252 if (tmp == NULL) {
8253 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
8254 return 1;
8255 }
8256 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008257 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008258 res = obj2ast_expr(state, tmp, &value, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008259 if (res != 0) goto failed;
8260 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008261 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008262 if (_PyObject_LookupAttr(obj, state->conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008263 return 1;
8264 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008265 if (tmp == NULL || tmp == Py_None) {
8266 Py_CLEAR(tmp);
8267 conversion = 0;
8268 }
8269 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008270 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008271 res = obj2ast_int(state, tmp, &conversion, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008272 if (res != 0) goto failed;
8273 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008274 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008275 if (_PyObject_LookupAttr(obj, state->format_spec, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008276 return 1;
8277 }
8278 if (tmp == NULL || tmp == Py_None) {
8279 Py_CLEAR(tmp);
8280 format_spec = NULL;
8281 }
8282 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008283 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008284 res = obj2ast_expr(state, tmp, &format_spec, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008285 if (res != 0) goto failed;
8286 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008287 }
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04008288 *out = FormattedValue(value, conversion, format_spec, lineno,
8289 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008290 if (*out == NULL) goto failed;
8291 return 0;
8292 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008293 tp = state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008294 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008295 if (isinstance == -1) {
8296 return 1;
8297 }
8298 if (isinstance) {
8299 asdl_seq* values;
8300
Victor Stinnerf8599272020-07-03 16:57:19 +02008301 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008302 return 1;
8303 }
8304 if (tmp == NULL) {
8305 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
8306 return 1;
8307 }
8308 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008309 int res;
8310 Py_ssize_t len;
8311 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008312 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008313 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 -04008314 goto failed;
8315 }
8316 len = PyList_GET_SIZE(tmp);
8317 values = _Py_asdl_seq_new(len, arena);
8318 if (values == NULL) goto failed;
8319 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008320 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008321 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8322 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008323 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008324 Py_DECREF(tmp2);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008325 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03008326 if (len != PyList_GET_SIZE(tmp)) {
8327 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
8328 goto failed;
8329 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008330 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008331 }
8332 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008333 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008334 *out = JoinedStr(values, lineno, col_offset, end_lineno,
8335 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008336 if (*out == NULL) goto failed;
8337 return 0;
8338 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008339 tp = state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008340 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008341 if (isinstance == -1) {
8342 return 1;
8343 }
8344 if (isinstance) {
8345 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008346 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008347
Victor Stinnerf8599272020-07-03 16:57:19 +02008348 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008349 return 1;
8350 }
8351 if (tmp == NULL) {
8352 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
8353 return 1;
8354 }
8355 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008356 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008357 res = obj2ast_constant(state, tmp, &value, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008358 if (res != 0) goto failed;
8359 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008360 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008361 if (_PyObject_LookupAttr(obj, state->kind, &tmp) < 0) {
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008362 return 1;
8363 }
8364 if (tmp == NULL || tmp == Py_None) {
8365 Py_CLEAR(tmp);
8366 kind = NULL;
8367 }
8368 else {
8369 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008370 res = obj2ast_string(state, tmp, &kind, arena);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008371 if (res != 0) goto failed;
8372 Py_CLEAR(tmp);
8373 }
8374 *out = Constant(value, kind, lineno, col_offset, end_lineno,
8375 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008376 if (*out == NULL) goto failed;
8377 return 0;
8378 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008379 tp = state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008380 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008381 if (isinstance == -1) {
8382 return 1;
8383 }
8384 if (isinstance) {
8385 expr_ty value;
8386 identifier attr;
8387 expr_context_ty ctx;
8388
Victor Stinnerf8599272020-07-03 16:57:19 +02008389 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008390 return 1;
8391 }
8392 if (tmp == NULL) {
8393 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
8394 return 1;
8395 }
8396 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008397 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008398 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008399 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008400 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008401 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008402 if (_PyObject_LookupAttr(obj, state->attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008403 return 1;
8404 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008405 if (tmp == NULL) {
8406 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
8407 return 1;
8408 }
8409 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008410 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008411 res = obj2ast_identifier(state, tmp, &attr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008412 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008413 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008414 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008415 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008416 return 1;
8417 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008418 if (tmp == NULL) {
8419 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
8420 return 1;
8421 }
8422 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008423 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008424 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008425 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008426 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008427 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008428 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
8429 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008430 if (*out == NULL) goto failed;
8431 return 0;
8432 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008433 tp = state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008434 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008435 if (isinstance == -1) {
8436 return 1;
8437 }
8438 if (isinstance) {
8439 expr_ty value;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008440 expr_ty slice;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008441 expr_context_ty ctx;
8442
Victor Stinnerf8599272020-07-03 16:57:19 +02008443 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008444 return 1;
8445 }
8446 if (tmp == NULL) {
8447 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
8448 return 1;
8449 }
8450 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008451 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008452 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008453 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008454 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008455 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008456 if (_PyObject_LookupAttr(obj, state->slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008457 return 1;
8458 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008459 if (tmp == NULL) {
8460 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
8461 return 1;
8462 }
8463 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008464 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008465 res = obj2ast_expr(state, tmp, &slice, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008466 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008467 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008468 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008469 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008470 return 1;
8471 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008472 if (tmp == NULL) {
8473 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
8474 return 1;
8475 }
8476 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008477 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008478 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008479 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008480 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008481 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008482 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
8483 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008484 if (*out == NULL) goto failed;
8485 return 0;
8486 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008487 tp = state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008488 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008489 if (isinstance == -1) {
8490 return 1;
8491 }
8492 if (isinstance) {
8493 expr_ty value;
8494 expr_context_ty ctx;
8495
Victor Stinnerf8599272020-07-03 16:57:19 +02008496 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008497 return 1;
8498 }
8499 if (tmp == NULL) {
8500 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
8501 return 1;
8502 }
8503 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008504 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008505 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008506 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008507 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008508 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008509 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008510 return 1;
8511 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008512 if (tmp == NULL) {
8513 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
8514 return 1;
8515 }
8516 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008517 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008518 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008519 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008520 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008521 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008522 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
8523 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008524 if (*out == NULL) goto failed;
8525 return 0;
8526 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008527 tp = state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008528 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008529 if (isinstance == -1) {
8530 return 1;
8531 }
8532 if (isinstance) {
8533 identifier id;
8534 expr_context_ty ctx;
8535
Victor Stinnerf8599272020-07-03 16:57:19 +02008536 if (_PyObject_LookupAttr(obj, state->id, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008537 return 1;
8538 }
8539 if (tmp == NULL) {
8540 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
8541 return 1;
8542 }
8543 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008544 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008545 res = obj2ast_identifier(state, tmp, &id, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008546 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008547 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008548 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008549 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008550 return 1;
8551 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008552 if (tmp == NULL) {
8553 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
8554 return 1;
8555 }
8556 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008557 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008558 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008559 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008560 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008561 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008562 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
8563 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008564 if (*out == NULL) goto failed;
8565 return 0;
8566 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008567 tp = state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008568 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008569 if (isinstance == -1) {
8570 return 1;
8571 }
8572 if (isinstance) {
8573 asdl_seq* elts;
8574 expr_context_ty ctx;
8575
Victor Stinnerf8599272020-07-03 16:57:19 +02008576 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008577 return 1;
8578 }
8579 if (tmp == NULL) {
8580 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
8581 return 1;
8582 }
8583 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008584 int res;
8585 Py_ssize_t len;
8586 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008587 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008588 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 +02008589 goto failed;
8590 }
8591 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008592 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008593 if (elts == NULL) goto failed;
8594 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008595 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008596 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8597 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008598 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008599 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008600 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008601 if (len != PyList_GET_SIZE(tmp)) {
8602 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
8603 goto failed;
8604 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008605 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008606 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008607 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008608 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008609 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008610 return 1;
8611 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008612 if (tmp == NULL) {
8613 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
8614 return 1;
8615 }
8616 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008617 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008618 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008619 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008620 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008621 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008622 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8623 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008624 if (*out == NULL) goto failed;
8625 return 0;
8626 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008627 tp = state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008628 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008629 if (isinstance == -1) {
8630 return 1;
8631 }
8632 if (isinstance) {
8633 asdl_seq* elts;
8634 expr_context_ty ctx;
8635
Victor Stinnerf8599272020-07-03 16:57:19 +02008636 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008637 return 1;
8638 }
8639 if (tmp == NULL) {
8640 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
8641 return 1;
8642 }
8643 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008644 int res;
8645 Py_ssize_t len;
8646 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008647 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008648 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 +02008649 goto failed;
8650 }
8651 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008652 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008653 if (elts == NULL) goto failed;
8654 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008655 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008656 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8657 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008658 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008659 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008660 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008661 if (len != PyList_GET_SIZE(tmp)) {
8662 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
8663 goto failed;
8664 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008665 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008666 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008667 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008668 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008669 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008670 return 1;
8671 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008672 if (tmp == NULL) {
8673 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
8674 return 1;
8675 }
8676 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008677 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008678 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008679 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008680 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008681 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008682 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8683 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008684 if (*out == NULL) goto failed;
8685 return 0;
8686 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008687 tp = state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008688 isinstance = PyObject_IsInstance(obj, tp);
8689 if (isinstance == -1) {
8690 return 1;
8691 }
8692 if (isinstance) {
8693 expr_ty lower;
8694 expr_ty upper;
8695 expr_ty step;
8696
Victor Stinnerf8599272020-07-03 16:57:19 +02008697 if (_PyObject_LookupAttr(obj, state->lower, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008698 return 1;
8699 }
8700 if (tmp == NULL || tmp == Py_None) {
8701 Py_CLEAR(tmp);
8702 lower = NULL;
8703 }
8704 else {
8705 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008706 res = obj2ast_expr(state, tmp, &lower, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008707 if (res != 0) goto failed;
8708 Py_CLEAR(tmp);
8709 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008710 if (_PyObject_LookupAttr(obj, state->upper, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008711 return 1;
8712 }
8713 if (tmp == NULL || tmp == Py_None) {
8714 Py_CLEAR(tmp);
8715 upper = NULL;
8716 }
8717 else {
8718 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008719 res = obj2ast_expr(state, tmp, &upper, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008720 if (res != 0) goto failed;
8721 Py_CLEAR(tmp);
8722 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008723 if (_PyObject_LookupAttr(obj, state->step, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008724 return 1;
8725 }
8726 if (tmp == NULL || tmp == Py_None) {
8727 Py_CLEAR(tmp);
8728 step = NULL;
8729 }
8730 else {
8731 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008732 res = obj2ast_expr(state, tmp, &step, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008733 if (res != 0) goto failed;
8734 Py_CLEAR(tmp);
8735 }
8736 *out = Slice(lower, upper, step, lineno, col_offset, end_lineno,
8737 end_col_offset, arena);
8738 if (*out == NULL) goto failed;
8739 return 0;
8740 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008741
8742 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
8743 failed:
8744 Py_XDECREF(tmp);
8745 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008746}
8747
8748int
Victor Stinnerf8599272020-07-03 16:57:19 +02008749obj2ast_expr_context(astmodulestate *state, PyObject* obj, expr_context_ty*
8750 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008751{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008752 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008753
Victor Stinnerf8599272020-07-03 16:57:19 +02008754 isinstance = PyObject_IsInstance(obj, state->Load_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008755 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008756 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008757 }
8758 if (isinstance) {
8759 *out = Load;
8760 return 0;
8761 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008762 isinstance = PyObject_IsInstance(obj, state->Store_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008763 if (isinstance == -1) {
8764 return 1;
8765 }
8766 if (isinstance) {
8767 *out = Store;
8768 return 0;
8769 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008770 isinstance = PyObject_IsInstance(obj, state->Del_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008771 if (isinstance == -1) {
8772 return 1;
8773 }
8774 if (isinstance) {
8775 *out = Del;
8776 return 0;
8777 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008778
8779 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
8780 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008781}
8782
8783int
Victor Stinnerf8599272020-07-03 16:57:19 +02008784obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, PyArena*
8785 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008786{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008787 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008788
Victor Stinnerf8599272020-07-03 16:57:19 +02008789 isinstance = PyObject_IsInstance(obj, state->And_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008790 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008791 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008792 }
8793 if (isinstance) {
8794 *out = And;
8795 return 0;
8796 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008797 isinstance = PyObject_IsInstance(obj, state->Or_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008798 if (isinstance == -1) {
8799 return 1;
8800 }
8801 if (isinstance) {
8802 *out = Or;
8803 return 0;
8804 }
8805
8806 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
8807 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008808}
8809
8810int
Victor Stinnerf8599272020-07-03 16:57:19 +02008811obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* out,
8812 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008813{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008814 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008815
Victor Stinnerf8599272020-07-03 16:57:19 +02008816 isinstance = PyObject_IsInstance(obj, state->Add_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008817 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008818 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008819 }
8820 if (isinstance) {
8821 *out = Add;
8822 return 0;
8823 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008824 isinstance = PyObject_IsInstance(obj, state->Sub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008825 if (isinstance == -1) {
8826 return 1;
8827 }
8828 if (isinstance) {
8829 *out = Sub;
8830 return 0;
8831 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008832 isinstance = PyObject_IsInstance(obj, state->Mult_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008833 if (isinstance == -1) {
8834 return 1;
8835 }
8836 if (isinstance) {
8837 *out = Mult;
8838 return 0;
8839 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008840 isinstance = PyObject_IsInstance(obj, state->MatMult_type);
Benjamin Petersond51374e2014-04-09 23:55:56 -04008841 if (isinstance == -1) {
8842 return 1;
8843 }
8844 if (isinstance) {
8845 *out = MatMult;
8846 return 0;
8847 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008848 isinstance = PyObject_IsInstance(obj, state->Div_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008849 if (isinstance == -1) {
8850 return 1;
8851 }
8852 if (isinstance) {
8853 *out = Div;
8854 return 0;
8855 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008856 isinstance = PyObject_IsInstance(obj, state->Mod_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008857 if (isinstance == -1) {
8858 return 1;
8859 }
8860 if (isinstance) {
8861 *out = Mod;
8862 return 0;
8863 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008864 isinstance = PyObject_IsInstance(obj, state->Pow_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008865 if (isinstance == -1) {
8866 return 1;
8867 }
8868 if (isinstance) {
8869 *out = Pow;
8870 return 0;
8871 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008872 isinstance = PyObject_IsInstance(obj, state->LShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008873 if (isinstance == -1) {
8874 return 1;
8875 }
8876 if (isinstance) {
8877 *out = LShift;
8878 return 0;
8879 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008880 isinstance = PyObject_IsInstance(obj, state->RShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008881 if (isinstance == -1) {
8882 return 1;
8883 }
8884 if (isinstance) {
8885 *out = RShift;
8886 return 0;
8887 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008888 isinstance = PyObject_IsInstance(obj, state->BitOr_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008889 if (isinstance == -1) {
8890 return 1;
8891 }
8892 if (isinstance) {
8893 *out = BitOr;
8894 return 0;
8895 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008896 isinstance = PyObject_IsInstance(obj, state->BitXor_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008897 if (isinstance == -1) {
8898 return 1;
8899 }
8900 if (isinstance) {
8901 *out = BitXor;
8902 return 0;
8903 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008904 isinstance = PyObject_IsInstance(obj, state->BitAnd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008905 if (isinstance == -1) {
8906 return 1;
8907 }
8908 if (isinstance) {
8909 *out = BitAnd;
8910 return 0;
8911 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008912 isinstance = PyObject_IsInstance(obj, state->FloorDiv_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008913 if (isinstance == -1) {
8914 return 1;
8915 }
8916 if (isinstance) {
8917 *out = FloorDiv;
8918 return 0;
8919 }
8920
8921 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
8922 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008923}
8924
8925int
Victor Stinnerf8599272020-07-03 16:57:19 +02008926obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* out, PyArena*
8927 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008928{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008929 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008930
Victor Stinnerf8599272020-07-03 16:57:19 +02008931 isinstance = PyObject_IsInstance(obj, state->Invert_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008932 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008933 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008934 }
8935 if (isinstance) {
8936 *out = Invert;
8937 return 0;
8938 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008939 isinstance = PyObject_IsInstance(obj, state->Not_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008940 if (isinstance == -1) {
8941 return 1;
8942 }
8943 if (isinstance) {
8944 *out = Not;
8945 return 0;
8946 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008947 isinstance = PyObject_IsInstance(obj, state->UAdd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008948 if (isinstance == -1) {
8949 return 1;
8950 }
8951 if (isinstance) {
8952 *out = UAdd;
8953 return 0;
8954 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008955 isinstance = PyObject_IsInstance(obj, state->USub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008956 if (isinstance == -1) {
8957 return 1;
8958 }
8959 if (isinstance) {
8960 *out = USub;
8961 return 0;
8962 }
8963
8964 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
8965 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008966}
8967
8968int
Victor Stinnerf8599272020-07-03 16:57:19 +02008969obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, PyArena*
8970 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008971{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008972 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008973
Victor Stinnerf8599272020-07-03 16:57:19 +02008974 isinstance = PyObject_IsInstance(obj, state->Eq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008975 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008976 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008977 }
8978 if (isinstance) {
8979 *out = Eq;
8980 return 0;
8981 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008982 isinstance = PyObject_IsInstance(obj, state->NotEq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008983 if (isinstance == -1) {
8984 return 1;
8985 }
8986 if (isinstance) {
8987 *out = NotEq;
8988 return 0;
8989 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008990 isinstance = PyObject_IsInstance(obj, state->Lt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008991 if (isinstance == -1) {
8992 return 1;
8993 }
8994 if (isinstance) {
8995 *out = Lt;
8996 return 0;
8997 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008998 isinstance = PyObject_IsInstance(obj, state->LtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008999 if (isinstance == -1) {
9000 return 1;
9001 }
9002 if (isinstance) {
9003 *out = LtE;
9004 return 0;
9005 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009006 isinstance = PyObject_IsInstance(obj, state->Gt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009007 if (isinstance == -1) {
9008 return 1;
9009 }
9010 if (isinstance) {
9011 *out = Gt;
9012 return 0;
9013 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009014 isinstance = PyObject_IsInstance(obj, state->GtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009015 if (isinstance == -1) {
9016 return 1;
9017 }
9018 if (isinstance) {
9019 *out = GtE;
9020 return 0;
9021 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009022 isinstance = PyObject_IsInstance(obj, state->Is_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009023 if (isinstance == -1) {
9024 return 1;
9025 }
9026 if (isinstance) {
9027 *out = Is;
9028 return 0;
9029 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009030 isinstance = PyObject_IsInstance(obj, state->IsNot_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009031 if (isinstance == -1) {
9032 return 1;
9033 }
9034 if (isinstance) {
9035 *out = IsNot;
9036 return 0;
9037 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009038 isinstance = PyObject_IsInstance(obj, state->In_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009039 if (isinstance == -1) {
9040 return 1;
9041 }
9042 if (isinstance) {
9043 *out = In;
9044 return 0;
9045 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009046 isinstance = PyObject_IsInstance(obj, state->NotIn_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009047 if (isinstance == -1) {
9048 return 1;
9049 }
9050 if (isinstance) {
9051 *out = NotIn;
9052 return 0;
9053 }
9054
9055 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
9056 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009057}
9058
9059int
Victor Stinnerf8599272020-07-03 16:57:19 +02009060obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty*
9061 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009062{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009063 PyObject* tmp = NULL;
9064 expr_ty target;
9065 expr_ty iter;
9066 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009067 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009068
Victor Stinnerf8599272020-07-03 16:57:19 +02009069 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009070 return 1;
9071 }
9072 if (tmp == NULL) {
9073 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
9074 return 1;
9075 }
9076 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009077 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009078 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009079 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009080 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009081 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009082 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009083 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009084 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009085 if (tmp == NULL) {
9086 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
9087 return 1;
9088 }
9089 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009090 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009091 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009092 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009093 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009094 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009095 if (_PyObject_LookupAttr(obj, state->ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009096 return 1;
9097 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009098 if (tmp == NULL) {
9099 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
9100 return 1;
9101 }
9102 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009103 int res;
9104 Py_ssize_t len;
9105 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009106 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009107 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 +02009108 goto failed;
9109 }
9110 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009111 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009112 if (ifs == NULL) goto failed;
9113 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009114 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009115 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9116 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009117 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009118 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009119 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009120 if (len != PyList_GET_SIZE(tmp)) {
9121 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
9122 goto failed;
9123 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009124 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009125 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009126 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009127 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009128 if (_PyObject_LookupAttr(obj, state->is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009129 return 1;
9130 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009131 if (tmp == NULL) {
9132 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
9133 return 1;
9134 }
9135 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009136 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009137 res = obj2ast_int(state, tmp, &is_async, arena);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009138 if (res != 0) goto failed;
9139 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009140 }
9141 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009142 return 0;
9143failed:
9144 Py_XDECREF(tmp);
9145 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009146}
9147
9148int
Victor Stinnerf8599272020-07-03 16:57:19 +02009149obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty*
9150 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009151{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009152 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00009153
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009154 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009155 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009156 int lineno;
9157 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009158 int end_lineno;
9159 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009160
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009161 if (obj == Py_None) {
9162 *out = NULL;
9163 return 0;
9164 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009165 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009166 return 1;
9167 }
9168 if (tmp == NULL) {
9169 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
9170 return 1;
9171 }
9172 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009173 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009174 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009175 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009176 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009177 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009178 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009179 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009180 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009181 if (tmp == NULL) {
9182 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
9183 return 1;
9184 }
9185 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009186 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009187 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009188 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009189 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009190 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009191 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009192 return 1;
9193 }
9194 if (tmp == NULL || tmp == Py_None) {
9195 Py_CLEAR(tmp);
9196 end_lineno = 0;
9197 }
9198 else {
9199 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009200 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009201 if (res != 0) goto failed;
9202 Py_CLEAR(tmp);
9203 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009204 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009205 return 1;
9206 }
9207 if (tmp == NULL || tmp == Py_None) {
9208 Py_CLEAR(tmp);
9209 end_col_offset = 0;
9210 }
9211 else {
9212 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009213 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009214 if (res != 0) goto failed;
9215 Py_CLEAR(tmp);
9216 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009217 tp = state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009218 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009219 if (isinstance == -1) {
9220 return 1;
9221 }
9222 if (isinstance) {
9223 expr_ty type;
9224 identifier name;
9225 asdl_seq* body;
9226
Victor Stinnerf8599272020-07-03 16:57:19 +02009227 if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009228 return 1;
9229 }
9230 if (tmp == NULL || tmp == Py_None) {
9231 Py_CLEAR(tmp);
9232 type = NULL;
9233 }
9234 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009235 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009236 res = obj2ast_expr(state, tmp, &type, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009237 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009238 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009239 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009240 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009241 return 1;
9242 }
9243 if (tmp == NULL || tmp == Py_None) {
9244 Py_CLEAR(tmp);
9245 name = NULL;
9246 }
9247 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009248 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009249 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009250 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009251 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009252 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009253 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009254 return 1;
9255 }
9256 if (tmp == NULL) {
9257 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
9258 return 1;
9259 }
9260 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009261 int res;
9262 Py_ssize_t len;
9263 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009264 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009265 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 +02009266 goto failed;
9267 }
9268 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009269 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009270 if (body == NULL) goto failed;
9271 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009272 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009273 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9274 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009275 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009276 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009277 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009278 if (len != PyList_GET_SIZE(tmp)) {
9279 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
9280 goto failed;
9281 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009282 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009283 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009284 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009285 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009286 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
9287 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009288 if (*out == NULL) goto failed;
9289 return 0;
9290 }
9291
9292 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
9293 failed:
9294 Py_XDECREF(tmp);
9295 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009296}
9297
9298int
Victor Stinnerf8599272020-07-03 16:57:19 +02009299obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out,
9300 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009301{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009302 PyObject* tmp = NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009303 asdl_seq* posonlyargs;
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009304 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009305 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009306 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009307 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009308 arg_ty kwarg;
9309 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009310
Victor Stinnerf8599272020-07-03 16:57:19 +02009311 if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009312 return 1;
9313 }
9314 if (tmp == NULL) {
9315 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
9316 return 1;
9317 }
9318 else {
9319 int res;
9320 Py_ssize_t len;
9321 Py_ssize_t i;
9322 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009323 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 +01009324 goto failed;
9325 }
9326 len = PyList_GET_SIZE(tmp);
9327 posonlyargs = _Py_asdl_seq_new(len, arena);
9328 if (posonlyargs == NULL) goto failed;
9329 for (i = 0; i < len; i++) {
9330 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009331 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9332 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009333 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009334 Py_DECREF(tmp2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009335 if (res != 0) goto failed;
9336 if (len != PyList_GET_SIZE(tmp)) {
9337 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
9338 goto failed;
9339 }
9340 asdl_seq_SET(posonlyargs, i, val);
9341 }
9342 Py_CLEAR(tmp);
9343 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009344 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009345 return 1;
9346 }
9347 if (tmp == NULL) {
9348 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
9349 return 1;
9350 }
9351 else {
9352 int res;
9353 Py_ssize_t len;
9354 Py_ssize_t i;
9355 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009356 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 +02009357 goto failed;
9358 }
9359 len = PyList_GET_SIZE(tmp);
9360 args = _Py_asdl_seq_new(len, arena);
9361 if (args == NULL) goto failed;
9362 for (i = 0; i < len; i++) {
9363 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009364 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9365 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009366 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009367 Py_DECREF(tmp2);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009368 if (res != 0) goto failed;
9369 if (len != PyList_GET_SIZE(tmp)) {
9370 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
9371 goto failed;
9372 }
9373 asdl_seq_SET(args, i, val);
9374 }
9375 Py_CLEAR(tmp);
9376 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009377 if (_PyObject_LookupAttr(obj, state->vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009378 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009379 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009380 if (tmp == NULL || tmp == Py_None) {
9381 Py_CLEAR(tmp);
9382 vararg = NULL;
9383 }
9384 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009385 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009386 res = obj2ast_arg(state, tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009387 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009388 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009389 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009390 if (_PyObject_LookupAttr(obj, state->kwonlyargs, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009391 return 1;
9392 }
9393 if (tmp == NULL) {
9394 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
9395 return 1;
9396 }
9397 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009398 int res;
9399 Py_ssize_t len;
9400 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009401 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009402 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 +02009403 goto failed;
9404 }
9405 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009406 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009407 if (kwonlyargs == NULL) goto failed;
9408 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009409 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009410 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9411 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009412 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009413 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009414 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009415 if (len != PyList_GET_SIZE(tmp)) {
9416 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
9417 goto failed;
9418 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009419 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009420 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009421 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009422 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009423 if (_PyObject_LookupAttr(obj, state->kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009424 return 1;
9425 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009426 if (tmp == NULL) {
9427 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
9428 return 1;
9429 }
9430 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009431 int res;
9432 Py_ssize_t len;
9433 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009434 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009435 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 +02009436 goto failed;
9437 }
9438 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009439 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009440 if (kw_defaults == NULL) goto failed;
9441 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009442 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009443 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9444 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009445 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009446 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009447 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009448 if (len != PyList_GET_SIZE(tmp)) {
9449 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
9450 goto failed;
9451 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009452 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009453 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009454 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009455 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009456 if (_PyObject_LookupAttr(obj, state->kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009457 return 1;
9458 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009459 if (tmp == NULL || tmp == Py_None) {
9460 Py_CLEAR(tmp);
9461 kwarg = NULL;
9462 }
9463 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009464 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009465 res = obj2ast_arg(state, tmp, &kwarg, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009466 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02009467 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009468 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009469 if (_PyObject_LookupAttr(obj, state->defaults, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009470 return 1;
9471 }
9472 if (tmp == NULL) {
9473 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
9474 return 1;
9475 }
9476 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009477 int res;
9478 Py_ssize_t len;
9479 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009480 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009481 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 +02009482 goto failed;
9483 }
9484 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009485 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009486 if (defaults == NULL) goto failed;
9487 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009488 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009489 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9490 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009491 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009492 Py_DECREF(tmp2);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009493 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009494 if (len != PyList_GET_SIZE(tmp)) {
9495 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
9496 goto failed;
9497 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009498 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009499 }
Victor Stinnerb3189902013-07-27 00:04:42 +02009500 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009501 }
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009502 *out = arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg,
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009503 defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009504 return 0;
9505failed:
9506 Py_XDECREF(tmp);
9507 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009508}
9509
9510int
Victor Stinnerf8599272020-07-03 16:57:19 +02009511obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009512{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009513 PyObject* tmp = NULL;
9514 identifier arg;
9515 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009516 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01009517 int lineno;
9518 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009519 int end_lineno;
9520 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009521
Victor Stinnerf8599272020-07-03 16:57:19 +02009522 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009523 return 1;
9524 }
9525 if (tmp == NULL) {
9526 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
9527 return 1;
9528 }
9529 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009530 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009531 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009532 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009533 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009534 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009535 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009536 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009537 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009538 if (tmp == NULL || tmp == Py_None) {
9539 Py_CLEAR(tmp);
9540 annotation = NULL;
9541 }
9542 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009543 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009544 res = obj2ast_expr(state, tmp, &annotation, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009545 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009546 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009547 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009548 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009549 return 1;
9550 }
9551 if (tmp == NULL || tmp == Py_None) {
9552 Py_CLEAR(tmp);
9553 type_comment = NULL;
9554 }
9555 else {
9556 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009557 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009558 if (res != 0) goto failed;
9559 Py_CLEAR(tmp);
9560 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009561 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009562 return 1;
9563 }
9564 if (tmp == NULL) {
9565 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
9566 return 1;
9567 }
9568 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009569 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009570 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009571 if (res != 0) goto failed;
9572 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009573 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009574 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01009575 return 1;
9576 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009577 if (tmp == NULL) {
9578 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
9579 return 1;
9580 }
9581 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009582 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009583 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009584 if (res != 0) goto failed;
9585 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01009586 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009587 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009588 return 1;
9589 }
9590 if (tmp == NULL || tmp == Py_None) {
9591 Py_CLEAR(tmp);
9592 end_lineno = 0;
9593 }
9594 else {
9595 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009596 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009597 if (res != 0) goto failed;
9598 Py_CLEAR(tmp);
9599 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009600 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009601 return 1;
9602 }
9603 if (tmp == NULL || tmp == Py_None) {
9604 Py_CLEAR(tmp);
9605 end_col_offset = 0;
9606 }
9607 else {
9608 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009609 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009610 if (res != 0) goto failed;
9611 Py_CLEAR(tmp);
9612 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009613 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
9614 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009615 return 0;
9616failed:
9617 Py_XDECREF(tmp);
9618 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009619}
9620
9621int
Victor Stinnerf8599272020-07-03 16:57:19 +02009622obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* out, PyArena*
9623 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009624{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009625 PyObject* tmp = NULL;
9626 identifier arg;
9627 expr_ty value;
Pablo Galindo168660b2020-04-02 00:47:39 +01009628 int lineno;
9629 int col_offset;
9630 int end_lineno;
9631 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009632
Victor Stinnerf8599272020-07-03 16:57:19 +02009633 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009634 return 1;
9635 }
9636 if (tmp == NULL || tmp == Py_None) {
9637 Py_CLEAR(tmp);
9638 arg = NULL;
9639 }
9640 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009641 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009642 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009643 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009644 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009645 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009646 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009647 return 1;
9648 }
9649 if (tmp == NULL) {
9650 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
9651 return 1;
9652 }
9653 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009654 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009655 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009656 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009657 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009658 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009659 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009660 return 1;
9661 }
9662 if (tmp == NULL) {
9663 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from keyword");
9664 return 1;
9665 }
9666 else {
9667 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009668 res = obj2ast_int(state, tmp, &lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009669 if (res != 0) goto failed;
9670 Py_CLEAR(tmp);
9671 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009672 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009673 return 1;
9674 }
9675 if (tmp == NULL) {
9676 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from keyword");
9677 return 1;
9678 }
9679 else {
9680 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009681 res = obj2ast_int(state, tmp, &col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009682 if (res != 0) goto failed;
9683 Py_CLEAR(tmp);
9684 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009685 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009686 return 1;
9687 }
9688 if (tmp == NULL || tmp == Py_None) {
9689 Py_CLEAR(tmp);
9690 end_lineno = 0;
9691 }
9692 else {
9693 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009694 res = obj2ast_int(state, tmp, &end_lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009695 if (res != 0) goto failed;
9696 Py_CLEAR(tmp);
9697 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009698 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009699 return 1;
9700 }
9701 if (tmp == NULL || tmp == Py_None) {
9702 Py_CLEAR(tmp);
9703 end_col_offset = 0;
9704 }
9705 else {
9706 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009707 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009708 if (res != 0) goto failed;
9709 Py_CLEAR(tmp);
9710 }
9711 *out = keyword(arg, value, lineno, col_offset, end_lineno, end_col_offset,
9712 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009713 return 0;
9714failed:
9715 Py_XDECREF(tmp);
9716 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009717}
9718
9719int
Victor Stinnerf8599272020-07-03 16:57:19 +02009720obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, PyArena*
9721 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009722{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009723 PyObject* tmp = NULL;
9724 identifier name;
9725 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009726
Victor Stinnerf8599272020-07-03 16:57:19 +02009727 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009728 return 1;
9729 }
9730 if (tmp == NULL) {
9731 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
9732 return 1;
9733 }
9734 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009735 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009736 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009737 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009738 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009739 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009740 if (_PyObject_LookupAttr(obj, state->asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009741 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009742 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009743 if (tmp == NULL || tmp == Py_None) {
9744 Py_CLEAR(tmp);
9745 asname = NULL;
9746 }
9747 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009748 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009749 res = obj2ast_identifier(state, tmp, &asname, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009750 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009751 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009752 }
9753 *out = alias(name, asname, arena);
9754 return 0;
9755failed:
9756 Py_XDECREF(tmp);
9757 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009758}
9759
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009760int
Victor Stinnerf8599272020-07-03 16:57:19 +02009761obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* out,
9762 PyArena* arena)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009763{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009764 PyObject* tmp = NULL;
9765 expr_ty context_expr;
9766 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009767
Victor Stinnerf8599272020-07-03 16:57:19 +02009768 if (_PyObject_LookupAttr(obj, state->context_expr, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009769 return 1;
9770 }
9771 if (tmp == NULL) {
9772 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
9773 return 1;
9774 }
9775 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009776 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009777 res = obj2ast_expr(state, tmp, &context_expr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009778 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009779 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009780 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009781 if (_PyObject_LookupAttr(obj, state->optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009782 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009783 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009784 if (tmp == NULL || tmp == Py_None) {
9785 Py_CLEAR(tmp);
9786 optional_vars = NULL;
9787 }
9788 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009789 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009790 res = obj2ast_expr(state, tmp, &optional_vars, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009791 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009792 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009793 }
9794 *out = withitem(context_expr, optional_vars, arena);
9795 return 0;
9796failed:
9797 Py_XDECREF(tmp);
9798 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009799}
9800
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009801int
Victor Stinnerf8599272020-07-03 16:57:19 +02009802obj2ast_type_ignore(astmodulestate *state, PyObject* obj, type_ignore_ty* out,
9803 PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009804{
9805 int isinstance;
9806
9807 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009808 PyObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009809
9810 if (obj == Py_None) {
9811 *out = NULL;
9812 return 0;
9813 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009814 tp = state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009815 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009816 if (isinstance == -1) {
9817 return 1;
9818 }
9819 if (isinstance) {
9820 int lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009821 string tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009822
Victor Stinnerf8599272020-07-03 16:57:19 +02009823 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009824 return 1;
9825 }
9826 if (tmp == NULL) {
9827 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
9828 return 1;
9829 }
9830 else {
9831 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009832 res = obj2ast_int(state, tmp, &lineno, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009833 if (res != 0) goto failed;
9834 Py_CLEAR(tmp);
9835 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009836 if (_PyObject_LookupAttr(obj, state->tag, &tmp) < 0) {
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009837 return 1;
9838 }
9839 if (tmp == NULL) {
9840 PyErr_SetString(PyExc_TypeError, "required field \"tag\" missing from TypeIgnore");
9841 return 1;
9842 }
9843 else {
9844 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009845 res = obj2ast_string(state, tmp, &tag, arena);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009846 if (res != 0) goto failed;
9847 Py_CLEAR(tmp);
9848 }
9849 *out = TypeIgnore(lineno, tag, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009850 if (*out == NULL) goto failed;
9851 return 0;
9852 }
9853
9854 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
9855 failed:
9856 Py_XDECREF(tmp);
9857 return 1;
9858}
9859
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009860
Victor Stinnerd2bea262020-08-10 15:55:54 +02009861static int
9862astmodule_exec(PyObject *m)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00009863{
Victor Stinnerf8599272020-07-03 16:57:19 +02009864 astmodulestate *state = get_ast_state(m);
9865
Victor Stinnerd2bea262020-08-10 15:55:54 +02009866 if (!init_types(state)) {
9867 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009868 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009869 if (PyModule_AddObject(m, "AST", state->AST_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009870 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009871 }
9872 Py_INCREF(state->AST_type);
Brandt Bucherd2f96672020-02-06 06:45:46 -08009873 if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009874 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009875 }
9876 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009877 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009878 }
9879 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009880 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009881 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009882 if (PyModule_AddObject(m, "mod", state->mod_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009883 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009884 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009885 Py_INCREF(state->mod_type);
9886 if (PyModule_AddObject(m, "Module", state->Module_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009887 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009888 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009889 Py_INCREF(state->Module_type);
9890 if (PyModule_AddObject(m, "Interactive", state->Interactive_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009891 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009892 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009893 Py_INCREF(state->Interactive_type);
9894 if (PyModule_AddObject(m, "Expression", state->Expression_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009895 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009896 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009897 Py_INCREF(state->Expression_type);
9898 if (PyModule_AddObject(m, "FunctionType", state->FunctionType_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009899 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009900 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009901 Py_INCREF(state->FunctionType_type);
9902 if (PyModule_AddObject(m, "stmt", state->stmt_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009903 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009904 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009905 Py_INCREF(state->stmt_type);
9906 if (PyModule_AddObject(m, "FunctionDef", state->FunctionDef_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009907 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009908 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009909 Py_INCREF(state->FunctionDef_type);
9910 if (PyModule_AddObject(m, "AsyncFunctionDef", state->AsyncFunctionDef_type)
Brandt Bucherd2f96672020-02-06 06:45:46 -08009911 < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009912 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009913 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009914 Py_INCREF(state->AsyncFunctionDef_type);
9915 if (PyModule_AddObject(m, "ClassDef", state->ClassDef_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009916 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009917 }
9918 Py_INCREF(state->ClassDef_type);
9919 if (PyModule_AddObject(m, "Return", state->Return_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009920 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009921 }
9922 Py_INCREF(state->Return_type);
9923 if (PyModule_AddObject(m, "Delete", state->Delete_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009924 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009925 }
9926 Py_INCREF(state->Delete_type);
9927 if (PyModule_AddObject(m, "Assign", state->Assign_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009928 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009929 }
9930 Py_INCREF(state->Assign_type);
9931 if (PyModule_AddObject(m, "AugAssign", state->AugAssign_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009932 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009933 }
9934 Py_INCREF(state->AugAssign_type);
9935 if (PyModule_AddObject(m, "AnnAssign", state->AnnAssign_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009936 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009937 }
9938 Py_INCREF(state->AnnAssign_type);
9939 if (PyModule_AddObject(m, "For", state->For_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009940 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009941 }
9942 Py_INCREF(state->For_type);
9943 if (PyModule_AddObject(m, "AsyncFor", state->AsyncFor_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009944 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009945 }
9946 Py_INCREF(state->AsyncFor_type);
9947 if (PyModule_AddObject(m, "While", state->While_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009948 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009949 }
9950 Py_INCREF(state->While_type);
9951 if (PyModule_AddObject(m, "If", state->If_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009952 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009953 }
9954 Py_INCREF(state->If_type);
9955 if (PyModule_AddObject(m, "With", state->With_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009956 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009957 }
9958 Py_INCREF(state->With_type);
9959 if (PyModule_AddObject(m, "AsyncWith", state->AsyncWith_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009960 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009961 }
9962 Py_INCREF(state->AsyncWith_type);
9963 if (PyModule_AddObject(m, "Raise", state->Raise_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009964 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009965 }
9966 Py_INCREF(state->Raise_type);
9967 if (PyModule_AddObject(m, "Try", state->Try_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009968 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009969 }
9970 Py_INCREF(state->Try_type);
9971 if (PyModule_AddObject(m, "Assert", state->Assert_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009972 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009973 }
9974 Py_INCREF(state->Assert_type);
9975 if (PyModule_AddObject(m, "Import", state->Import_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009976 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009977 }
9978 Py_INCREF(state->Import_type);
9979 if (PyModule_AddObject(m, "ImportFrom", state->ImportFrom_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009980 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009981 }
9982 Py_INCREF(state->ImportFrom_type);
9983 if (PyModule_AddObject(m, "Global", state->Global_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009984 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009985 }
9986 Py_INCREF(state->Global_type);
9987 if (PyModule_AddObject(m, "Nonlocal", state->Nonlocal_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009988 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009989 }
9990 Py_INCREF(state->Nonlocal_type);
9991 if (PyModule_AddObject(m, "Expr", state->Expr_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009992 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009993 }
9994 Py_INCREF(state->Expr_type);
9995 if (PyModule_AddObject(m, "Pass", state->Pass_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +02009996 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +02009997 }
9998 Py_INCREF(state->Pass_type);
9999 if (PyModule_AddObject(m, "Break", state->Break_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010000 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010001 }
10002 Py_INCREF(state->Break_type);
10003 if (PyModule_AddObject(m, "Continue", state->Continue_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010004 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010005 }
10006 Py_INCREF(state->Continue_type);
10007 if (PyModule_AddObject(m, "expr", state->expr_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010008 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010009 }
10010 Py_INCREF(state->expr_type);
10011 if (PyModule_AddObject(m, "BoolOp", state->BoolOp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010012 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010013 }
10014 Py_INCREF(state->BoolOp_type);
10015 if (PyModule_AddObject(m, "NamedExpr", state->NamedExpr_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010016 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010017 }
10018 Py_INCREF(state->NamedExpr_type);
10019 if (PyModule_AddObject(m, "BinOp", state->BinOp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010020 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010021 }
10022 Py_INCREF(state->BinOp_type);
10023 if (PyModule_AddObject(m, "UnaryOp", state->UnaryOp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010024 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010025 }
10026 Py_INCREF(state->UnaryOp_type);
10027 if (PyModule_AddObject(m, "Lambda", state->Lambda_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010028 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010029 }
10030 Py_INCREF(state->Lambda_type);
10031 if (PyModule_AddObject(m, "IfExp", state->IfExp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010032 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010033 }
10034 Py_INCREF(state->IfExp_type);
10035 if (PyModule_AddObject(m, "Dict", state->Dict_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010036 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010037 }
10038 Py_INCREF(state->Dict_type);
10039 if (PyModule_AddObject(m, "Set", state->Set_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010040 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010041 }
10042 Py_INCREF(state->Set_type);
10043 if (PyModule_AddObject(m, "ListComp", state->ListComp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010044 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010045 }
10046 Py_INCREF(state->ListComp_type);
10047 if (PyModule_AddObject(m, "SetComp", state->SetComp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010048 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010049 }
10050 Py_INCREF(state->SetComp_type);
10051 if (PyModule_AddObject(m, "DictComp", state->DictComp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010052 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010053 }
10054 Py_INCREF(state->DictComp_type);
10055 if (PyModule_AddObject(m, "GeneratorExp", state->GeneratorExp_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010056 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010057 }
10058 Py_INCREF(state->GeneratorExp_type);
10059 if (PyModule_AddObject(m, "Await", state->Await_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010060 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010061 }
10062 Py_INCREF(state->Await_type);
10063 if (PyModule_AddObject(m, "Yield", state->Yield_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010064 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010065 }
10066 Py_INCREF(state->Yield_type);
10067 if (PyModule_AddObject(m, "YieldFrom", state->YieldFrom_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010068 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010069 }
10070 Py_INCREF(state->YieldFrom_type);
10071 if (PyModule_AddObject(m, "Compare", state->Compare_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010072 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010073 }
10074 Py_INCREF(state->Compare_type);
10075 if (PyModule_AddObject(m, "Call", state->Call_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010076 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010077 }
10078 Py_INCREF(state->Call_type);
10079 if (PyModule_AddObject(m, "FormattedValue", state->FormattedValue_type) <
Brandt Bucherd2f96672020-02-06 06:45:46 -080010080 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010081 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010082 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010083 Py_INCREF(state->FormattedValue_type);
10084 if (PyModule_AddObject(m, "JoinedStr", state->JoinedStr_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010085 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010086 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010087 Py_INCREF(state->JoinedStr_type);
10088 if (PyModule_AddObject(m, "Constant", state->Constant_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010089 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010090 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010091 Py_INCREF(state->Constant_type);
10092 if (PyModule_AddObject(m, "Attribute", state->Attribute_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010093 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010094 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010095 Py_INCREF(state->Attribute_type);
10096 if (PyModule_AddObject(m, "Subscript", state->Subscript_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010097 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010098 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010099 Py_INCREF(state->Subscript_type);
10100 if (PyModule_AddObject(m, "Starred", state->Starred_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010101 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010102 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010103 Py_INCREF(state->Starred_type);
10104 if (PyModule_AddObject(m, "Name", state->Name_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010105 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010106 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010107 Py_INCREF(state->Name_type);
10108 if (PyModule_AddObject(m, "List", state->List_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010109 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010110 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010111 Py_INCREF(state->List_type);
10112 if (PyModule_AddObject(m, "Tuple", state->Tuple_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010113 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010114 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010115 Py_INCREF(state->Tuple_type);
10116 if (PyModule_AddObject(m, "Slice", state->Slice_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010117 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010118 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010119 Py_INCREF(state->Slice_type);
10120 if (PyModule_AddObject(m, "expr_context", state->expr_context_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010121 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010122 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010123 Py_INCREF(state->expr_context_type);
10124 if (PyModule_AddObject(m, "Load", state->Load_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010125 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010126 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010127 Py_INCREF(state->Load_type);
10128 if (PyModule_AddObject(m, "Store", state->Store_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010129 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010130 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010131 Py_INCREF(state->Store_type);
10132 if (PyModule_AddObject(m, "Del", state->Del_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010133 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010134 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010135 Py_INCREF(state->Del_type);
10136 if (PyModule_AddObject(m, "boolop", state->boolop_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010137 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010138 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010139 Py_INCREF(state->boolop_type);
10140 if (PyModule_AddObject(m, "And", state->And_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010141 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010142 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010143 Py_INCREF(state->And_type);
10144 if (PyModule_AddObject(m, "Or", state->Or_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010145 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010146 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010147 Py_INCREF(state->Or_type);
10148 if (PyModule_AddObject(m, "operator", state->operator_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010149 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010150 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010151 Py_INCREF(state->operator_type);
10152 if (PyModule_AddObject(m, "Add", state->Add_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010153 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010154 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010155 Py_INCREF(state->Add_type);
10156 if (PyModule_AddObject(m, "Sub", state->Sub_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010157 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010158 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010159 Py_INCREF(state->Sub_type);
10160 if (PyModule_AddObject(m, "Mult", state->Mult_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010161 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010162 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010163 Py_INCREF(state->Mult_type);
10164 if (PyModule_AddObject(m, "MatMult", state->MatMult_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010165 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010166 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010167 Py_INCREF(state->MatMult_type);
10168 if (PyModule_AddObject(m, "Div", state->Div_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010169 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010170 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010171 Py_INCREF(state->Div_type);
10172 if (PyModule_AddObject(m, "Mod", state->Mod_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010173 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010174 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010175 Py_INCREF(state->Mod_type);
10176 if (PyModule_AddObject(m, "Pow", state->Pow_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010177 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010178 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010179 Py_INCREF(state->Pow_type);
10180 if (PyModule_AddObject(m, "LShift", state->LShift_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010181 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010182 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010183 Py_INCREF(state->LShift_type);
10184 if (PyModule_AddObject(m, "RShift", state->RShift_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010185 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010186 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010187 Py_INCREF(state->RShift_type);
10188 if (PyModule_AddObject(m, "BitOr", state->BitOr_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010189 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010190 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010191 Py_INCREF(state->BitOr_type);
10192 if (PyModule_AddObject(m, "BitXor", state->BitXor_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010193 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010194 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010195 Py_INCREF(state->BitXor_type);
10196 if (PyModule_AddObject(m, "BitAnd", state->BitAnd_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010197 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010198 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010199 Py_INCREF(state->BitAnd_type);
10200 if (PyModule_AddObject(m, "FloorDiv", state->FloorDiv_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010201 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010202 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010203 Py_INCREF(state->FloorDiv_type);
10204 if (PyModule_AddObject(m, "unaryop", state->unaryop_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010205 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010206 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010207 Py_INCREF(state->unaryop_type);
10208 if (PyModule_AddObject(m, "Invert", state->Invert_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010209 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010210 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010211 Py_INCREF(state->Invert_type);
10212 if (PyModule_AddObject(m, "Not", state->Not_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010213 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010214 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010215 Py_INCREF(state->Not_type);
10216 if (PyModule_AddObject(m, "UAdd", state->UAdd_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010217 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010218 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010219 Py_INCREF(state->UAdd_type);
10220 if (PyModule_AddObject(m, "USub", state->USub_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010221 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010222 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010223 Py_INCREF(state->USub_type);
10224 if (PyModule_AddObject(m, "cmpop", state->cmpop_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010225 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010226 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010227 Py_INCREF(state->cmpop_type);
10228 if (PyModule_AddObject(m, "Eq", state->Eq_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010229 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010230 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010231 Py_INCREF(state->Eq_type);
10232 if (PyModule_AddObject(m, "NotEq", state->NotEq_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010233 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010234 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010235 Py_INCREF(state->NotEq_type);
10236 if (PyModule_AddObject(m, "Lt", state->Lt_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010237 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010238 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010239 Py_INCREF(state->Lt_type);
10240 if (PyModule_AddObject(m, "LtE", state->LtE_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010241 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010242 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010243 Py_INCREF(state->LtE_type);
10244 if (PyModule_AddObject(m, "Gt", state->Gt_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010245 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010246 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010247 Py_INCREF(state->Gt_type);
10248 if (PyModule_AddObject(m, "GtE", state->GtE_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010249 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010250 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010251 Py_INCREF(state->GtE_type);
10252 if (PyModule_AddObject(m, "Is", state->Is_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010253 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010254 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010255 Py_INCREF(state->Is_type);
10256 if (PyModule_AddObject(m, "IsNot", state->IsNot_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010257 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010258 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010259 Py_INCREF(state->IsNot_type);
10260 if (PyModule_AddObject(m, "In", state->In_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010261 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010262 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010263 Py_INCREF(state->In_type);
10264 if (PyModule_AddObject(m, "NotIn", state->NotIn_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010265 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010266 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010267 Py_INCREF(state->NotIn_type);
10268 if (PyModule_AddObject(m, "comprehension", state->comprehension_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010269 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010270 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010271 Py_INCREF(state->comprehension_type);
10272 if (PyModule_AddObject(m, "excepthandler", state->excepthandler_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010273 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010274 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010275 Py_INCREF(state->excepthandler_type);
10276 if (PyModule_AddObject(m, "ExceptHandler", state->ExceptHandler_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010277 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010278 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010279 Py_INCREF(state->ExceptHandler_type);
10280 if (PyModule_AddObject(m, "arguments", state->arguments_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010281 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010282 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010283 Py_INCREF(state->arguments_type);
10284 if (PyModule_AddObject(m, "arg", state->arg_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010285 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010286 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010287 Py_INCREF(state->arg_type);
10288 if (PyModule_AddObject(m, "keyword", state->keyword_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010289 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010290 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010291 Py_INCREF(state->keyword_type);
10292 if (PyModule_AddObject(m, "alias", state->alias_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010293 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010294 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010295 Py_INCREF(state->alias_type);
10296 if (PyModule_AddObject(m, "withitem", state->withitem_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010297 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010298 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010299 Py_INCREF(state->withitem_type);
10300 if (PyModule_AddObject(m, "type_ignore", state->type_ignore_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010301 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010302 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010303 Py_INCREF(state->type_ignore_type);
10304 if (PyModule_AddObject(m, "TypeIgnore", state->TypeIgnore_type) < 0) {
Victor Stinnerd2bea262020-08-10 15:55:54 +020010305 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010306 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010307 Py_INCREF(state->TypeIgnore_type);
Victor Stinnerd2bea262020-08-10 15:55:54 +020010308 return 0;
10309}
Victor Stinnerf8599272020-07-03 16:57:19 +020010310
Victor Stinnerd2bea262020-08-10 15:55:54 +020010311static PyModuleDef_Slot astmodule_slots[] = {
10312 {Py_mod_exec, astmodule_exec},
10313 {0, NULL}
10314};
10315
10316static struct PyModuleDef _astmodule = {
10317 PyModuleDef_HEAD_INIT,
10318 .m_name = "_ast",
10319 .m_size = sizeof(astmodulestate),
10320 .m_slots = astmodule_slots,
10321 .m_traverse = astmodule_traverse,
10322 .m_clear = astmodule_clear,
10323 .m_free = astmodule_free,
10324};
10325
10326PyMODINIT_FUNC
10327PyInit__ast(void)
10328{
10329 return PyModuleDef_Init(&_astmodule);
Martin v. Löwis577b5b92006-02-27 15:23:19 +000010330}
10331
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010332
Martin v. Löwisbd260da2006-02-26 19:42:26 +000010333PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010334{
Victor Stinnerd2bea262020-08-10 15:55:54 +020010335 astmodulestate *state = get_global_ast_state();
10336 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010337 return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +020010338 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010339 return ast2obj_mod(state, t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010340}
Martin v. Löwis5b222132007-06-10 09:51:05 +000010341
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010342/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
10343mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010344{
Serhiy Storchaka43c97312019-09-10 13:02:30 +030010345 const char * const req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010346 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010347
Steve Dowerb82e17e2019-05-23 08:45:22 -070010348 if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
10349 return NULL;
10350 }
10351
Victor Stinnerf8599272020-07-03 16:57:19 +020010352 astmodulestate *state = get_global_ast_state();
10353 PyObject *req_type[3];
10354 req_type[0] = state->Module_type;
10355 req_type[1] = state->Expression_type;
10356 req_type[2] = state->Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010357
Guido van Rossum3a32e3b2019-02-01 11:37:34 -080010358 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010359
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010360 isinstance = PyObject_IsInstance(ast, req_type[mode]);
10361 if (isinstance == -1)
10362 return NULL;
10363 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010364 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
Dino Viehlandac46eb42019-09-11 10:16:34 -070010365 req_name[mode], _PyType_Name(Py_TYPE(ast)));
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010366 return NULL;
10367 }
Dong-hee Naa05fcd32019-10-10 16:41:26 +090010368
10369 mod_ty res = NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +020010370 if (obj2ast_mod(state, ast, &res, arena) != 0)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010371 return NULL;
10372 else
10373 return res;
10374}
10375
10376int PyAST_Check(PyObject* obj)
10377{
Victor Stinnerd2bea262020-08-10 15:55:54 +020010378 astmodulestate *state = get_global_ast_state();
10379 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010380 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010381 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010382 return PyObject_IsInstance(obj, state->AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010383}
10384
Martin v. Löwis5b222132007-06-10 09:51:05 +000010385