blob: 844033ee37e28677e1517ea72d5337f433e7ae65 [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 Stinnerf8599272020-07-03 16:57:19 +0200227static astmodulestate global_ast_state;
228
229static astmodulestate *
230get_ast_state(PyObject *Py_UNUSED(module))
231{
232 return &global_ast_state;
233}
Dino Viehlandac46eb42019-09-11 10:16:34 -0700234
235static int astmodule_clear(PyObject *module)
236{
Victor Stinnerf8599272020-07-03 16:57:19 +0200237 astmodulestate *state = get_ast_state(module);
238 Py_CLEAR(state->AST_type);
239 Py_CLEAR(state->Add_singleton);
240 Py_CLEAR(state->Add_type);
241 Py_CLEAR(state->And_singleton);
242 Py_CLEAR(state->And_type);
243 Py_CLEAR(state->AnnAssign_type);
244 Py_CLEAR(state->Assert_type);
245 Py_CLEAR(state->Assign_type);
246 Py_CLEAR(state->AsyncFor_type);
247 Py_CLEAR(state->AsyncFunctionDef_type);
248 Py_CLEAR(state->AsyncWith_type);
249 Py_CLEAR(state->Attribute_type);
250 Py_CLEAR(state->AugAssign_type);
251 Py_CLEAR(state->Await_type);
252 Py_CLEAR(state->BinOp_type);
253 Py_CLEAR(state->BitAnd_singleton);
254 Py_CLEAR(state->BitAnd_type);
255 Py_CLEAR(state->BitOr_singleton);
256 Py_CLEAR(state->BitOr_type);
257 Py_CLEAR(state->BitXor_singleton);
258 Py_CLEAR(state->BitXor_type);
259 Py_CLEAR(state->BoolOp_type);
260 Py_CLEAR(state->Break_type);
261 Py_CLEAR(state->Call_type);
262 Py_CLEAR(state->ClassDef_type);
263 Py_CLEAR(state->Compare_type);
264 Py_CLEAR(state->Constant_type);
265 Py_CLEAR(state->Continue_type);
266 Py_CLEAR(state->Del_singleton);
267 Py_CLEAR(state->Del_type);
268 Py_CLEAR(state->Delete_type);
269 Py_CLEAR(state->DictComp_type);
270 Py_CLEAR(state->Dict_type);
271 Py_CLEAR(state->Div_singleton);
272 Py_CLEAR(state->Div_type);
273 Py_CLEAR(state->Eq_singleton);
274 Py_CLEAR(state->Eq_type);
275 Py_CLEAR(state->ExceptHandler_type);
276 Py_CLEAR(state->Expr_type);
277 Py_CLEAR(state->Expression_type);
278 Py_CLEAR(state->FloorDiv_singleton);
279 Py_CLEAR(state->FloorDiv_type);
280 Py_CLEAR(state->For_type);
281 Py_CLEAR(state->FormattedValue_type);
282 Py_CLEAR(state->FunctionDef_type);
283 Py_CLEAR(state->FunctionType_type);
284 Py_CLEAR(state->GeneratorExp_type);
285 Py_CLEAR(state->Global_type);
286 Py_CLEAR(state->GtE_singleton);
287 Py_CLEAR(state->GtE_type);
288 Py_CLEAR(state->Gt_singleton);
289 Py_CLEAR(state->Gt_type);
290 Py_CLEAR(state->IfExp_type);
291 Py_CLEAR(state->If_type);
292 Py_CLEAR(state->ImportFrom_type);
293 Py_CLEAR(state->Import_type);
294 Py_CLEAR(state->In_singleton);
295 Py_CLEAR(state->In_type);
296 Py_CLEAR(state->Interactive_type);
297 Py_CLEAR(state->Invert_singleton);
298 Py_CLEAR(state->Invert_type);
299 Py_CLEAR(state->IsNot_singleton);
300 Py_CLEAR(state->IsNot_type);
301 Py_CLEAR(state->Is_singleton);
302 Py_CLEAR(state->Is_type);
303 Py_CLEAR(state->JoinedStr_type);
304 Py_CLEAR(state->LShift_singleton);
305 Py_CLEAR(state->LShift_type);
306 Py_CLEAR(state->Lambda_type);
307 Py_CLEAR(state->ListComp_type);
308 Py_CLEAR(state->List_type);
309 Py_CLEAR(state->Load_singleton);
310 Py_CLEAR(state->Load_type);
311 Py_CLEAR(state->LtE_singleton);
312 Py_CLEAR(state->LtE_type);
313 Py_CLEAR(state->Lt_singleton);
314 Py_CLEAR(state->Lt_type);
315 Py_CLEAR(state->MatMult_singleton);
316 Py_CLEAR(state->MatMult_type);
317 Py_CLEAR(state->Mod_singleton);
318 Py_CLEAR(state->Mod_type);
319 Py_CLEAR(state->Module_type);
320 Py_CLEAR(state->Mult_singleton);
321 Py_CLEAR(state->Mult_type);
322 Py_CLEAR(state->Name_type);
323 Py_CLEAR(state->NamedExpr_type);
324 Py_CLEAR(state->Nonlocal_type);
325 Py_CLEAR(state->NotEq_singleton);
326 Py_CLEAR(state->NotEq_type);
327 Py_CLEAR(state->NotIn_singleton);
328 Py_CLEAR(state->NotIn_type);
329 Py_CLEAR(state->Not_singleton);
330 Py_CLEAR(state->Not_type);
331 Py_CLEAR(state->Or_singleton);
332 Py_CLEAR(state->Or_type);
333 Py_CLEAR(state->Pass_type);
334 Py_CLEAR(state->Pow_singleton);
335 Py_CLEAR(state->Pow_type);
336 Py_CLEAR(state->RShift_singleton);
337 Py_CLEAR(state->RShift_type);
338 Py_CLEAR(state->Raise_type);
339 Py_CLEAR(state->Return_type);
340 Py_CLEAR(state->SetComp_type);
341 Py_CLEAR(state->Set_type);
342 Py_CLEAR(state->Slice_type);
343 Py_CLEAR(state->Starred_type);
344 Py_CLEAR(state->Store_singleton);
345 Py_CLEAR(state->Store_type);
346 Py_CLEAR(state->Sub_singleton);
347 Py_CLEAR(state->Sub_type);
348 Py_CLEAR(state->Subscript_type);
349 Py_CLEAR(state->Try_type);
350 Py_CLEAR(state->Tuple_type);
351 Py_CLEAR(state->TypeIgnore_type);
352 Py_CLEAR(state->UAdd_singleton);
353 Py_CLEAR(state->UAdd_type);
354 Py_CLEAR(state->USub_singleton);
355 Py_CLEAR(state->USub_type);
356 Py_CLEAR(state->UnaryOp_type);
357 Py_CLEAR(state->While_type);
358 Py_CLEAR(state->With_type);
359 Py_CLEAR(state->YieldFrom_type);
360 Py_CLEAR(state->Yield_type);
361 Py_CLEAR(state->__dict__);
362 Py_CLEAR(state->__doc__);
363 Py_CLEAR(state->__module__);
364 Py_CLEAR(state->_attributes);
365 Py_CLEAR(state->_fields);
366 Py_CLEAR(state->alias_type);
367 Py_CLEAR(state->annotation);
368 Py_CLEAR(state->arg);
369 Py_CLEAR(state->arg_type);
370 Py_CLEAR(state->args);
371 Py_CLEAR(state->argtypes);
372 Py_CLEAR(state->arguments_type);
373 Py_CLEAR(state->asname);
374 Py_CLEAR(state->ast);
375 Py_CLEAR(state->attr);
376 Py_CLEAR(state->bases);
377 Py_CLEAR(state->body);
378 Py_CLEAR(state->boolop_type);
379 Py_CLEAR(state->cause);
380 Py_CLEAR(state->cmpop_type);
381 Py_CLEAR(state->col_offset);
382 Py_CLEAR(state->comparators);
383 Py_CLEAR(state->comprehension_type);
384 Py_CLEAR(state->context_expr);
385 Py_CLEAR(state->conversion);
386 Py_CLEAR(state->ctx);
387 Py_CLEAR(state->decorator_list);
388 Py_CLEAR(state->defaults);
389 Py_CLEAR(state->elt);
390 Py_CLEAR(state->elts);
391 Py_CLEAR(state->end_col_offset);
392 Py_CLEAR(state->end_lineno);
393 Py_CLEAR(state->exc);
394 Py_CLEAR(state->excepthandler_type);
395 Py_CLEAR(state->expr_context_type);
396 Py_CLEAR(state->expr_type);
397 Py_CLEAR(state->finalbody);
398 Py_CLEAR(state->format_spec);
399 Py_CLEAR(state->func);
400 Py_CLEAR(state->generators);
401 Py_CLEAR(state->handlers);
402 Py_CLEAR(state->id);
403 Py_CLEAR(state->ifs);
404 Py_CLEAR(state->is_async);
405 Py_CLEAR(state->items);
406 Py_CLEAR(state->iter);
407 Py_CLEAR(state->key);
408 Py_CLEAR(state->keys);
409 Py_CLEAR(state->keyword_type);
410 Py_CLEAR(state->keywords);
411 Py_CLEAR(state->kind);
412 Py_CLEAR(state->kw_defaults);
413 Py_CLEAR(state->kwarg);
414 Py_CLEAR(state->kwonlyargs);
415 Py_CLEAR(state->left);
416 Py_CLEAR(state->level);
417 Py_CLEAR(state->lineno);
418 Py_CLEAR(state->lower);
419 Py_CLEAR(state->mod_type);
420 Py_CLEAR(state->module);
421 Py_CLEAR(state->msg);
422 Py_CLEAR(state->name);
423 Py_CLEAR(state->names);
424 Py_CLEAR(state->op);
425 Py_CLEAR(state->operand);
426 Py_CLEAR(state->operator_type);
427 Py_CLEAR(state->ops);
428 Py_CLEAR(state->optional_vars);
429 Py_CLEAR(state->orelse);
430 Py_CLEAR(state->posonlyargs);
431 Py_CLEAR(state->returns);
432 Py_CLEAR(state->right);
433 Py_CLEAR(state->simple);
434 Py_CLEAR(state->slice);
435 Py_CLEAR(state->step);
436 Py_CLEAR(state->stmt_type);
437 Py_CLEAR(state->tag);
438 Py_CLEAR(state->target);
439 Py_CLEAR(state->targets);
440 Py_CLEAR(state->test);
441 Py_CLEAR(state->type);
442 Py_CLEAR(state->type_comment);
443 Py_CLEAR(state->type_ignore_type);
444 Py_CLEAR(state->type_ignores);
445 Py_CLEAR(state->unaryop_type);
446 Py_CLEAR(state->upper);
447 Py_CLEAR(state->value);
448 Py_CLEAR(state->values);
449 Py_CLEAR(state->vararg);
450 Py_CLEAR(state->withitem_type);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700451
452 return 0;
453}
454
455static int astmodule_traverse(PyObject *module, visitproc visit, void* arg)
456{
Victor Stinnerf8599272020-07-03 16:57:19 +0200457 astmodulestate *state = get_ast_state(module);
458 Py_VISIT(state->AST_type);
459 Py_VISIT(state->Add_singleton);
460 Py_VISIT(state->Add_type);
461 Py_VISIT(state->And_singleton);
462 Py_VISIT(state->And_type);
463 Py_VISIT(state->AnnAssign_type);
464 Py_VISIT(state->Assert_type);
465 Py_VISIT(state->Assign_type);
466 Py_VISIT(state->AsyncFor_type);
467 Py_VISIT(state->AsyncFunctionDef_type);
468 Py_VISIT(state->AsyncWith_type);
469 Py_VISIT(state->Attribute_type);
470 Py_VISIT(state->AugAssign_type);
471 Py_VISIT(state->Await_type);
472 Py_VISIT(state->BinOp_type);
473 Py_VISIT(state->BitAnd_singleton);
474 Py_VISIT(state->BitAnd_type);
475 Py_VISIT(state->BitOr_singleton);
476 Py_VISIT(state->BitOr_type);
477 Py_VISIT(state->BitXor_singleton);
478 Py_VISIT(state->BitXor_type);
479 Py_VISIT(state->BoolOp_type);
480 Py_VISIT(state->Break_type);
481 Py_VISIT(state->Call_type);
482 Py_VISIT(state->ClassDef_type);
483 Py_VISIT(state->Compare_type);
484 Py_VISIT(state->Constant_type);
485 Py_VISIT(state->Continue_type);
486 Py_VISIT(state->Del_singleton);
487 Py_VISIT(state->Del_type);
488 Py_VISIT(state->Delete_type);
489 Py_VISIT(state->DictComp_type);
490 Py_VISIT(state->Dict_type);
491 Py_VISIT(state->Div_singleton);
492 Py_VISIT(state->Div_type);
493 Py_VISIT(state->Eq_singleton);
494 Py_VISIT(state->Eq_type);
495 Py_VISIT(state->ExceptHandler_type);
496 Py_VISIT(state->Expr_type);
497 Py_VISIT(state->Expression_type);
498 Py_VISIT(state->FloorDiv_singleton);
499 Py_VISIT(state->FloorDiv_type);
500 Py_VISIT(state->For_type);
501 Py_VISIT(state->FormattedValue_type);
502 Py_VISIT(state->FunctionDef_type);
503 Py_VISIT(state->FunctionType_type);
504 Py_VISIT(state->GeneratorExp_type);
505 Py_VISIT(state->Global_type);
506 Py_VISIT(state->GtE_singleton);
507 Py_VISIT(state->GtE_type);
508 Py_VISIT(state->Gt_singleton);
509 Py_VISIT(state->Gt_type);
510 Py_VISIT(state->IfExp_type);
511 Py_VISIT(state->If_type);
512 Py_VISIT(state->ImportFrom_type);
513 Py_VISIT(state->Import_type);
514 Py_VISIT(state->In_singleton);
515 Py_VISIT(state->In_type);
516 Py_VISIT(state->Interactive_type);
517 Py_VISIT(state->Invert_singleton);
518 Py_VISIT(state->Invert_type);
519 Py_VISIT(state->IsNot_singleton);
520 Py_VISIT(state->IsNot_type);
521 Py_VISIT(state->Is_singleton);
522 Py_VISIT(state->Is_type);
523 Py_VISIT(state->JoinedStr_type);
524 Py_VISIT(state->LShift_singleton);
525 Py_VISIT(state->LShift_type);
526 Py_VISIT(state->Lambda_type);
527 Py_VISIT(state->ListComp_type);
528 Py_VISIT(state->List_type);
529 Py_VISIT(state->Load_singleton);
530 Py_VISIT(state->Load_type);
531 Py_VISIT(state->LtE_singleton);
532 Py_VISIT(state->LtE_type);
533 Py_VISIT(state->Lt_singleton);
534 Py_VISIT(state->Lt_type);
535 Py_VISIT(state->MatMult_singleton);
536 Py_VISIT(state->MatMult_type);
537 Py_VISIT(state->Mod_singleton);
538 Py_VISIT(state->Mod_type);
539 Py_VISIT(state->Module_type);
540 Py_VISIT(state->Mult_singleton);
541 Py_VISIT(state->Mult_type);
542 Py_VISIT(state->Name_type);
543 Py_VISIT(state->NamedExpr_type);
544 Py_VISIT(state->Nonlocal_type);
545 Py_VISIT(state->NotEq_singleton);
546 Py_VISIT(state->NotEq_type);
547 Py_VISIT(state->NotIn_singleton);
548 Py_VISIT(state->NotIn_type);
549 Py_VISIT(state->Not_singleton);
550 Py_VISIT(state->Not_type);
551 Py_VISIT(state->Or_singleton);
552 Py_VISIT(state->Or_type);
553 Py_VISIT(state->Pass_type);
554 Py_VISIT(state->Pow_singleton);
555 Py_VISIT(state->Pow_type);
556 Py_VISIT(state->RShift_singleton);
557 Py_VISIT(state->RShift_type);
558 Py_VISIT(state->Raise_type);
559 Py_VISIT(state->Return_type);
560 Py_VISIT(state->SetComp_type);
561 Py_VISIT(state->Set_type);
562 Py_VISIT(state->Slice_type);
563 Py_VISIT(state->Starred_type);
564 Py_VISIT(state->Store_singleton);
565 Py_VISIT(state->Store_type);
566 Py_VISIT(state->Sub_singleton);
567 Py_VISIT(state->Sub_type);
568 Py_VISIT(state->Subscript_type);
569 Py_VISIT(state->Try_type);
570 Py_VISIT(state->Tuple_type);
571 Py_VISIT(state->TypeIgnore_type);
572 Py_VISIT(state->UAdd_singleton);
573 Py_VISIT(state->UAdd_type);
574 Py_VISIT(state->USub_singleton);
575 Py_VISIT(state->USub_type);
576 Py_VISIT(state->UnaryOp_type);
577 Py_VISIT(state->While_type);
578 Py_VISIT(state->With_type);
579 Py_VISIT(state->YieldFrom_type);
580 Py_VISIT(state->Yield_type);
581 Py_VISIT(state->__dict__);
582 Py_VISIT(state->__doc__);
583 Py_VISIT(state->__module__);
584 Py_VISIT(state->_attributes);
585 Py_VISIT(state->_fields);
586 Py_VISIT(state->alias_type);
587 Py_VISIT(state->annotation);
588 Py_VISIT(state->arg);
589 Py_VISIT(state->arg_type);
590 Py_VISIT(state->args);
591 Py_VISIT(state->argtypes);
592 Py_VISIT(state->arguments_type);
593 Py_VISIT(state->asname);
594 Py_VISIT(state->ast);
595 Py_VISIT(state->attr);
596 Py_VISIT(state->bases);
597 Py_VISIT(state->body);
598 Py_VISIT(state->boolop_type);
599 Py_VISIT(state->cause);
600 Py_VISIT(state->cmpop_type);
601 Py_VISIT(state->col_offset);
602 Py_VISIT(state->comparators);
603 Py_VISIT(state->comprehension_type);
604 Py_VISIT(state->context_expr);
605 Py_VISIT(state->conversion);
606 Py_VISIT(state->ctx);
607 Py_VISIT(state->decorator_list);
608 Py_VISIT(state->defaults);
609 Py_VISIT(state->elt);
610 Py_VISIT(state->elts);
611 Py_VISIT(state->end_col_offset);
612 Py_VISIT(state->end_lineno);
613 Py_VISIT(state->exc);
614 Py_VISIT(state->excepthandler_type);
615 Py_VISIT(state->expr_context_type);
616 Py_VISIT(state->expr_type);
617 Py_VISIT(state->finalbody);
618 Py_VISIT(state->format_spec);
619 Py_VISIT(state->func);
620 Py_VISIT(state->generators);
621 Py_VISIT(state->handlers);
622 Py_VISIT(state->id);
623 Py_VISIT(state->ifs);
624 Py_VISIT(state->is_async);
625 Py_VISIT(state->items);
626 Py_VISIT(state->iter);
627 Py_VISIT(state->key);
628 Py_VISIT(state->keys);
629 Py_VISIT(state->keyword_type);
630 Py_VISIT(state->keywords);
631 Py_VISIT(state->kind);
632 Py_VISIT(state->kw_defaults);
633 Py_VISIT(state->kwarg);
634 Py_VISIT(state->kwonlyargs);
635 Py_VISIT(state->left);
636 Py_VISIT(state->level);
637 Py_VISIT(state->lineno);
638 Py_VISIT(state->lower);
639 Py_VISIT(state->mod_type);
640 Py_VISIT(state->module);
641 Py_VISIT(state->msg);
642 Py_VISIT(state->name);
643 Py_VISIT(state->names);
644 Py_VISIT(state->op);
645 Py_VISIT(state->operand);
646 Py_VISIT(state->operator_type);
647 Py_VISIT(state->ops);
648 Py_VISIT(state->optional_vars);
649 Py_VISIT(state->orelse);
650 Py_VISIT(state->posonlyargs);
651 Py_VISIT(state->returns);
652 Py_VISIT(state->right);
653 Py_VISIT(state->simple);
654 Py_VISIT(state->slice);
655 Py_VISIT(state->step);
656 Py_VISIT(state->stmt_type);
657 Py_VISIT(state->tag);
658 Py_VISIT(state->target);
659 Py_VISIT(state->targets);
660 Py_VISIT(state->test);
661 Py_VISIT(state->type);
662 Py_VISIT(state->type_comment);
663 Py_VISIT(state->type_ignore_type);
664 Py_VISIT(state->type_ignores);
665 Py_VISIT(state->unaryop_type);
666 Py_VISIT(state->upper);
667 Py_VISIT(state->value);
668 Py_VISIT(state->values);
669 Py_VISIT(state->vararg);
670 Py_VISIT(state->withitem_type);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700671
672 return 0;
673}
674
675static void astmodule_free(void* module) {
676 astmodule_clear((PyObject*)module);
677}
678
679static struct PyModuleDef _astmodule = {
680 PyModuleDef_HEAD_INIT,
Victor Stinnerf8599272020-07-03 16:57:19 +0200681 .m_name = "_ast",
682 .m_size = -1,
683 .m_traverse = astmodule_traverse,
684 .m_clear = astmodule_clear,
685 .m_free = astmodule_free,
Dino Viehlandac46eb42019-09-11 10:16:34 -0700686};
687
Victor Stinnerf8599272020-07-03 16:57:19 +0200688#define get_global_ast_state() (&global_ast_state)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700689
Victor Stinnerf8599272020-07-03 16:57:19 +0200690static int init_identifiers(astmodulestate *state)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700691{
Dino Viehlandac46eb42019-09-11 10:16:34 -0700692 if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300693 if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700694 if ((state->__module__ = PyUnicode_InternFromString("__module__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700695 if ((state->_attributes = PyUnicode_InternFromString("_attributes")) == NULL) return 0;
696 if ((state->_fields = PyUnicode_InternFromString("_fields")) == NULL) return 0;
697 if ((state->annotation = PyUnicode_InternFromString("annotation")) == NULL) return 0;
698 if ((state->arg = PyUnicode_InternFromString("arg")) == NULL) return 0;
699 if ((state->args = PyUnicode_InternFromString("args")) == NULL) return 0;
700 if ((state->argtypes = PyUnicode_InternFromString("argtypes")) == NULL) return 0;
701 if ((state->asname = PyUnicode_InternFromString("asname")) == NULL) return 0;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200702 if ((state->ast = PyUnicode_InternFromString("ast")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700703 if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0;
704 if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0;
705 if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0;
706 if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0;
707 if ((state->col_offset = PyUnicode_InternFromString("col_offset")) == NULL) return 0;
708 if ((state->comparators = PyUnicode_InternFromString("comparators")) == NULL) return 0;
709 if ((state->context_expr = PyUnicode_InternFromString("context_expr")) == NULL) return 0;
710 if ((state->conversion = PyUnicode_InternFromString("conversion")) == NULL) return 0;
711 if ((state->ctx = PyUnicode_InternFromString("ctx")) == NULL) return 0;
712 if ((state->decorator_list = PyUnicode_InternFromString("decorator_list")) == NULL) return 0;
713 if ((state->defaults = PyUnicode_InternFromString("defaults")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700714 if ((state->elt = PyUnicode_InternFromString("elt")) == NULL) return 0;
715 if ((state->elts = PyUnicode_InternFromString("elts")) == NULL) return 0;
716 if ((state->end_col_offset = PyUnicode_InternFromString("end_col_offset")) == NULL) return 0;
717 if ((state->end_lineno = PyUnicode_InternFromString("end_lineno")) == NULL) return 0;
718 if ((state->exc = PyUnicode_InternFromString("exc")) == NULL) return 0;
719 if ((state->finalbody = PyUnicode_InternFromString("finalbody")) == NULL) return 0;
720 if ((state->format_spec = PyUnicode_InternFromString("format_spec")) == NULL) return 0;
721 if ((state->func = PyUnicode_InternFromString("func")) == NULL) return 0;
722 if ((state->generators = PyUnicode_InternFromString("generators")) == NULL) return 0;
723 if ((state->handlers = PyUnicode_InternFromString("handlers")) == NULL) return 0;
724 if ((state->id = PyUnicode_InternFromString("id")) == NULL) return 0;
725 if ((state->ifs = PyUnicode_InternFromString("ifs")) == NULL) return 0;
726 if ((state->is_async = PyUnicode_InternFromString("is_async")) == NULL) return 0;
727 if ((state->items = PyUnicode_InternFromString("items")) == NULL) return 0;
728 if ((state->iter = PyUnicode_InternFromString("iter")) == NULL) return 0;
729 if ((state->key = PyUnicode_InternFromString("key")) == NULL) return 0;
730 if ((state->keys = PyUnicode_InternFromString("keys")) == NULL) return 0;
731 if ((state->keywords = PyUnicode_InternFromString("keywords")) == NULL) return 0;
732 if ((state->kind = PyUnicode_InternFromString("kind")) == NULL) return 0;
733 if ((state->kw_defaults = PyUnicode_InternFromString("kw_defaults")) == NULL) return 0;
734 if ((state->kwarg = PyUnicode_InternFromString("kwarg")) == NULL) return 0;
735 if ((state->kwonlyargs = PyUnicode_InternFromString("kwonlyargs")) == NULL) return 0;
736 if ((state->left = PyUnicode_InternFromString("left")) == NULL) return 0;
737 if ((state->level = PyUnicode_InternFromString("level")) == NULL) return 0;
738 if ((state->lineno = PyUnicode_InternFromString("lineno")) == NULL) return 0;
739 if ((state->lower = PyUnicode_InternFromString("lower")) == NULL) return 0;
740 if ((state->module = PyUnicode_InternFromString("module")) == NULL) return 0;
741 if ((state->msg = PyUnicode_InternFromString("msg")) == NULL) return 0;
742 if ((state->name = PyUnicode_InternFromString("name")) == NULL) return 0;
743 if ((state->names = PyUnicode_InternFromString("names")) == NULL) return 0;
744 if ((state->op = PyUnicode_InternFromString("op")) == NULL) return 0;
745 if ((state->operand = PyUnicode_InternFromString("operand")) == NULL) return 0;
746 if ((state->ops = PyUnicode_InternFromString("ops")) == NULL) return 0;
747 if ((state->optional_vars = PyUnicode_InternFromString("optional_vars")) == NULL) return 0;
748 if ((state->orelse = PyUnicode_InternFromString("orelse")) == NULL) return 0;
749 if ((state->posonlyargs = PyUnicode_InternFromString("posonlyargs")) == NULL) return 0;
750 if ((state->returns = PyUnicode_InternFromString("returns")) == NULL) return 0;
751 if ((state->right = PyUnicode_InternFromString("right")) == NULL) return 0;
752 if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return 0;
753 if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return 0;
754 if ((state->step = PyUnicode_InternFromString("step")) == NULL) return 0;
755 if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return 0;
756 if ((state->target = PyUnicode_InternFromString("target")) == NULL) return 0;
757 if ((state->targets = PyUnicode_InternFromString("targets")) == NULL) return 0;
758 if ((state->test = PyUnicode_InternFromString("test")) == NULL) return 0;
759 if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0;
760 if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0;
761 if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0;
762 if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0;
763 if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0;
764 if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0;
765 if ((state->vararg = PyUnicode_InternFromString("vararg")) == NULL) return 0;
766 return 1;
767};
768
Victor Stinnerf8599272020-07-03 16:57:19 +0200769static PyObject* ast2obj_mod(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300770static const char * const Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200771 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800772 "type_ignores",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000773};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300774static const char * const Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200775 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000776};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300777static const char * const Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200778 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000779};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300780static const char * const FunctionType_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800781 "argtypes",
782 "returns",
783};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300784static const char * const stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200785 "lineno",
786 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000787 "end_lineno",
788 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000789};
Victor Stinnerf8599272020-07-03 16:57:19 +0200790static PyObject* ast2obj_stmt(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300791static const char * const FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200792 "name",
793 "args",
794 "body",
795 "decorator_list",
796 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800797 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000798};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300799static const char * const AsyncFunctionDef_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400800 "name",
801 "args",
802 "body",
803 "decorator_list",
804 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800805 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400806};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300807static const char * const ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200808 "name",
809 "bases",
810 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200811 "body",
812 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000813};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300814static const char * const Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200815 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000816};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300817static const char * const Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200818 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000819};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300820static const char * const Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200821 "targets",
822 "value",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800823 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000824};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300825static const char * const AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200826 "target",
827 "op",
828 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000829};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300830static const char * const AnnAssign_fields[]={
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700831 "target",
832 "annotation",
833 "value",
834 "simple",
835};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300836static const char * const For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200837 "target",
838 "iter",
839 "body",
840 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800841 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000842};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300843static const char * const AsyncFor_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400844 "target",
845 "iter",
846 "body",
847 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800848 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400849};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300850static const char * const While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200851 "test",
852 "body",
853 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000854};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300855static const char * const If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200856 "test",
857 "body",
858 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000859};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300860static const char * const With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200861 "items",
862 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800863 "type_comment",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000864};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300865static const char * const AsyncWith_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400866 "items",
867 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800868 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400869};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300870static const char * const Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200871 "exc",
872 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000873};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300874static const char * const Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200875 "body",
876 "handlers",
877 "orelse",
878 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000879};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300880static const char * const Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200881 "test",
882 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000883};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300884static const char * const Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200885 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000886};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300887static const char * const ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200888 "module",
889 "names",
890 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000891};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300892static const char * const Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200893 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000894};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300895static const char * const Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200896 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000897};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300898static const char * const Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200899 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000900};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300901static const char * const expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200902 "lineno",
903 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000904 "end_lineno",
905 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000906};
Victor Stinnerf8599272020-07-03 16:57:19 +0200907static PyObject* ast2obj_expr(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300908static const char * const BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200909 "op",
910 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000911};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300912static const char * const NamedExpr_fields[]={
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700913 "target",
914 "value",
915};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300916static const char * const BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200917 "left",
918 "op",
919 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000920};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300921static const char * const UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200922 "op",
923 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000924};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300925static const char * const Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200926 "args",
927 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000928};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300929static const char * const IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200930 "test",
931 "body",
932 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000933};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300934static const char * const Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200935 "keys",
936 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000937};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300938static const char * const Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200939 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000940};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300941static const char * const ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200942 "elt",
943 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000944};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300945static const char * const SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200946 "elt",
947 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000948};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300949static const char * const DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200950 "key",
951 "value",
952 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000953};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300954static const char * const GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200955 "elt",
956 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000957};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300958static const char * const Await_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400959 "value",
960};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300961static const char * const Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200962 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500963};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300964static const char * const YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200965 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000966};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300967static const char * const Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200968 "left",
969 "ops",
970 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000971};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300972static const char * const Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200973 "func",
974 "args",
975 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000976};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300977static const char * const FormattedValue_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400978 "value",
979 "conversion",
980 "format_spec",
981};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300982static const char * const JoinedStr_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400983 "values",
984};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300985static const char * const Constant_fields[]={
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100986 "value",
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700987 "kind",
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100988};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300989static const char * const Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200990 "value",
991 "attr",
992 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000993};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300994static const char * const Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200995 "value",
996 "slice",
997 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000998};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300999static const char * const Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001000 "value",
1001 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +00001002};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001003static const char * const Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001004 "id",
1005 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001006};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001007static const char * const List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001008 "elts",
1009 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001010};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001011static const char * const Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001012 "elts",
1013 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001014};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001015static const char * const Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001016 "lower",
1017 "upper",
1018 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001019};
Victor Stinnerf8599272020-07-03 16:57:19 +02001020static PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty);
1021static PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty);
1022static PyObject* ast2obj_operator(astmodulestate *state, operator_ty);
1023static PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty);
1024static PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty);
1025static PyObject* ast2obj_comprehension(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001026static const char * const comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001027 "target",
1028 "iter",
1029 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001030 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001031};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001032static const char * const excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001033 "lineno",
1034 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001035 "end_lineno",
1036 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +00001037};
Victor Stinnerf8599272020-07-03 16:57:19 +02001038static PyObject* ast2obj_excepthandler(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001039static const char * const ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001040 "type",
1041 "name",
1042 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001043};
Victor Stinnerf8599272020-07-03 16:57:19 +02001044static PyObject* ast2obj_arguments(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001045static const char * const arguments_fields[]={
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001046 "posonlyargs",
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001047 "args",
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001048 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001049 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001050 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +02001051 "kwarg",
1052 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001053};
Victor Stinnerf8599272020-07-03 16:57:19 +02001054static PyObject* ast2obj_arg(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001055static const char * const arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +02001056 "lineno",
1057 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001058 "end_lineno",
1059 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001060};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001061static const char * const arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001062 "arg",
1063 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001064 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +00001065};
Victor Stinnerf8599272020-07-03 16:57:19 +02001066static PyObject* ast2obj_keyword(astmodulestate *state, void*);
Pablo Galindo168660b2020-04-02 00:47:39 +01001067static const char * const keyword_attributes[] = {
1068 "lineno",
1069 "col_offset",
1070 "end_lineno",
1071 "end_col_offset",
1072};
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001073static const char * const keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001074 "arg",
1075 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001076};
Victor Stinnerf8599272020-07-03 16:57:19 +02001077static PyObject* ast2obj_alias(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001078static const char * const alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001079 "name",
1080 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001081};
Victor Stinnerf8599272020-07-03 16:57:19 +02001082static PyObject* ast2obj_withitem(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001083static const char * const withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001084 "context_expr",
1085 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001086};
Victor Stinnerf8599272020-07-03 16:57:19 +02001087static PyObject* ast2obj_type_ignore(astmodulestate *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001088static const char * const TypeIgnore_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001089 "lineno",
Michael J. Sullivan933e1502019-05-22 07:54:20 -07001090 "tag",
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001091};
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001092
1093
INADA Naokifc489082017-01-25 22:33:43 +09001094
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001095typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +01001096 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001097 PyObject *dict;
1098} AST_object;
1099
Benjamin Peterson1767e022012-03-14 21:50:29 -05001100static void
1101ast_dealloc(AST_object *self)
1102{
INADA Naokia6296d32017-08-24 14:55:17 +09001103 /* bpo-31095: UnTrack is needed before calling any callbacks */
Eddie Elizondo0247e802019-09-14 09:38:17 -04001104 PyTypeObject *tp = Py_TYPE(self);
INADA Naokia6296d32017-08-24 14:55:17 +09001105 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -05001106 Py_CLEAR(self->dict);
Eddie Elizondo0247e802019-09-14 09:38:17 -04001107 freefunc free_func = PyType_GetSlot(tp, Py_tp_free);
1108 assert(free_func != NULL);
1109 free_func(self);
1110 Py_DECREF(tp);
Benjamin Peterson1767e022012-03-14 21:50:29 -05001111}
1112
Neal Norwitz207c9f32008-03-31 04:42:11 +00001113static int
Benjamin Peterson81071762012-07-08 11:03:46 -07001114ast_traverse(AST_object *self, visitproc visit, void *arg)
1115{
Miss Islington (bot)bcbe5c52020-05-28 08:12:23 -07001116 Py_VISIT(Py_TYPE(self));
Benjamin Peterson81071762012-07-08 11:03:46 -07001117 Py_VISIT(self->dict);
1118 return 0;
1119}
1120
Serhiy Storchakaa5c42282018-05-31 07:34:34 +03001121static int
Benjamin Peterson81071762012-07-08 11:03:46 -07001122ast_clear(AST_object *self)
1123{
1124 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +03001125 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -07001126}
1127
1128static int
Neal Norwitz207c9f32008-03-31 04:42:11 +00001129ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
1130{
1131 Py_ssize_t i, numfields = 0;
1132 int res = -1;
1133 PyObject *key, *value, *fields;
Victor Stinnerf8599272020-07-03 16:57:19 +02001134 astmodulestate *state = get_global_ast_state();
1135 if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001136 goto cleanup;
1137 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001138 if (fields) {
1139 numfields = PySequence_Size(fields);
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001140 if (numfields == -1) {
Neal Norwitz207c9f32008-03-31 04:42:11 +00001141 goto cleanup;
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001142 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001143 }
INADA Naoki4c78c522017-02-24 02:48:17 +09001144
Neal Norwitz207c9f32008-03-31 04:42:11 +00001145 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +09001146 if (numfields < PyTuple_GET_SIZE(args)) {
1147 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
1148 "%zd positional argument%s",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001149 _PyType_Name(Py_TYPE(self)),
INADA Naoki4c78c522017-02-24 02:48:17 +09001150 numfields, numfields == 1 ? "" : "s");
1151 res = -1;
1152 goto cleanup;
1153 }
1154 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
1155 /* cannot be reached when fields is NULL */
1156 PyObject *name = PySequence_GetItem(fields, i);
1157 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +00001158 res = -1;
1159 goto cleanup;
1160 }
INADA Naoki4c78c522017-02-24 02:48:17 +09001161 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
1162 Py_DECREF(name);
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001163 if (res < 0) {
INADA Naoki4c78c522017-02-24 02:48:17 +09001164 goto cleanup;
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001165 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001166 }
1167 if (kw) {
1168 i = 0; /* needed by PyDict_Next */
1169 while (PyDict_Next(kw, &i, &key, &value)) {
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001170 int contains = PySequence_Contains(fields, key);
1171 if (contains == -1) {
1172 res = -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001173 goto cleanup;
Miss Islington (bot)1a4e9e62020-05-24 14:32:32 -07001174 } else if (contains == 1) {
1175 Py_ssize_t p = PySequence_Index(fields, key);
1176 if (p == -1) {
1177 res = -1;
1178 goto cleanup;
1179 }
1180 if (p < PyTuple_GET_SIZE(args)) {
1181 PyErr_Format(PyExc_TypeError,
1182 "%.400s got multiple values for argument '%U'",
1183 Py_TYPE(self)->tp_name, key);
1184 res = -1;
1185 goto cleanup;
1186 }
1187 }
1188 res = PyObject_SetAttr(self, key, value);
1189 if (res < 0) {
1190 goto cleanup;
1191 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001192 }
1193 }
1194 cleanup:
1195 Py_XDECREF(fields);
1196 return res;
1197}
1198
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001199/* Pickling support */
1200static PyObject *
1201ast_type_reduce(PyObject *self, PyObject *unused)
1202{
Victor Stinnerf8599272020-07-03 16:57:19 +02001203 astmodulestate *state = get_global_ast_state();
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001204 PyObject *dict;
Victor Stinnerf8599272020-07-03 16:57:19 +02001205 if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001206 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001207 }
1208 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001209 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001210 }
1211 return Py_BuildValue("O()", Py_TYPE(self));
1212}
1213
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001214static PyMemberDef ast_type_members[] = {
1215 {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY},
1216 {NULL} /* Sentinel */
1217};
1218
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001219static PyMethodDef ast_type_methods[] = {
1220 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
1221 {NULL}
1222};
1223
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001224static PyGetSetDef ast_type_getsets[] = {
1225 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
1226 {NULL}
1227};
1228
Dino Viehlandac46eb42019-09-11 10:16:34 -07001229static PyType_Slot AST_type_slots[] = {
1230 {Py_tp_dealloc, ast_dealloc},
1231 {Py_tp_getattro, PyObject_GenericGetAttr},
1232 {Py_tp_setattro, PyObject_GenericSetAttr},
1233 {Py_tp_traverse, ast_traverse},
1234 {Py_tp_clear, ast_clear},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001235 {Py_tp_members, ast_type_members},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001236 {Py_tp_methods, ast_type_methods},
1237 {Py_tp_getset, ast_type_getsets},
1238 {Py_tp_init, ast_type_init},
1239 {Py_tp_alloc, PyType_GenericAlloc},
1240 {Py_tp_new, PyType_GenericNew},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001241 {Py_tp_free, PyObject_GC_Del},
1242 {0, 0},
1243};
1244
1245static PyType_Spec AST_type_spec = {
Serhiy Storchakabace59d2020-03-22 20:33:34 +02001246 "ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001247 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +00001248 0,
Dino Viehlandac46eb42019-09-11 10:16:34 -07001249 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1250 AST_type_slots
Neal Norwitz207c9f32008-03-31 04:42:11 +00001251};
1252
Dino Viehlandac46eb42019-09-11 10:16:34 -07001253static PyObject *
Victor Stinnerf8599272020-07-03 16:57:19 +02001254make_type(astmodulestate *state, const char *type, PyObject* base,
1255 const char* const* fields, int num_fields, const char *doc)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001256{
1257 PyObject *fnames, *result;
1258 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001259 fnames = PyTuple_New(num_fields);
1260 if (!fnames) return NULL;
1261 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001262 PyObject *field = PyUnicode_InternFromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001263 if (!field) {
1264 Py_DECREF(fnames);
1265 return NULL;
1266 }
1267 PyTuple_SET_ITEM(fnames, i, field);
1268 }
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001269 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOs}",
INADA Naokifc489082017-01-25 22:33:43 +09001270 type, base,
Victor Stinnerf8599272020-07-03 16:57:19 +02001271 state->_fields, fnames,
1272 state->__module__,
1273 state->ast,
1274 state->__doc__, doc);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001275 Py_DECREF(fnames);
Dino Viehlandac46eb42019-09-11 10:16:34 -07001276 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001277}
1278
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001279static int
Victor Stinnerf8599272020-07-03 16:57:19 +02001280add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001281{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001282 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001283 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +00001284 if (!l)
1285 return 0;
1286 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001287 s = PyUnicode_InternFromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001288 if (!s) {
1289 Py_DECREF(l);
1290 return 0;
1291 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001292 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001293 }
Victor Stinnerf8599272020-07-03 16:57:19 +02001294 result = PyObject_SetAttr(type, state->_attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001295 Py_DECREF(l);
1296 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001297}
1298
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001299/* Conversion AST -> Python */
1300
Victor Stinnerf8599272020-07-03 16:57:19 +02001301static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*))
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001302{
Benjamin Peterson77fa9372012-05-15 10:10:27 -07001303 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001304 PyObject *result = PyList_New(n);
1305 PyObject *value;
1306 if (!result)
1307 return NULL;
1308 for (i = 0; i < n; i++) {
Victor Stinnerf8599272020-07-03 16:57:19 +02001309 value = func(state, asdl_seq_GET(seq, i));
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001310 if (!value) {
1311 Py_DECREF(result);
1312 return NULL;
1313 }
1314 PyList_SET_ITEM(result, i, value);
1315 }
1316 return result;
1317}
1318
Victor Stinnerf8599272020-07-03 16:57:19 +02001319static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001320{
1321 if (!o)
1322 o = Py_None;
1323 Py_INCREF((PyObject*)o);
1324 return (PyObject*)o;
1325}
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001326#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001327#define ast2obj_identifier ast2obj_object
1328#define ast2obj_string ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001329
Victor Stinnerf8599272020-07-03 16:57:19 +02001330static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001331{
Christian Heimes217cfd12007-12-02 14:31:20 +00001332 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001333}
1334
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001335/* Conversion Python -> AST */
1336
Victor Stinnerf8599272020-07-03 16:57:19 +02001337static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001338{
1339 if (obj == Py_None)
1340 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +02001341 if (obj) {
1342 if (PyArena_AddPyObject(arena, obj) < 0) {
1343 *out = NULL;
1344 return -1;
1345 }
1346 Py_INCREF(obj);
1347 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001348 *out = obj;
1349 return 0;
1350}
1351
Victor Stinnerf8599272020-07-03 16:57:19 +02001352static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001353{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001354 if (PyArena_AddPyObject(arena, obj) < 0) {
1355 *out = NULL;
1356 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001357 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001358 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001359 *out = obj;
1360 return 0;
1361}
1362
Victor Stinnerf8599272020-07-03 16:57:19 +02001363static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001364{
Benjamin Peterson180e6352011-07-22 11:09:07 -05001365 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
1366 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001367 return 1;
1368 }
Victor Stinnerf8599272020-07-03 16:57:19 +02001369 return obj2ast_object(state, obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001370}
1371
Victor Stinnerf8599272020-07-03 16:57:19 +02001372static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001373{
1374 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
1375 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
1376 return 1;
1377 }
Victor Stinnerf8599272020-07-03 16:57:19 +02001378 return obj2ast_object(state, obj, out, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001379}
1380
Victor Stinnerf8599272020-07-03 16:57:19 +02001381static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001382{
1383 int i;
1384 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +01001385 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001386 return 1;
1387 }
1388
Serhiy Storchaka56f6e762015-09-06 21:25:30 +03001389 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001390 if (i == -1 && PyErr_Occurred())
1391 return 1;
1392 *out = i;
1393 return 0;
1394}
1395
Victor Stinnerf8599272020-07-03 16:57:19 +02001396static int add_ast_fields(astmodulestate *state)
Benjamin Petersonce825f12008-10-24 23:11:02 +00001397{
Dino Viehlandac46eb42019-09-11 10:16:34 -07001398 PyObject *empty_tuple;
Benjamin Petersonce825f12008-10-24 23:11:02 +00001399 empty_tuple = PyTuple_New(0);
1400 if (!empty_tuple ||
Victor Stinnerf8599272020-07-03 16:57:19 +02001401 PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 ||
1402 PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +00001403 Py_XDECREF(empty_tuple);
1404 return -1;
1405 }
1406 Py_DECREF(empty_tuple);
1407 return 0;
1408}
1409
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001410
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001411static int init_types(void)
1412{
Victor Stinnerf8599272020-07-03 16:57:19 +02001413 astmodulestate *state = get_global_ast_state();
Dino Viehlandac46eb42019-09-11 10:16:34 -07001414 if (state->initialized) return 1;
Victor Stinnerf8599272020-07-03 16:57:19 +02001415 if (init_identifiers(state) < 0) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -07001416 state->AST_type = PyType_FromSpec(&AST_type_spec);
1417 if (!state->AST_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001418 if (add_ast_fields(state) < 0) return 0;
1419 state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001420 "mod = Module(stmt* body, type_ignore* type_ignores)\n"
1421 " | Interactive(stmt* body)\n"
1422 " | Expression(expr body)\n"
1423 " | FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001424 if (!state->mod_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001425 if (!add_attributes(state, state->mod_type, NULL, 0)) return 0;
1426 state->Module_type = make_type(state, "Module", state->mod_type,
1427 Module_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001428 "Module(stmt* body, type_ignore* type_ignores)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001429 if (!state->Module_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001430 state->Interactive_type = make_type(state, "Interactive", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001431 Interactive_fields, 1,
1432 "Interactive(stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001433 if (!state->Interactive_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001434 state->Expression_type = make_type(state, "Expression", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001435 Expression_fields, 1,
1436 "Expression(expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001437 if (!state->Expression_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001438 state->FunctionType_type = make_type(state, "FunctionType",
1439 state->mod_type, FunctionType_fields,
1440 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001441 "FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001442 if (!state->FunctionType_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001443 state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001444 "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1445 " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1446 " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n"
1447 " | Return(expr? value)\n"
1448 " | Delete(expr* targets)\n"
1449 " | Assign(expr* targets, expr value, string? type_comment)\n"
1450 " | AugAssign(expr target, operator op, expr value)\n"
1451 " | AnnAssign(expr target, expr annotation, expr? value, int simple)\n"
1452 " | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1453 " | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1454 " | While(expr test, stmt* body, stmt* orelse)\n"
1455 " | If(expr test, stmt* body, stmt* orelse)\n"
1456 " | With(withitem* items, stmt* body, string? type_comment)\n"
1457 " | AsyncWith(withitem* items, stmt* body, string? type_comment)\n"
1458 " | Raise(expr? exc, expr? cause)\n"
1459 " | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n"
1460 " | Assert(expr test, expr? msg)\n"
1461 " | Import(alias* names)\n"
1462 " | ImportFrom(identifier? module, alias* names, int? level)\n"
1463 " | Global(identifier* names)\n"
1464 " | Nonlocal(identifier* names)\n"
1465 " | Expr(expr value)\n"
1466 " | Pass\n"
1467 " | Break\n"
1468 " | Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001469 if (!state->stmt_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001470 if (!add_attributes(state, state->stmt_type, stmt_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001471 if (PyObject_SetAttr(state->stmt_type, state->end_lineno, Py_None) == -1)
1472 return 0;
1473 if (PyObject_SetAttr(state->stmt_type, state->end_col_offset, Py_None) ==
1474 -1)
1475 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001476 state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001477 FunctionDef_fields, 6,
1478 "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001479 if (!state->FunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001480 if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) ==
1481 -1)
1482 return 0;
1483 if (PyObject_SetAttr(state->FunctionDef_type, state->type_comment, Py_None)
1484 == -1)
1485 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001486 state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001487 state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001488 AsyncFunctionDef_fields, 6,
1489 "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001490 if (!state->AsyncFunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001491 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None)
1492 == -1)
1493 return 0;
1494 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->type_comment,
1495 Py_None) == -1)
1496 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001497 state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001498 ClassDef_fields, 5,
1499 "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001500 if (!state->ClassDef_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001501 state->Return_type = make_type(state, "Return", state->stmt_type,
1502 Return_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001503 "Return(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001504 if (!state->Return_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001505 if (PyObject_SetAttr(state->Return_type, state->value, Py_None) == -1)
1506 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001507 state->Delete_type = make_type(state, "Delete", state->stmt_type,
1508 Delete_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001509 "Delete(expr* targets)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001510 if (!state->Delete_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001511 state->Assign_type = make_type(state, "Assign", state->stmt_type,
1512 Assign_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001513 "Assign(expr* targets, expr value, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001514 if (!state->Assign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001515 if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) ==
1516 -1)
1517 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001518 state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001519 AugAssign_fields, 3,
1520 "AugAssign(expr target, operator op, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001521 if (!state->AugAssign_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001522 state->AnnAssign_type = make_type(state, "AnnAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001523 AnnAssign_fields, 4,
1524 "AnnAssign(expr target, expr annotation, expr? value, int simple)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001525 if (!state->AnnAssign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001526 if (PyObject_SetAttr(state->AnnAssign_type, state->value, Py_None) == -1)
1527 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001528 state->For_type = make_type(state, "For", state->stmt_type, For_fields, 5,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001529 "For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001530 if (!state->For_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001531 if (PyObject_SetAttr(state->For_type, state->type_comment, Py_None) == -1)
1532 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001533 state->AsyncFor_type = make_type(state, "AsyncFor", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001534 AsyncFor_fields, 5,
1535 "AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001536 if (!state->AsyncFor_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001537 if (PyObject_SetAttr(state->AsyncFor_type, state->type_comment, Py_None) ==
1538 -1)
1539 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001540 state->While_type = make_type(state, "While", state->stmt_type,
1541 While_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001542 "While(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001543 if (!state->While_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001544 state->If_type = make_type(state, "If", state->stmt_type, If_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001545 "If(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001546 if (!state->If_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001547 state->With_type = make_type(state, "With", state->stmt_type, With_fields,
1548 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001549 "With(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001550 if (!state->With_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001551 if (PyObject_SetAttr(state->With_type, state->type_comment, Py_None) == -1)
1552 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001553 state->AsyncWith_type = make_type(state, "AsyncWith", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001554 AsyncWith_fields, 3,
1555 "AsyncWith(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001556 if (!state->AsyncWith_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001557 if (PyObject_SetAttr(state->AsyncWith_type, state->type_comment, Py_None)
1558 == -1)
1559 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001560 state->Raise_type = make_type(state, "Raise", state->stmt_type,
1561 Raise_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001562 "Raise(expr? exc, expr? cause)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001563 if (!state->Raise_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001564 if (PyObject_SetAttr(state->Raise_type, state->exc, Py_None) == -1)
1565 return 0;
1566 if (PyObject_SetAttr(state->Raise_type, state->cause, Py_None) == -1)
1567 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001568 state->Try_type = make_type(state, "Try", state->stmt_type, Try_fields, 4,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001569 "Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001570 if (!state->Try_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001571 state->Assert_type = make_type(state, "Assert", state->stmt_type,
1572 Assert_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001573 "Assert(expr test, expr? msg)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001574 if (!state->Assert_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001575 if (PyObject_SetAttr(state->Assert_type, state->msg, Py_None) == -1)
1576 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001577 state->Import_type = make_type(state, "Import", state->stmt_type,
1578 Import_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001579 "Import(alias* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001580 if (!state->Import_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001581 state->ImportFrom_type = make_type(state, "ImportFrom", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001582 ImportFrom_fields, 3,
1583 "ImportFrom(identifier? module, alias* names, int? level)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001584 if (!state->ImportFrom_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001585 if (PyObject_SetAttr(state->ImportFrom_type, state->module, Py_None) == -1)
1586 return 0;
1587 if (PyObject_SetAttr(state->ImportFrom_type, state->level, Py_None) == -1)
1588 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001589 state->Global_type = make_type(state, "Global", state->stmt_type,
1590 Global_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001591 "Global(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001592 if (!state->Global_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001593 state->Nonlocal_type = make_type(state, "Nonlocal", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001594 Nonlocal_fields, 1,
1595 "Nonlocal(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001596 if (!state->Nonlocal_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001597 state->Expr_type = make_type(state, "Expr", state->stmt_type, Expr_fields,
1598 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001599 "Expr(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001600 if (!state->Expr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001601 state->Pass_type = make_type(state, "Pass", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001602 "Pass");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001603 if (!state->Pass_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001604 state->Break_type = make_type(state, "Break", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001605 "Break");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001606 if (!state->Break_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001607 state->Continue_type = make_type(state, "Continue", state->stmt_type, NULL,
1608 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001609 "Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001610 if (!state->Continue_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001611 state->expr_type = make_type(state, "expr", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001612 "expr = BoolOp(boolop op, expr* values)\n"
1613 " | NamedExpr(expr target, expr value)\n"
1614 " | BinOp(expr left, operator op, expr right)\n"
1615 " | UnaryOp(unaryop op, expr operand)\n"
1616 " | Lambda(arguments args, expr body)\n"
1617 " | IfExp(expr test, expr body, expr orelse)\n"
1618 " | Dict(expr* keys, expr* values)\n"
1619 " | Set(expr* elts)\n"
1620 " | ListComp(expr elt, comprehension* generators)\n"
1621 " | SetComp(expr elt, comprehension* generators)\n"
1622 " | DictComp(expr key, expr value, comprehension* generators)\n"
1623 " | GeneratorExp(expr elt, comprehension* generators)\n"
1624 " | Await(expr value)\n"
1625 " | Yield(expr? value)\n"
1626 " | YieldFrom(expr value)\n"
1627 " | Compare(expr left, cmpop* ops, expr* comparators)\n"
1628 " | Call(expr func, expr* args, keyword* keywords)\n"
1629 " | FormattedValue(expr value, int? conversion, expr? format_spec)\n"
1630 " | JoinedStr(expr* values)\n"
1631 " | Constant(constant value, string? kind)\n"
1632 " | Attribute(expr value, identifier attr, expr_context ctx)\n"
1633 " | Subscript(expr value, expr slice, expr_context ctx)\n"
1634 " | Starred(expr value, expr_context ctx)\n"
1635 " | Name(identifier id, expr_context ctx)\n"
1636 " | List(expr* elts, expr_context ctx)\n"
1637 " | Tuple(expr* elts, expr_context ctx)\n"
1638 " | Slice(expr? lower, expr? upper, expr? step)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001639 if (!state->expr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001640 if (!add_attributes(state, state->expr_type, expr_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001641 if (PyObject_SetAttr(state->expr_type, state->end_lineno, Py_None) == -1)
1642 return 0;
1643 if (PyObject_SetAttr(state->expr_type, state->end_col_offset, Py_None) ==
1644 -1)
1645 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001646 state->BoolOp_type = make_type(state, "BoolOp", state->expr_type,
1647 BoolOp_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001648 "BoolOp(boolop op, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001649 if (!state->BoolOp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001650 state->NamedExpr_type = make_type(state, "NamedExpr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001651 NamedExpr_fields, 2,
1652 "NamedExpr(expr target, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001653 if (!state->NamedExpr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001654 state->BinOp_type = make_type(state, "BinOp", state->expr_type,
1655 BinOp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001656 "BinOp(expr left, operator op, expr right)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001657 if (!state->BinOp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001658 state->UnaryOp_type = make_type(state, "UnaryOp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001659 UnaryOp_fields, 2,
1660 "UnaryOp(unaryop op, expr operand)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001661 if (!state->UnaryOp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001662 state->Lambda_type = make_type(state, "Lambda", state->expr_type,
1663 Lambda_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001664 "Lambda(arguments args, expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001665 if (!state->Lambda_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001666 state->IfExp_type = make_type(state, "IfExp", state->expr_type,
1667 IfExp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001668 "IfExp(expr test, expr body, expr orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001669 if (!state->IfExp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001670 state->Dict_type = make_type(state, "Dict", state->expr_type, Dict_fields,
1671 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001672 "Dict(expr* keys, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001673 if (!state->Dict_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001674 state->Set_type = make_type(state, "Set", state->expr_type, Set_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001675 "Set(expr* elts)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001676 if (!state->Set_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001677 state->ListComp_type = make_type(state, "ListComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001678 ListComp_fields, 2,
1679 "ListComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001680 if (!state->ListComp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001681 state->SetComp_type = make_type(state, "SetComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001682 SetComp_fields, 2,
1683 "SetComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001684 if (!state->SetComp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001685 state->DictComp_type = make_type(state, "DictComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001686 DictComp_fields, 3,
1687 "DictComp(expr key, expr value, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001688 if (!state->DictComp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001689 state->GeneratorExp_type = make_type(state, "GeneratorExp",
1690 state->expr_type, GeneratorExp_fields,
1691 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001692 "GeneratorExp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001693 if (!state->GeneratorExp_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001694 state->Await_type = make_type(state, "Await", state->expr_type,
1695 Await_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001696 "Await(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001697 if (!state->Await_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001698 state->Yield_type = make_type(state, "Yield", state->expr_type,
1699 Yield_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001700 "Yield(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001701 if (!state->Yield_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001702 if (PyObject_SetAttr(state->Yield_type, state->value, Py_None) == -1)
1703 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001704 state->YieldFrom_type = make_type(state, "YieldFrom", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001705 YieldFrom_fields, 1,
1706 "YieldFrom(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001707 if (!state->YieldFrom_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001708 state->Compare_type = make_type(state, "Compare", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001709 Compare_fields, 3,
1710 "Compare(expr left, cmpop* ops, expr* comparators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001711 if (!state->Compare_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001712 state->Call_type = make_type(state, "Call", state->expr_type, Call_fields,
1713 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001714 "Call(expr func, expr* args, keyword* keywords)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001715 if (!state->Call_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001716 state->FormattedValue_type = make_type(state, "FormattedValue",
1717 state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001718 FormattedValue_fields, 3,
1719 "FormattedValue(expr value, int? conversion, expr? format_spec)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001720 if (!state->FormattedValue_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001721 if (PyObject_SetAttr(state->FormattedValue_type, state->conversion,
1722 Py_None) == -1)
1723 return 0;
1724 if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec,
1725 Py_None) == -1)
1726 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001727 state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001728 JoinedStr_fields, 1,
1729 "JoinedStr(expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001730 if (!state->JoinedStr_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001731 state->Constant_type = make_type(state, "Constant", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001732 Constant_fields, 2,
1733 "Constant(constant value, string? kind)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001734 if (!state->Constant_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001735 if (PyObject_SetAttr(state->Constant_type, state->kind, Py_None) == -1)
1736 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001737 state->Attribute_type = make_type(state, "Attribute", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001738 Attribute_fields, 3,
1739 "Attribute(expr value, identifier attr, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001740 if (!state->Attribute_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001741 state->Subscript_type = make_type(state, "Subscript", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001742 Subscript_fields, 3,
1743 "Subscript(expr value, expr slice, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001744 if (!state->Subscript_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001745 state->Starred_type = make_type(state, "Starred", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001746 Starred_fields, 2,
1747 "Starred(expr value, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001748 if (!state->Starred_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001749 state->Name_type = make_type(state, "Name", state->expr_type, Name_fields,
1750 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001751 "Name(identifier id, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001752 if (!state->Name_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001753 state->List_type = make_type(state, "List", state->expr_type, List_fields,
1754 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001755 "List(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001756 if (!state->List_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001757 state->Tuple_type = make_type(state, "Tuple", state->expr_type,
1758 Tuple_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001759 "Tuple(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001760 if (!state->Tuple_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001761 state->Slice_type = make_type(state, "Slice", state->expr_type,
1762 Slice_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001763 "Slice(expr? lower, expr? upper, expr? step)");
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001764 if (!state->Slice_type) return 0;
1765 if (PyObject_SetAttr(state->Slice_type, state->lower, Py_None) == -1)
1766 return 0;
1767 if (PyObject_SetAttr(state->Slice_type, state->upper, Py_None) == -1)
1768 return 0;
1769 if (PyObject_SetAttr(state->Slice_type, state->step, Py_None) == -1)
1770 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001771 state->expr_context_type = make_type(state, "expr_context",
1772 state->AST_type, NULL, 0,
Serhiy Storchaka6b975982020-03-17 23:41:08 +02001773 "expr_context = Load | Store | Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001774 if (!state->expr_context_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001775 if (!add_attributes(state, state->expr_context_type, NULL, 0)) return 0;
1776 state->Load_type = make_type(state, "Load", state->expr_context_type, NULL,
1777 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001778 "Load");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001779 if (!state->Load_type) return 0;
1780 state->Load_singleton = PyType_GenericNew((PyTypeObject *)state->Load_type,
1781 NULL, NULL);
1782 if (!state->Load_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001783 state->Store_type = make_type(state, "Store", state->expr_context_type,
1784 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001785 "Store");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001786 if (!state->Store_type) return 0;
1787 state->Store_singleton = PyType_GenericNew((PyTypeObject
1788 *)state->Store_type, NULL, NULL);
1789 if (!state->Store_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001790 state->Del_type = make_type(state, "Del", state->expr_context_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001791 "Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001792 if (!state->Del_type) return 0;
1793 state->Del_singleton = PyType_GenericNew((PyTypeObject *)state->Del_type,
1794 NULL, NULL);
1795 if (!state->Del_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001796 state->boolop_type = make_type(state, "boolop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001797 "boolop = And | Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001798 if (!state->boolop_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001799 if (!add_attributes(state, state->boolop_type, NULL, 0)) return 0;
1800 state->And_type = make_type(state, "And", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001801 "And");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001802 if (!state->And_type) return 0;
1803 state->And_singleton = PyType_GenericNew((PyTypeObject *)state->And_type,
1804 NULL, NULL);
1805 if (!state->And_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001806 state->Or_type = make_type(state, "Or", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001807 "Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001808 if (!state->Or_type) return 0;
1809 state->Or_singleton = PyType_GenericNew((PyTypeObject *)state->Or_type,
1810 NULL, NULL);
1811 if (!state->Or_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001812 state->operator_type = make_type(state, "operator", state->AST_type, NULL,
1813 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001814 "operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001815 if (!state->operator_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001816 if (!add_attributes(state, state->operator_type, NULL, 0)) return 0;
1817 state->Add_type = make_type(state, "Add", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001818 "Add");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001819 if (!state->Add_type) return 0;
1820 state->Add_singleton = PyType_GenericNew((PyTypeObject *)state->Add_type,
1821 NULL, NULL);
1822 if (!state->Add_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001823 state->Sub_type = make_type(state, "Sub", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001824 "Sub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001825 if (!state->Sub_type) return 0;
1826 state->Sub_singleton = PyType_GenericNew((PyTypeObject *)state->Sub_type,
1827 NULL, NULL);
1828 if (!state->Sub_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001829 state->Mult_type = make_type(state, "Mult", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001830 "Mult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001831 if (!state->Mult_type) return 0;
1832 state->Mult_singleton = PyType_GenericNew((PyTypeObject *)state->Mult_type,
1833 NULL, NULL);
1834 if (!state->Mult_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001835 state->MatMult_type = make_type(state, "MatMult", state->operator_type,
1836 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001837 "MatMult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001838 if (!state->MatMult_type) return 0;
1839 state->MatMult_singleton = PyType_GenericNew((PyTypeObject
1840 *)state->MatMult_type, NULL,
1841 NULL);
1842 if (!state->MatMult_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001843 state->Div_type = make_type(state, "Div", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001844 "Div");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001845 if (!state->Div_type) return 0;
1846 state->Div_singleton = PyType_GenericNew((PyTypeObject *)state->Div_type,
1847 NULL, NULL);
1848 if (!state->Div_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001849 state->Mod_type = make_type(state, "Mod", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001850 "Mod");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001851 if (!state->Mod_type) return 0;
1852 state->Mod_singleton = PyType_GenericNew((PyTypeObject *)state->Mod_type,
1853 NULL, NULL);
1854 if (!state->Mod_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001855 state->Pow_type = make_type(state, "Pow", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001856 "Pow");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001857 if (!state->Pow_type) return 0;
1858 state->Pow_singleton = PyType_GenericNew((PyTypeObject *)state->Pow_type,
1859 NULL, NULL);
1860 if (!state->Pow_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001861 state->LShift_type = make_type(state, "LShift", state->operator_type, NULL,
1862 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001863 "LShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001864 if (!state->LShift_type) return 0;
1865 state->LShift_singleton = PyType_GenericNew((PyTypeObject
1866 *)state->LShift_type, NULL,
1867 NULL);
1868 if (!state->LShift_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001869 state->RShift_type = make_type(state, "RShift", state->operator_type, NULL,
1870 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001871 "RShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001872 if (!state->RShift_type) return 0;
1873 state->RShift_singleton = PyType_GenericNew((PyTypeObject
1874 *)state->RShift_type, NULL,
1875 NULL);
1876 if (!state->RShift_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001877 state->BitOr_type = make_type(state, "BitOr", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001878 "BitOr");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001879 if (!state->BitOr_type) return 0;
1880 state->BitOr_singleton = PyType_GenericNew((PyTypeObject
1881 *)state->BitOr_type, NULL, NULL);
1882 if (!state->BitOr_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001883 state->BitXor_type = make_type(state, "BitXor", state->operator_type, NULL,
1884 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001885 "BitXor");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001886 if (!state->BitXor_type) return 0;
1887 state->BitXor_singleton = PyType_GenericNew((PyTypeObject
1888 *)state->BitXor_type, NULL,
1889 NULL);
1890 if (!state->BitXor_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001891 state->BitAnd_type = make_type(state, "BitAnd", state->operator_type, NULL,
1892 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001893 "BitAnd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001894 if (!state->BitAnd_type) return 0;
1895 state->BitAnd_singleton = PyType_GenericNew((PyTypeObject
1896 *)state->BitAnd_type, NULL,
1897 NULL);
1898 if (!state->BitAnd_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001899 state->FloorDiv_type = make_type(state, "FloorDiv", state->operator_type,
1900 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001901 "FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001902 if (!state->FloorDiv_type) return 0;
1903 state->FloorDiv_singleton = PyType_GenericNew((PyTypeObject
1904 *)state->FloorDiv_type, NULL,
1905 NULL);
1906 if (!state->FloorDiv_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001907 state->unaryop_type = make_type(state, "unaryop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001908 "unaryop = Invert | Not | UAdd | USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001909 if (!state->unaryop_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001910 if (!add_attributes(state, state->unaryop_type, NULL, 0)) return 0;
1911 state->Invert_type = make_type(state, "Invert", state->unaryop_type, NULL,
1912 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001913 "Invert");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001914 if (!state->Invert_type) return 0;
1915 state->Invert_singleton = PyType_GenericNew((PyTypeObject
1916 *)state->Invert_type, NULL,
1917 NULL);
1918 if (!state->Invert_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001919 state->Not_type = make_type(state, "Not", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001920 "Not");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001921 if (!state->Not_type) return 0;
1922 state->Not_singleton = PyType_GenericNew((PyTypeObject *)state->Not_type,
1923 NULL, NULL);
1924 if (!state->Not_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001925 state->UAdd_type = make_type(state, "UAdd", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001926 "UAdd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001927 if (!state->UAdd_type) return 0;
1928 state->UAdd_singleton = PyType_GenericNew((PyTypeObject *)state->UAdd_type,
1929 NULL, NULL);
1930 if (!state->UAdd_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001931 state->USub_type = make_type(state, "USub", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001932 "USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001933 if (!state->USub_type) return 0;
1934 state->USub_singleton = PyType_GenericNew((PyTypeObject *)state->USub_type,
1935 NULL, NULL);
1936 if (!state->USub_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001937 state->cmpop_type = make_type(state, "cmpop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001938 "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001939 if (!state->cmpop_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001940 if (!add_attributes(state, state->cmpop_type, NULL, 0)) return 0;
1941 state->Eq_type = make_type(state, "Eq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001942 "Eq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001943 if (!state->Eq_type) return 0;
1944 state->Eq_singleton = PyType_GenericNew((PyTypeObject *)state->Eq_type,
1945 NULL, NULL);
1946 if (!state->Eq_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001947 state->NotEq_type = make_type(state, "NotEq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001948 "NotEq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001949 if (!state->NotEq_type) return 0;
1950 state->NotEq_singleton = PyType_GenericNew((PyTypeObject
1951 *)state->NotEq_type, NULL, NULL);
1952 if (!state->NotEq_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001953 state->Lt_type = make_type(state, "Lt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001954 "Lt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001955 if (!state->Lt_type) return 0;
1956 state->Lt_singleton = PyType_GenericNew((PyTypeObject *)state->Lt_type,
1957 NULL, NULL);
1958 if (!state->Lt_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001959 state->LtE_type = make_type(state, "LtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001960 "LtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001961 if (!state->LtE_type) return 0;
1962 state->LtE_singleton = PyType_GenericNew((PyTypeObject *)state->LtE_type,
1963 NULL, NULL);
1964 if (!state->LtE_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001965 state->Gt_type = make_type(state, "Gt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001966 "Gt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001967 if (!state->Gt_type) return 0;
1968 state->Gt_singleton = PyType_GenericNew((PyTypeObject *)state->Gt_type,
1969 NULL, NULL);
1970 if (!state->Gt_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001971 state->GtE_type = make_type(state, "GtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001972 "GtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001973 if (!state->GtE_type) return 0;
1974 state->GtE_singleton = PyType_GenericNew((PyTypeObject *)state->GtE_type,
1975 NULL, NULL);
1976 if (!state->GtE_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001977 state->Is_type = make_type(state, "Is", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001978 "Is");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001979 if (!state->Is_type) return 0;
1980 state->Is_singleton = PyType_GenericNew((PyTypeObject *)state->Is_type,
1981 NULL, NULL);
1982 if (!state->Is_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001983 state->IsNot_type = make_type(state, "IsNot", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001984 "IsNot");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001985 if (!state->IsNot_type) return 0;
1986 state->IsNot_singleton = PyType_GenericNew((PyTypeObject
1987 *)state->IsNot_type, NULL, NULL);
1988 if (!state->IsNot_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001989 state->In_type = make_type(state, "In", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001990 "In");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001991 if (!state->In_type) return 0;
1992 state->In_singleton = PyType_GenericNew((PyTypeObject *)state->In_type,
1993 NULL, NULL);
1994 if (!state->In_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02001995 state->NotIn_type = make_type(state, "NotIn", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001996 "NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001997 if (!state->NotIn_type) return 0;
1998 state->NotIn_singleton = PyType_GenericNew((PyTypeObject
1999 *)state->NotIn_type, NULL, NULL);
2000 if (!state->NotIn_singleton) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002001 state->comprehension_type = make_type(state, "comprehension",
2002 state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002003 comprehension_fields, 4,
2004 "comprehension(expr target, expr iter, expr* ifs, int is_async)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002005 if (!state->comprehension_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002006 if (!add_attributes(state, state->comprehension_type, NULL, 0)) return 0;
2007 state->excepthandler_type = make_type(state, "excepthandler",
2008 state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002009 "excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002010 if (!state->excepthandler_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002011 if (!add_attributes(state, state->excepthandler_type,
2012 excepthandler_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002013 if (PyObject_SetAttr(state->excepthandler_type, state->end_lineno, Py_None)
2014 == -1)
2015 return 0;
2016 if (PyObject_SetAttr(state->excepthandler_type, state->end_col_offset,
2017 Py_None) == -1)
2018 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002019 state->ExceptHandler_type = make_type(state, "ExceptHandler",
Dino Viehlandac46eb42019-09-11 10:16:34 -07002020 state->excepthandler_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002021 ExceptHandler_fields, 3,
2022 "ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002023 if (!state->ExceptHandler_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002024 if (PyObject_SetAttr(state->ExceptHandler_type, state->type, Py_None) == -1)
2025 return 0;
2026 if (PyObject_SetAttr(state->ExceptHandler_type, state->name, Py_None) == -1)
2027 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002028 state->arguments_type = make_type(state, "arguments", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002029 arguments_fields, 7,
2030 "arguments(arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002031 if (!state->arguments_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002032 if (!add_attributes(state, state->arguments_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002033 if (PyObject_SetAttr(state->arguments_type, state->vararg, Py_None) == -1)
2034 return 0;
2035 if (PyObject_SetAttr(state->arguments_type, state->kwarg, Py_None) == -1)
2036 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002037 state->arg_type = make_type(state, "arg", state->AST_type, arg_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002038 "arg(identifier arg, expr? annotation, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002039 if (!state->arg_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002040 if (!add_attributes(state, state->arg_type, arg_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002041 if (PyObject_SetAttr(state->arg_type, state->annotation, Py_None) == -1)
2042 return 0;
2043 if (PyObject_SetAttr(state->arg_type, state->type_comment, Py_None) == -1)
2044 return 0;
2045 if (PyObject_SetAttr(state->arg_type, state->end_lineno, Py_None) == -1)
2046 return 0;
2047 if (PyObject_SetAttr(state->arg_type, state->end_col_offset, Py_None) == -1)
2048 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002049 state->keyword_type = make_type(state, "keyword", state->AST_type,
2050 keyword_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002051 "keyword(identifier? arg, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002052 if (!state->keyword_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002053 if (!add_attributes(state, state->keyword_type, keyword_attributes, 4))
2054 return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002055 if (PyObject_SetAttr(state->keyword_type, state->arg, Py_None) == -1)
2056 return 0;
Pablo Galindo168660b2020-04-02 00:47:39 +01002057 if (PyObject_SetAttr(state->keyword_type, state->end_lineno, Py_None) == -1)
2058 return 0;
2059 if (PyObject_SetAttr(state->keyword_type, state->end_col_offset, Py_None)
2060 == -1)
2061 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002062 state->alias_type = make_type(state, "alias", state->AST_type,
2063 alias_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002064 "alias(identifier name, identifier? asname)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002065 if (!state->alias_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002066 if (!add_attributes(state, state->alias_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002067 if (PyObject_SetAttr(state->alias_type, state->asname, Py_None) == -1)
2068 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002069 state->withitem_type = make_type(state, "withitem", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002070 withitem_fields, 2,
2071 "withitem(expr context_expr, expr? optional_vars)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002072 if (!state->withitem_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002073 if (!add_attributes(state, state->withitem_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02002074 if (PyObject_SetAttr(state->withitem_type, state->optional_vars, Py_None)
2075 == -1)
2076 return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002077 state->type_ignore_type = make_type(state, "type_ignore", state->AST_type,
2078 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002079 "type_ignore = TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002080 if (!state->type_ignore_type) return 0;
Victor Stinnerf8599272020-07-03 16:57:19 +02002081 if (!add_attributes(state, state->type_ignore_type, NULL, 0)) return 0;
2082 state->TypeIgnore_type = make_type(state, "TypeIgnore",
2083 state->type_ignore_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03002084 TypeIgnore_fields, 2,
2085 "TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07002086 if (!state->TypeIgnore_type) return 0;
2087 state->initialized = 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002088 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002089}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002090
Victor Stinnerf8599272020-07-03 16:57:19 +02002091static int obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out,
2092 PyArena* arena);
2093static int obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out,
2094 PyArena* arena);
2095static int obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out,
2096 PyArena* arena);
2097static int obj2ast_expr_context(astmodulestate *state, PyObject* obj,
2098 expr_context_ty* out, PyArena* arena);
2099static int obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out,
2100 PyArena* arena);
2101static int obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty*
2102 out, PyArena* arena);
2103static int obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty*
2104 out, PyArena* arena);
2105static int obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out,
2106 PyArena* arena);
2107static int obj2ast_comprehension(astmodulestate *state, PyObject* obj,
2108 comprehension_ty* out, PyArena* arena);
2109static int obj2ast_excepthandler(astmodulestate *state, PyObject* obj,
2110 excepthandler_ty* out, PyArena* arena);
2111static int obj2ast_arguments(astmodulestate *state, PyObject* obj,
2112 arguments_ty* out, PyArena* arena);
2113static int obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out,
2114 PyArena* arena);
2115static int obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty*
2116 out, PyArena* arena);
2117static int obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out,
2118 PyArena* arena);
2119static int obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty*
2120 out, PyArena* arena);
2121static int obj2ast_type_ignore(astmodulestate *state, PyObject* obj,
2122 type_ignore_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002123
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002125Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002127 mod_ty p;
2128 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2129 if (!p)
2130 return NULL;
2131 p->kind = Module_kind;
2132 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002133 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002134 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135}
2136
2137mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002138Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002140 mod_ty p;
2141 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2142 if (!p)
2143 return NULL;
2144 p->kind = Interactive_kind;
2145 p->v.Interactive.body = body;
2146 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147}
2148
2149mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002150Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002152 mod_ty p;
2153 if (!body) {
2154 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002155 "field 'body' is required for Expression");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002156 return NULL;
2157 }
2158 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2159 if (!p)
2160 return NULL;
2161 p->kind = Expression_kind;
2162 p->v.Expression.body = body;
2163 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002164}
2165
2166mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002167FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena)
2168{
2169 mod_ty p;
2170 if (!returns) {
2171 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002172 "field 'returns' is required for FunctionType");
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002173 return NULL;
2174 }
2175 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2176 if (!p)
2177 return NULL;
2178 p->kind = FunctionType_kind;
2179 p->v.FunctionType.argtypes = argtypes;
2180 p->v.FunctionType.returns = returns;
2181 return p;
2182}
2183
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184stmt_ty
2185FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002186 decorator_list, expr_ty returns, string type_comment, int lineno,
2187 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002189 stmt_ty p;
2190 if (!name) {
2191 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002192 "field 'name' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002193 return NULL;
2194 }
2195 if (!args) {
2196 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002197 "field 'args' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002198 return NULL;
2199 }
2200 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2201 if (!p)
2202 return NULL;
2203 p->kind = FunctionDef_kind;
2204 p->v.FunctionDef.name = name;
2205 p->v.FunctionDef.args = args;
2206 p->v.FunctionDef.body = body;
2207 p->v.FunctionDef.decorator_list = decorator_list;
2208 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002209 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002210 p->lineno = lineno;
2211 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002212 p->end_lineno = end_lineno;
2213 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002214 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215}
2216
2217stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002218AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002219 * decorator_list, expr_ty returns, string type_comment, int
2220 lineno, int col_offset, int end_lineno, int end_col_offset,
2221 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002222{
2223 stmt_ty p;
2224 if (!name) {
2225 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002226 "field 'name' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002227 return NULL;
2228 }
2229 if (!args) {
2230 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002231 "field 'args' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002232 return NULL;
2233 }
2234 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2235 if (!p)
2236 return NULL;
2237 p->kind = AsyncFunctionDef_kind;
2238 p->v.AsyncFunctionDef.name = name;
2239 p->v.AsyncFunctionDef.args = args;
2240 p->v.AsyncFunctionDef.body = body;
2241 p->v.AsyncFunctionDef.decorator_list = decorator_list;
2242 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002243 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002244 p->lineno = lineno;
2245 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002246 p->end_lineno = end_lineno;
2247 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002248 return p;
2249}
2250
2251stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002252ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002253 body, asdl_seq * decorator_list, int lineno, int col_offset, int
2254 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002255{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002256 stmt_ty p;
2257 if (!name) {
2258 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002259 "field 'name' is required for ClassDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002260 return NULL;
2261 }
2262 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2263 if (!p)
2264 return NULL;
2265 p->kind = ClassDef_kind;
2266 p->v.ClassDef.name = name;
2267 p->v.ClassDef.bases = bases;
2268 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002269 p->v.ClassDef.body = body;
2270 p->v.ClassDef.decorator_list = decorator_list;
2271 p->lineno = lineno;
2272 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002273 p->end_lineno = end_lineno;
2274 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002275 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276}
2277
2278stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002279Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
2280 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002282 stmt_ty p;
2283 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2284 if (!p)
2285 return NULL;
2286 p->kind = Return_kind;
2287 p->v.Return.value = value;
2288 p->lineno = lineno;
2289 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002290 p->end_lineno = end_lineno;
2291 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002292 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293}
2294
2295stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002296Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int
2297 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002299 stmt_ty p;
2300 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2301 if (!p)
2302 return NULL;
2303 p->kind = Delete_kind;
2304 p->v.Delete.targets = targets;
2305 p->lineno = lineno;
2306 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002307 p->end_lineno = end_lineno;
2308 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002309 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310}
2311
2312stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002313Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int
2314 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002316 stmt_ty p;
2317 if (!value) {
2318 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002319 "field 'value' is required for Assign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002320 return NULL;
2321 }
2322 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2323 if (!p)
2324 return NULL;
2325 p->kind = Assign_kind;
2326 p->v.Assign.targets = targets;
2327 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002328 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002329 p->lineno = lineno;
2330 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002331 p->end_lineno = end_lineno;
2332 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002333 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334}
2335
2336stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002337AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002338 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002340 stmt_ty p;
2341 if (!target) {
2342 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002343 "field 'target' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002344 return NULL;
2345 }
2346 if (!op) {
2347 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002348 "field 'op' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002349 return NULL;
2350 }
2351 if (!value) {
2352 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002353 "field 'value' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002354 return NULL;
2355 }
2356 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2357 if (!p)
2358 return NULL;
2359 p->kind = AugAssign_kind;
2360 p->v.AugAssign.target = target;
2361 p->v.AugAssign.op = op;
2362 p->v.AugAssign.value = value;
2363 p->lineno = lineno;
2364 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002365 p->end_lineno = end_lineno;
2366 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002367 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368}
2369
2370stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002371AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002372 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2373 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002374{
2375 stmt_ty p;
2376 if (!target) {
2377 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002378 "field 'target' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002379 return NULL;
2380 }
2381 if (!annotation) {
2382 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002383 "field 'annotation' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002384 return NULL;
2385 }
2386 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2387 if (!p)
2388 return NULL;
2389 p->kind = AnnAssign_kind;
2390 p->v.AnnAssign.target = target;
2391 p->v.AnnAssign.annotation = annotation;
2392 p->v.AnnAssign.value = value;
2393 p->v.AnnAssign.simple = simple;
2394 p->lineno = lineno;
2395 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002396 p->end_lineno = end_lineno;
2397 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002398 return p;
2399}
2400
2401stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002402For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string
2403 type_comment, int lineno, int col_offset, int end_lineno, int
2404 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002406 stmt_ty p;
2407 if (!target) {
2408 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002409 "field 'target' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002410 return NULL;
2411 }
2412 if (!iter) {
2413 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002414 "field 'iter' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002415 return NULL;
2416 }
2417 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2418 if (!p)
2419 return NULL;
2420 p->kind = For_kind;
2421 p->v.For.target = target;
2422 p->v.For.iter = iter;
2423 p->v.For.body = body;
2424 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002425 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002426 p->lineno = lineno;
2427 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002428 p->end_lineno = end_lineno;
2429 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002430 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002431}
2432
2433stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002434AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse,
2435 string type_comment, int lineno, int col_offset, int end_lineno, int
2436 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002437{
2438 stmt_ty p;
2439 if (!target) {
2440 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002441 "field 'target' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002442 return NULL;
2443 }
2444 if (!iter) {
2445 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002446 "field 'iter' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002447 return NULL;
2448 }
2449 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2450 if (!p)
2451 return NULL;
2452 p->kind = AsyncFor_kind;
2453 p->v.AsyncFor.target = target;
2454 p->v.AsyncFor.iter = iter;
2455 p->v.AsyncFor.body = body;
2456 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002457 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002458 p->lineno = lineno;
2459 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002460 p->end_lineno = end_lineno;
2461 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002462 return p;
2463}
2464
2465stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002466While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002467 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002469 stmt_ty p;
2470 if (!test) {
2471 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002472 "field 'test' is required for While");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002473 return NULL;
2474 }
2475 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2476 if (!p)
2477 return NULL;
2478 p->kind = While_kind;
2479 p->v.While.test = test;
2480 p->v.While.body = body;
2481 p->v.While.orelse = orelse;
2482 p->lineno = lineno;
2483 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002484 p->end_lineno = end_lineno;
2485 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002486 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487}
2488
2489stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002490If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002491 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002493 stmt_ty p;
2494 if (!test) {
2495 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002496 "field 'test' is required for If");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002497 return NULL;
2498 }
2499 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2500 if (!p)
2501 return NULL;
2502 p->kind = If_kind;
2503 p->v.If.test = test;
2504 p->v.If.body = body;
2505 p->v.If.orelse = orelse;
2506 p->lineno = lineno;
2507 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002508 p->end_lineno = end_lineno;
2509 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002510 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511}
2512
2513stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002514With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int
2515 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002516{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002517 stmt_ty p;
2518 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2519 if (!p)
2520 return NULL;
2521 p->kind = With_kind;
2522 p->v.With.items = items;
2523 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002524 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002525 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;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002530}
2531
2532stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002533AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno,
2534 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002535{
2536 stmt_ty p;
2537 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2538 if (!p)
2539 return NULL;
2540 p->kind = AsyncWith_kind;
2541 p->v.AsyncWith.items = items;
2542 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002543 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002544 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;
Yury Selivanov75445082015-05-11 22:57:16 -04002548 return p;
2549}
2550
2551stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002552Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
2553 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002555 stmt_ty p;
2556 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2557 if (!p)
2558 return NULL;
2559 p->kind = Raise_kind;
2560 p->v.Raise.exc = exc;
2561 p->v.Raise.cause = cause;
2562 p->lineno = lineno;
2563 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002564 p->end_lineno = end_lineno;
2565 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002566 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567}
2568
2569stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002570Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002571 finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset,
2572 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 = Try_kind;
2579 p->v.Try.body = body;
2580 p->v.Try.handlers = handlers;
2581 p->v.Try.orelse = orelse;
2582 p->v.Try.finalbody = finalbody;
2583 p->lineno = lineno;
2584 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002585 p->end_lineno = end_lineno;
2586 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002587 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588}
2589
2590stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002591Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
2592 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002594 stmt_ty p;
2595 if (!test) {
2596 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002597 "field 'test' is required for Assert");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002598 return NULL;
2599 }
2600 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2601 if (!p)
2602 return NULL;
2603 p->kind = Assert_kind;
2604 p->v.Assert.test = test;
2605 p->v.Assert.msg = msg;
2606 p->lineno = lineno;
2607 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002608 p->end_lineno = end_lineno;
2609 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002610 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611}
2612
2613stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002614Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
2615 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002617 stmt_ty p;
2618 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2619 if (!p)
2620 return NULL;
2621 p->kind = Import_kind;
2622 p->v.Import.names = names;
2623 p->lineno = lineno;
2624 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002625 p->end_lineno = end_lineno;
2626 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002627 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628}
2629
2630stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002631ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002632 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002634 stmt_ty p;
2635 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2636 if (!p)
2637 return NULL;
2638 p->kind = ImportFrom_kind;
2639 p->v.ImportFrom.module = module;
2640 p->v.ImportFrom.names = names;
2641 p->v.ImportFrom.level = level;
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
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002650Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
2651 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 = Global_kind;
2658 p->v.Global.names = names;
2659 p->lineno = lineno;
2660 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002661 p->end_lineno = end_lineno;
2662 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002663 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664}
2665
2666stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002667Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
2668 end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00002669{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002670 stmt_ty p;
2671 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2672 if (!p)
2673 return NULL;
2674 p->kind = Nonlocal_kind;
2675 p->v.Nonlocal.names = names;
2676 p->lineno = lineno;
2677 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002678 p->end_lineno = end_lineno;
2679 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002680 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00002681}
2682
2683stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002684Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
2685 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002687 stmt_ty p;
2688 if (!value) {
2689 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002690 "field 'value' is required for Expr");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002691 return NULL;
2692 }
2693 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2694 if (!p)
2695 return NULL;
2696 p->kind = Expr_kind;
2697 p->v.Expr.value = value;
2698 p->lineno = lineno;
2699 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002700 p->end_lineno = end_lineno;
2701 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002702 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703}
2704
2705stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002706Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2707 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002709 stmt_ty p;
2710 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2711 if (!p)
2712 return NULL;
2713 p->kind = Pass_kind;
2714 p->lineno = lineno;
2715 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002716 p->end_lineno = end_lineno;
2717 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002718 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719}
2720
2721stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002722Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2723 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002725 stmt_ty p;
2726 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2727 if (!p)
2728 return NULL;
2729 p->kind = Break_kind;
2730 p->lineno = lineno;
2731 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002732 p->end_lineno = end_lineno;
2733 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002734 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735}
2736
2737stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002738Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
2739 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002741 stmt_ty p;
2742 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2743 if (!p)
2744 return NULL;
2745 p->kind = Continue_kind;
2746 p->lineno = lineno;
2747 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002748 p->end_lineno = end_lineno;
2749 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002750 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751}
2752
2753expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002754BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int
2755 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002757 expr_ty p;
2758 if (!op) {
2759 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002760 "field 'op' is required for BoolOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002761 return NULL;
2762 }
2763 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2764 if (!p)
2765 return NULL;
2766 p->kind = BoolOp_kind;
2767 p->v.BoolOp.op = op;
2768 p->v.BoolOp.values = values;
2769 p->lineno = lineno;
2770 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002771 p->end_lineno = end_lineno;
2772 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002773 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774}
2775
2776expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002777NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
2778 end_lineno, int end_col_offset, PyArena *arena)
2779{
2780 expr_ty p;
2781 if (!target) {
2782 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002783 "field 'target' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002784 return NULL;
2785 }
2786 if (!value) {
2787 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002788 "field 'value' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002789 return NULL;
2790 }
2791 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2792 if (!p)
2793 return NULL;
2794 p->kind = NamedExpr_kind;
2795 p->v.NamedExpr.target = target;
2796 p->v.NamedExpr.value = value;
2797 p->lineno = lineno;
2798 p->col_offset = col_offset;
2799 p->end_lineno = end_lineno;
2800 p->end_col_offset = end_col_offset;
2801 return p;
2802}
2803
2804expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002805BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002806 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002808 expr_ty p;
2809 if (!left) {
2810 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002811 "field 'left' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002812 return NULL;
2813 }
2814 if (!op) {
2815 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002816 "field 'op' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002817 return NULL;
2818 }
2819 if (!right) {
2820 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002821 "field 'right' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002822 return NULL;
2823 }
2824 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2825 if (!p)
2826 return NULL;
2827 p->kind = BinOp_kind;
2828 p->v.BinOp.left = left;
2829 p->v.BinOp.op = op;
2830 p->v.BinOp.right = right;
2831 p->lineno = lineno;
2832 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002833 p->end_lineno = end_lineno;
2834 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002835 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836}
2837
2838expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002839UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
2840 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002842 expr_ty p;
2843 if (!op) {
2844 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002845 "field 'op' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002846 return NULL;
2847 }
2848 if (!operand) {
2849 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002850 "field 'operand' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002851 return NULL;
2852 }
2853 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2854 if (!p)
2855 return NULL;
2856 p->kind = UnaryOp_kind;
2857 p->v.UnaryOp.op = op;
2858 p->v.UnaryOp.operand = operand;
2859 p->lineno = lineno;
2860 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002861 p->end_lineno = end_lineno;
2862 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002863 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864}
2865
2866expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002867Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
2868 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002870 expr_ty p;
2871 if (!args) {
2872 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002873 "field 'args' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002874 return NULL;
2875 }
2876 if (!body) {
2877 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002878 "field 'body' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002879 return NULL;
2880 }
2881 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2882 if (!p)
2883 return NULL;
2884 p->kind = Lambda_kind;
2885 p->v.Lambda.args = args;
2886 p->v.Lambda.body = body;
2887 p->lineno = lineno;
2888 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002889 p->end_lineno = end_lineno;
2890 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002891 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892}
2893
2894expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002895IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002896 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002897{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002898 expr_ty p;
2899 if (!test) {
2900 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002901 "field 'test' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002902 return NULL;
2903 }
2904 if (!body) {
2905 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002906 "field 'body' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002907 return NULL;
2908 }
2909 if (!orelse) {
2910 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002911 "field 'orelse' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002912 return NULL;
2913 }
2914 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2915 if (!p)
2916 return NULL;
2917 p->kind = IfExp_kind;
2918 p->v.IfExp.test = test;
2919 p->v.IfExp.body = body;
2920 p->v.IfExp.orelse = orelse;
2921 p->lineno = lineno;
2922 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002923 p->end_lineno = end_lineno;
2924 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002925 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002926}
2927
2928expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002929Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int
2930 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002931{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002932 expr_ty p;
2933 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2934 if (!p)
2935 return NULL;
2936 p->kind = Dict_kind;
2937 p->v.Dict.keys = keys;
2938 p->v.Dict.values = values;
2939 p->lineno = lineno;
2940 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002941 p->end_lineno = end_lineno;
2942 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002943 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944}
2945
2946expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002947Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int
2948 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002949{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002950 expr_ty p;
2951 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2952 if (!p)
2953 return NULL;
2954 p->kind = Set_kind;
2955 p->v.Set.elts = elts;
2956 p->lineno = lineno;
2957 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002958 p->end_lineno = end_lineno;
2959 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002960 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002961}
2962
2963expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002964ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2965 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002967 expr_ty p;
2968 if (!elt) {
2969 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002970 "field 'elt' is required for ListComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002971 return NULL;
2972 }
2973 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2974 if (!p)
2975 return NULL;
2976 p->kind = ListComp_kind;
2977 p->v.ListComp.elt = elt;
2978 p->v.ListComp.generators = generators;
2979 p->lineno = lineno;
2980 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002981 p->end_lineno = end_lineno;
2982 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002983 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002984}
2985
2986expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002987SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2988 end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002989{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002990 expr_ty p;
2991 if (!elt) {
2992 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002993 "field 'elt' is required for SetComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002994 return NULL;
2995 }
2996 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2997 if (!p)
2998 return NULL;
2999 p->kind = SetComp_kind;
3000 p->v.SetComp.elt = elt;
3001 p->v.SetComp.generators = generators;
3002 p->lineno = lineno;
3003 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003004 p->end_lineno = end_lineno;
3005 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003006 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003007}
3008
3009expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00003010DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003011 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00003012{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003013 expr_ty p;
3014 if (!key) {
3015 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003016 "field 'key' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003017 return NULL;
3018 }
3019 if (!value) {
3020 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003021 "field 'value' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003022 return NULL;
3023 }
3024 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3025 if (!p)
3026 return NULL;
3027 p->kind = DictComp_kind;
3028 p->v.DictComp.key = key;
3029 p->v.DictComp.value = value;
3030 p->v.DictComp.generators = generators;
3031 p->lineno = lineno;
3032 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003033 p->end_lineno = end_lineno;
3034 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003035 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00003036}
3037
3038expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003039GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003040 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003042 expr_ty p;
3043 if (!elt) {
3044 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003045 "field 'elt' is required for GeneratorExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003046 return NULL;
3047 }
3048 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3049 if (!p)
3050 return NULL;
3051 p->kind = GeneratorExp_kind;
3052 p->v.GeneratorExp.elt = elt;
3053 p->v.GeneratorExp.generators = generators;
3054 p->lineno = lineno;
3055 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003056 p->end_lineno = end_lineno;
3057 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003058 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059}
3060
3061expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003062Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
3063 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04003064{
3065 expr_ty p;
3066 if (!value) {
3067 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003068 "field 'value' is required for Await");
Yury Selivanov75445082015-05-11 22:57:16 -04003069 return NULL;
3070 }
3071 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3072 if (!p)
3073 return NULL;
3074 p->kind = Await_kind;
3075 p->v.Await.value = value;
3076 p->lineno = lineno;
3077 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003078 p->end_lineno = end_lineno;
3079 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04003080 return p;
3081}
3082
3083expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003084Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
3085 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003087 expr_ty p;
3088 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3089 if (!p)
3090 return NULL;
3091 p->kind = Yield_kind;
3092 p->v.Yield.value = value;
3093 p->lineno = lineno;
3094 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003095 p->end_lineno = end_lineno;
3096 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003097 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098}
3099
3100expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003101YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
3102 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05003103{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003104 expr_ty p;
3105 if (!value) {
3106 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003107 "field 'value' is required for YieldFrom");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003108 return NULL;
3109 }
3110 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3111 if (!p)
3112 return NULL;
3113 p->kind = YieldFrom_kind;
3114 p->v.YieldFrom.value = value;
3115 p->lineno = lineno;
3116 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003117 p->end_lineno = end_lineno;
3118 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003119 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05003120}
3121
3122expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003123Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003124 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003126 expr_ty p;
3127 if (!left) {
3128 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003129 "field 'left' is required for Compare");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003130 return NULL;
3131 }
3132 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3133 if (!p)
3134 return NULL;
3135 p->kind = Compare_kind;
3136 p->v.Compare.left = left;
3137 p->v.Compare.ops = ops;
3138 p->v.Compare.comparators = comparators;
3139 p->lineno = lineno;
3140 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003141 p->end_lineno = end_lineno;
3142 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003143 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144}
3145
3146expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003147Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003148 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003150 expr_ty p;
3151 if (!func) {
3152 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003153 "field 'func' is required for Call");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003154 return NULL;
3155 }
3156 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3157 if (!p)
3158 return NULL;
3159 p->kind = Call_kind;
3160 p->v.Call.func = func;
3161 p->v.Call.args = args;
3162 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003163 p->lineno = lineno;
3164 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003165 p->end_lineno = end_lineno;
3166 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003167 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168}
3169
3170expr_ty
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04003171FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
3172 int col_offset, int end_lineno, int end_col_offset, PyArena
3173 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003174{
3175 expr_ty p;
3176 if (!value) {
3177 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003178 "field 'value' is required for FormattedValue");
Eric V. Smith235a6f02015-09-19 14:51:32 -04003179 return NULL;
3180 }
3181 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3182 if (!p)
3183 return NULL;
3184 p->kind = FormattedValue_kind;
3185 p->v.FormattedValue.value = value;
3186 p->v.FormattedValue.conversion = conversion;
3187 p->v.FormattedValue.format_spec = format_spec;
3188 p->lineno = lineno;
3189 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003190 p->end_lineno = end_lineno;
3191 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003192 return p;
3193}
3194
3195expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003196JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int
3197 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003198{
3199 expr_ty p;
3200 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3201 if (!p)
3202 return NULL;
3203 p->kind = JoinedStr_kind;
3204 p->v.JoinedStr.values = values;
3205 p->lineno = lineno;
3206 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003207 p->end_lineno = end_lineno;
3208 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003209 return p;
3210}
3211
3212expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003213Constant(constant value, string kind, int lineno, int col_offset, int
3214 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003215{
3216 expr_ty p;
3217 if (!value) {
3218 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003219 "field 'value' is required for Constant");
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003220 return NULL;
3221 }
3222 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3223 if (!p)
3224 return NULL;
3225 p->kind = Constant_kind;
3226 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003227 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003228 p->lineno = lineno;
3229 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003230 p->end_lineno = end_lineno;
3231 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003232 return p;
3233}
3234
3235expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003236Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003237 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003238{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003239 expr_ty p;
3240 if (!value) {
3241 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003242 "field 'value' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003243 return NULL;
3244 }
3245 if (!attr) {
3246 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003247 "field 'attr' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003248 return NULL;
3249 }
3250 if (!ctx) {
3251 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003252 "field 'ctx' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003253 return NULL;
3254 }
3255 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3256 if (!p)
3257 return NULL;
3258 p->kind = Attribute_kind;
3259 p->v.Attribute.value = value;
3260 p->v.Attribute.attr = attr;
3261 p->v.Attribute.ctx = ctx;
3262 p->lineno = lineno;
3263 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003264 p->end_lineno = end_lineno;
3265 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003266 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267}
3268
3269expr_ty
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003270Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003271 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003273 expr_ty p;
3274 if (!value) {
3275 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003276 "field 'value' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003277 return NULL;
3278 }
3279 if (!slice) {
3280 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003281 "field 'slice' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003282 return NULL;
3283 }
3284 if (!ctx) {
3285 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003286 "field 'ctx' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003287 return NULL;
3288 }
3289 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3290 if (!p)
3291 return NULL;
3292 p->kind = Subscript_kind;
3293 p->v.Subscript.value = value;
3294 p->v.Subscript.slice = slice;
3295 p->v.Subscript.ctx = ctx;
3296 p->lineno = lineno;
3297 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003298 p->end_lineno = end_lineno;
3299 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003300 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003301}
3302
3303expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003304Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
3305 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00003306{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003307 expr_ty p;
3308 if (!value) {
3309 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003310 "field 'value' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003311 return NULL;
3312 }
3313 if (!ctx) {
3314 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003315 "field 'ctx' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003316 return NULL;
3317 }
3318 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3319 if (!p)
3320 return NULL;
3321 p->kind = Starred_kind;
3322 p->v.Starred.value = value;
3323 p->v.Starred.ctx = ctx;
3324 p->lineno = lineno;
3325 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003326 p->end_lineno = end_lineno;
3327 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003328 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00003329}
3330
3331expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003332Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
3333 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003334{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003335 expr_ty p;
3336 if (!id) {
3337 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003338 "field 'id' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003339 return NULL;
3340 }
3341 if (!ctx) {
3342 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003343 "field 'ctx' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003344 return NULL;
3345 }
3346 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3347 if (!p)
3348 return NULL;
3349 p->kind = Name_kind;
3350 p->v.Name.id = id;
3351 p->v.Name.ctx = ctx;
3352 p->lineno = lineno;
3353 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003354 p->end_lineno = end_lineno;
3355 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003356 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357}
3358
3359expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003360List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
3361 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003363 expr_ty p;
3364 if (!ctx) {
3365 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003366 "field 'ctx' is required for List");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003367 return NULL;
3368 }
3369 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3370 if (!p)
3371 return NULL;
3372 p->kind = List_kind;
3373 p->v.List.elts = elts;
3374 p->v.List.ctx = ctx;
3375 p->lineno = lineno;
3376 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003377 p->end_lineno = end_lineno;
3378 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003379 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380}
3381
3382expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003383Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
3384 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003385{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003386 expr_ty p;
3387 if (!ctx) {
3388 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003389 "field 'ctx' is required for Tuple");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003390 return NULL;
3391 }
3392 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3393 if (!p)
3394 return NULL;
3395 p->kind = Tuple_kind;
3396 p->v.Tuple.elts = elts;
3397 p->v.Tuple.ctx = ctx;
3398 p->lineno = lineno;
3399 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003400 p->end_lineno = end_lineno;
3401 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003402 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403}
3404
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003405expr_ty
3406Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset,
3407 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003409 expr_ty p;
3410 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003411 if (!p)
3412 return NULL;
3413 p->kind = Slice_kind;
3414 p->v.Slice.lower = lower;
3415 p->v.Slice.upper = upper;
3416 p->v.Slice.step = step;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003417 p->lineno = lineno;
3418 p->col_offset = col_offset;
3419 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
3424comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003425comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
3426 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003428 comprehension_ty p;
3429 if (!target) {
3430 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003431 "field 'target' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003432 return NULL;
3433 }
3434 if (!iter) {
3435 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003436 "field 'iter' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003437 return NULL;
3438 }
3439 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
3440 if (!p)
3441 return NULL;
3442 p->target = target;
3443 p->iter = iter;
3444 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003445 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003446 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447}
3448
3449excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00003450ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003451 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003452{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003453 excepthandler_ty p;
3454 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
3455 if (!p)
3456 return NULL;
3457 p->kind = ExceptHandler_kind;
3458 p->v.ExceptHandler.type = type;
3459 p->v.ExceptHandler.name = name;
3460 p->v.ExceptHandler.body = body;
3461 p->lineno = lineno;
3462 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003463 p->end_lineno = end_lineno;
3464 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003465 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003466}
3467
3468arguments_ty
Pablo Galindocd6e83b2019-07-15 01:32:18 +02003469arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty vararg, asdl_seq *
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003470 kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, asdl_seq *
3471 defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003472{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003473 arguments_ty p;
3474 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
3475 if (!p)
3476 return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003477 p->posonlyargs = posonlyargs;
Pablo Galindocd6e83b2019-07-15 01:32:18 +02003478 p->args = args;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003479 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003480 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003481 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003482 p->kwarg = kwarg;
3483 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003484 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003485}
3486
Neal Norwitzc1505362006-12-28 06:47:50 +00003487arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003488arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
3489 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00003490{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003491 arg_ty p;
3492 if (!arg) {
3493 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003494 "field 'arg' is required for arg");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003495 return NULL;
3496 }
3497 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
3498 if (!p)
3499 return NULL;
3500 p->arg = arg;
3501 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003502 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01003503 p->lineno = lineno;
3504 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003505 p->end_lineno = end_lineno;
3506 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003507 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00003508}
3509
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003510keyword_ty
Pablo Galindo168660b2020-04-02 00:47:39 +01003511keyword(identifier arg, expr_ty value, int lineno, int col_offset, int
3512 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003513{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003514 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003515 if (!value) {
3516 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003517 "field 'value' is required for keyword");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003518 return NULL;
3519 }
3520 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
3521 if (!p)
3522 return NULL;
3523 p->arg = arg;
3524 p->value = value;
Pablo Galindo168660b2020-04-02 00:47:39 +01003525 p->lineno = lineno;
3526 p->col_offset = col_offset;
3527 p->end_lineno = end_lineno;
3528 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003529 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530}
3531
3532alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003533alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003534{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003535 alias_ty p;
3536 if (!name) {
3537 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003538 "field 'name' is required for alias");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003539 return NULL;
3540 }
3541 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
3542 if (!p)
3543 return NULL;
3544 p->name = name;
3545 p->asname = asname;
3546 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547}
3548
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003549withitem_ty
3550withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
3551{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003552 withitem_ty p;
3553 if (!context_expr) {
3554 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003555 "field 'context_expr' is required for withitem");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003556 return NULL;
3557 }
3558 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
3559 if (!p)
3560 return NULL;
3561 p->context_expr = context_expr;
3562 p->optional_vars = optional_vars;
3563 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003564}
3565
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003566type_ignore_ty
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003567TypeIgnore(int lineno, string tag, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003568{
3569 type_ignore_ty p;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003570 if (!tag) {
3571 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003572 "field 'tag' is required for TypeIgnore");
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003573 return NULL;
3574 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003575 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
3576 if (!p)
3577 return NULL;
3578 p->kind = TypeIgnore_kind;
3579 p->v.TypeIgnore.lineno = lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003580 p->v.TypeIgnore.tag = tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003581 return p;
3582}
3583
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003584
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003585PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02003586ast2obj_mod(astmodulestate *state, void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003587{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003588 mod_ty o = (mod_ty)_o;
3589 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003590 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003591 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003592 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003593 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003594 switch (o->kind) {
3595 case Module_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003596 tp = (PyTypeObject *)state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003597 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003598 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003599 value = ast2obj_list(state, o->v.Module.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003600 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003601 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003602 goto failed;
3603 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003604 value = ast2obj_list(state, o->v.Module.type_ignores,
3605 ast2obj_type_ignore);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003606 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003607 if (PyObject_SetAttr(result, state->type_ignores, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003608 goto failed;
3609 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003610 break;
3611 case Interactive_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003612 tp = (PyTypeObject *)state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003613 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003614 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003615 value = ast2obj_list(state, o->v.Interactive.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003616 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003617 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003618 goto failed;
3619 Py_DECREF(value);
3620 break;
3621 case Expression_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003622 tp = (PyTypeObject *)state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003623 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003624 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003625 value = ast2obj_expr(state, o->v.Expression.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003626 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003627 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003628 goto failed;
3629 Py_DECREF(value);
3630 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003631 case FunctionType_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003632 tp = (PyTypeObject *)state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003633 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003634 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003635 value = ast2obj_list(state, o->v.FunctionType.argtypes, ast2obj_expr);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003636 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003637 if (PyObject_SetAttr(result, state->argtypes, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003638 goto failed;
3639 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003640 value = ast2obj_expr(state, o->v.FunctionType.returns);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003641 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003642 if (PyObject_SetAttr(result, state->returns, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003643 goto failed;
3644 Py_DECREF(value);
3645 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003646 }
3647 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003648failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003649 Py_XDECREF(value);
3650 Py_XDECREF(result);
3651 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003652}
3653
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003654PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02003655ast2obj_stmt(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003656{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003657 stmt_ty o = (stmt_ty)_o;
3658 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003659 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003660 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003661 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003662 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003663 switch (o->kind) {
3664 case FunctionDef_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003665 tp = (PyTypeObject *)state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003666 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003667 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003668 value = ast2obj_identifier(state, o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003669 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003670 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003671 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003672 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003673 value = ast2obj_arguments(state, o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003674 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003675 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003676 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003677 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003678 value = ast2obj_list(state, o->v.FunctionDef.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003679 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003680 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003681 goto failed;
3682 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003683 value = ast2obj_list(state, o->v.FunctionDef.decorator_list,
3684 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003685 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003686 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003687 goto failed;
3688 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003689 value = ast2obj_expr(state, o->v.FunctionDef.returns);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003690 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003691 if (PyObject_SetAttr(result, state->returns, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003692 goto failed;
3693 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003694 value = ast2obj_string(state, o->v.FunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003695 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003696 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003697 goto failed;
3698 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003699 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003700 case AsyncFunctionDef_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003701 tp = (PyTypeObject *)state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003702 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003703 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003704 value = ast2obj_identifier(state, o->v.AsyncFunctionDef.name);
Yury Selivanov75445082015-05-11 22:57:16 -04003705 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003706 if (PyObject_SetAttr(result, state->name, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003707 goto failed;
3708 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003709 value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args);
Yury Selivanov75445082015-05-11 22:57:16 -04003710 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003711 if (PyObject_SetAttr(result, state->args, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003712 goto failed;
3713 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003714 value = ast2obj_list(state, o->v.AsyncFunctionDef.body, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003715 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003716 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003717 goto failed;
3718 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003719 value = ast2obj_list(state, o->v.AsyncFunctionDef.decorator_list,
Yury Selivanov75445082015-05-11 22:57:16 -04003720 ast2obj_expr);
3721 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003722 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003723 goto failed;
3724 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003725 value = ast2obj_expr(state, o->v.AsyncFunctionDef.returns);
Yury Selivanov75445082015-05-11 22:57:16 -04003726 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003727 if (PyObject_SetAttr(result, state->returns, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003728 goto failed;
3729 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003730 value = ast2obj_string(state, o->v.AsyncFunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003731 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003732 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003733 goto failed;
3734 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003735 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003736 case ClassDef_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003737 tp = (PyTypeObject *)state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003738 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003739 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003740 value = ast2obj_identifier(state, o->v.ClassDef.name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003741 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003742 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003743 goto failed;
3744 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003745 value = ast2obj_list(state, o->v.ClassDef.bases, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003746 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003747 if (PyObject_SetAttr(result, state->bases, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003748 goto failed;
3749 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003750 value = ast2obj_list(state, o->v.ClassDef.keywords, ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003751 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003752 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003753 goto failed;
3754 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003755 value = ast2obj_list(state, o->v.ClassDef.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003756 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003757 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003758 goto failed;
3759 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003760 value = ast2obj_list(state, o->v.ClassDef.decorator_list, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003761 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003762 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003763 goto failed;
3764 Py_DECREF(value);
3765 break;
3766 case Return_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003767 tp = (PyTypeObject *)state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003768 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003769 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003770 value = ast2obj_expr(state, o->v.Return.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003771 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003772 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003773 goto failed;
3774 Py_DECREF(value);
3775 break;
3776 case Delete_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003777 tp = (PyTypeObject *)state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003778 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003779 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003780 value = ast2obj_list(state, o->v.Delete.targets, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003781 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003782 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003783 goto failed;
3784 Py_DECREF(value);
3785 break;
3786 case Assign_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003787 tp = (PyTypeObject *)state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003788 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003789 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003790 value = ast2obj_list(state, o->v.Assign.targets, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003791 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003792 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003793 goto failed;
3794 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003795 value = ast2obj_expr(state, o->v.Assign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003796 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003797 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003798 goto failed;
3799 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003800 value = ast2obj_string(state, o->v.Assign.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003801 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003802 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003803 goto failed;
3804 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003805 break;
3806 case AugAssign_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003807 tp = (PyTypeObject *)state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003808 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003809 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003810 value = ast2obj_expr(state, o->v.AugAssign.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003811 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003812 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003813 goto failed;
3814 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003815 value = ast2obj_operator(state, o->v.AugAssign.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003816 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003817 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003818 goto failed;
3819 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003820 value = ast2obj_expr(state, o->v.AugAssign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003821 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003822 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003823 goto failed;
3824 Py_DECREF(value);
3825 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003826 case AnnAssign_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003827 tp = (PyTypeObject *)state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003828 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003829 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003830 value = ast2obj_expr(state, o->v.AnnAssign.target);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003831 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003832 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003833 goto failed;
3834 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003835 value = ast2obj_expr(state, o->v.AnnAssign.annotation);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003836 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003837 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003838 goto failed;
3839 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003840 value = ast2obj_expr(state, o->v.AnnAssign.value);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003841 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003842 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003843 goto failed;
3844 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003845 value = ast2obj_int(state, o->v.AnnAssign.simple);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003846 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003847 if (PyObject_SetAttr(result, state->simple, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003848 goto failed;
3849 Py_DECREF(value);
3850 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003851 case For_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003852 tp = (PyTypeObject *)state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003853 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003854 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003855 value = ast2obj_expr(state, o->v.For.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003856 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003857 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003858 goto failed;
3859 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003860 value = ast2obj_expr(state, o->v.For.iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003861 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003862 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003863 goto failed;
3864 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003865 value = ast2obj_list(state, o->v.For.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003866 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003867 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003868 goto failed;
3869 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003870 value = ast2obj_list(state, o->v.For.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003871 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003872 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003873 goto failed;
3874 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003875 value = ast2obj_string(state, o->v.For.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003876 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003877 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003878 goto failed;
3879 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003880 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003881 case AsyncFor_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003882 tp = (PyTypeObject *)state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003883 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003884 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003885 value = ast2obj_expr(state, o->v.AsyncFor.target);
Yury Selivanov75445082015-05-11 22:57:16 -04003886 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003887 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003888 goto failed;
3889 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003890 value = ast2obj_expr(state, o->v.AsyncFor.iter);
Yury Selivanov75445082015-05-11 22:57:16 -04003891 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003892 if (PyObject_SetAttr(result, state->iter, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003893 goto failed;
3894 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003895 value = ast2obj_list(state, o->v.AsyncFor.body, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003896 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003897 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003898 goto failed;
3899 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003900 value = ast2obj_list(state, o->v.AsyncFor.orelse, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003901 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003902 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003903 goto failed;
3904 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003905 value = ast2obj_string(state, o->v.AsyncFor.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003906 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003907 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003908 goto failed;
3909 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003910 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003911 case While_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003912 tp = (PyTypeObject *)state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003913 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003914 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003915 value = ast2obj_expr(state, o->v.While.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003916 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003917 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003918 goto failed;
3919 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003920 value = ast2obj_list(state, o->v.While.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003921 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003922 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003923 goto failed;
3924 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003925 value = ast2obj_list(state, o->v.While.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003926 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003927 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003928 goto failed;
3929 Py_DECREF(value);
3930 break;
3931 case If_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003932 tp = (PyTypeObject *)state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003933 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003934 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003935 value = ast2obj_expr(state, o->v.If.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003936 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003937 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003938 goto failed;
3939 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003940 value = ast2obj_list(state, o->v.If.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003941 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003942 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003943 goto failed;
3944 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003945 value = ast2obj_list(state, o->v.If.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003946 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003947 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 goto failed;
3949 Py_DECREF(value);
3950 break;
3951 case With_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003952 tp = (PyTypeObject *)state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003953 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003954 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003955 value = ast2obj_list(state, o->v.With.items, ast2obj_withitem);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003956 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003957 if (PyObject_SetAttr(result, state->items, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003958 goto failed;
3959 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003960 value = ast2obj_list(state, o->v.With.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003961 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003962 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003963 goto failed;
3964 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003965 value = ast2obj_string(state, o->v.With.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003966 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003967 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003968 goto failed;
3969 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003970 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003971 case AsyncWith_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003972 tp = (PyTypeObject *)state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003973 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003974 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003975 value = ast2obj_list(state, o->v.AsyncWith.items, ast2obj_withitem);
Yury Selivanov75445082015-05-11 22:57:16 -04003976 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003977 if (PyObject_SetAttr(result, state->items, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003978 goto failed;
3979 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003980 value = ast2obj_list(state, o->v.AsyncWith.body, ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003981 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003982 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003983 goto failed;
3984 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02003985 value = ast2obj_string(state, o->v.AsyncWith.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003986 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003987 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003988 goto failed;
3989 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003990 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003991 case Raise_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02003992 tp = (PyTypeObject *)state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003993 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003994 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003995 value = ast2obj_expr(state, o->v.Raise.exc);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003996 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02003997 if (PyObject_SetAttr(result, state->exc, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003998 goto failed;
3999 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004000 value = ast2obj_expr(state, o->v.Raise.cause);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004001 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004002 if (PyObject_SetAttr(result, state->cause, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004003 goto failed;
4004 Py_DECREF(value);
4005 break;
4006 case Try_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004007 tp = (PyTypeObject *)state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004008 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004009 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004010 value = ast2obj_list(state, o->v.Try.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004011 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004012 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004013 goto failed;
4014 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004015 value = ast2obj_list(state, o->v.Try.handlers, ast2obj_excepthandler);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004016 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004017 if (PyObject_SetAttr(result, state->handlers, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004018 goto failed;
4019 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004020 value = ast2obj_list(state, o->v.Try.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004021 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004022 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004023 goto failed;
4024 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004025 value = ast2obj_list(state, o->v.Try.finalbody, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004026 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004027 if (PyObject_SetAttr(result, state->finalbody, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004028 goto failed;
4029 Py_DECREF(value);
4030 break;
4031 case Assert_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004032 tp = (PyTypeObject *)state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004033 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004034 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004035 value = ast2obj_expr(state, o->v.Assert.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004036 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004037 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004038 goto failed;
4039 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004040 value = ast2obj_expr(state, o->v.Assert.msg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004041 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004042 if (PyObject_SetAttr(result, state->msg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004043 goto failed;
4044 Py_DECREF(value);
4045 break;
4046 case Import_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004047 tp = (PyTypeObject *)state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004048 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004049 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004050 value = ast2obj_list(state, o->v.Import.names, ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004051 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004052 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004053 goto failed;
4054 Py_DECREF(value);
4055 break;
4056 case ImportFrom_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004057 tp = (PyTypeObject *)state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004058 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004059 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004060 value = ast2obj_identifier(state, o->v.ImportFrom.module);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004061 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004062 if (PyObject_SetAttr(result, state->module, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004063 goto failed;
4064 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004065 value = ast2obj_list(state, o->v.ImportFrom.names, ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004066 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004067 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004068 goto failed;
4069 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004070 value = ast2obj_int(state, o->v.ImportFrom.level);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004071 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004072 if (PyObject_SetAttr(result, state->level, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004073 goto failed;
4074 Py_DECREF(value);
4075 break;
4076 case Global_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004077 tp = (PyTypeObject *)state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004078 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004079 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004080 value = ast2obj_list(state, o->v.Global.names, ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004081 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004082 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004083 goto failed;
4084 Py_DECREF(value);
4085 break;
4086 case Nonlocal_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004087 tp = (PyTypeObject *)state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004088 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004089 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004090 value = ast2obj_list(state, o->v.Nonlocal.names, ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004091 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004092 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004093 goto failed;
4094 Py_DECREF(value);
4095 break;
4096 case Expr_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004097 tp = (PyTypeObject *)state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004098 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004099 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004100 value = ast2obj_expr(state, o->v.Expr.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004101 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004102 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004103 goto failed;
4104 Py_DECREF(value);
4105 break;
4106 case Pass_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004107 tp = (PyTypeObject *)state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004108 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004109 if (!result) goto failed;
4110 break;
4111 case Break_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004112 tp = (PyTypeObject *)state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004113 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004114 if (!result) goto failed;
4115 break;
4116 case Continue_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004117 tp = (PyTypeObject *)state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004118 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004119 if (!result) goto failed;
4120 break;
4121 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004122 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004123 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004124 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004125 goto failed;
4126 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004127 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004128 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004129 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004130 goto failed;
4131 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004132 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004133 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004134 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004135 goto failed;
4136 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004137 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004138 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004139 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004140 goto failed;
4141 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004142 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004143failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004144 Py_XDECREF(value);
4145 Py_XDECREF(result);
4146 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004147}
4148
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004149PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004150ast2obj_expr(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004151{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004152 expr_ty o = (expr_ty)_o;
4153 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004154 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004155 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004156 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004157 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004158 switch (o->kind) {
4159 case BoolOp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004160 tp = (PyTypeObject *)state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004161 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004162 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004163 value = ast2obj_boolop(state, o->v.BoolOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004164 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004165 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004166 goto failed;
4167 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004168 value = ast2obj_list(state, o->v.BoolOp.values, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004169 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004170 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004171 goto failed;
4172 Py_DECREF(value);
4173 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004174 case NamedExpr_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004175 tp = (PyTypeObject *)state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004176 result = PyType_GenericNew(tp, NULL, NULL);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004177 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004178 value = ast2obj_expr(state, o->v.NamedExpr.target);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004179 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004180 if (PyObject_SetAttr(result, state->target, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004181 goto failed;
4182 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004183 value = ast2obj_expr(state, o->v.NamedExpr.value);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004184 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004185 if (PyObject_SetAttr(result, state->value, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004186 goto failed;
4187 Py_DECREF(value);
4188 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004189 case BinOp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004190 tp = (PyTypeObject *)state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004191 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004192 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004193 value = ast2obj_expr(state, o->v.BinOp.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004194 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004195 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004196 goto failed;
4197 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004198 value = ast2obj_operator(state, o->v.BinOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004199 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004200 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004201 goto failed;
4202 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004203 value = ast2obj_expr(state, o->v.BinOp.right);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004204 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004205 if (PyObject_SetAttr(result, state->right, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004206 goto failed;
4207 Py_DECREF(value);
4208 break;
4209 case UnaryOp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004210 tp = (PyTypeObject *)state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004211 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004212 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004213 value = ast2obj_unaryop(state, o->v.UnaryOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004214 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004215 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004216 goto failed;
4217 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004218 value = ast2obj_expr(state, o->v.UnaryOp.operand);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004219 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004220 if (PyObject_SetAttr(result, state->operand, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004221 goto failed;
4222 Py_DECREF(value);
4223 break;
4224 case Lambda_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004225 tp = (PyTypeObject *)state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004226 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004227 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004228 value = ast2obj_arguments(state, o->v.Lambda.args);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004229 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004230 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004231 goto failed;
4232 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004233 value = ast2obj_expr(state, o->v.Lambda.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004234 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004235 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004236 goto failed;
4237 Py_DECREF(value);
4238 break;
4239 case IfExp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004240 tp = (PyTypeObject *)state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004241 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004242 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004243 value = ast2obj_expr(state, o->v.IfExp.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004244 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004245 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004246 goto failed;
4247 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004248 value = ast2obj_expr(state, o->v.IfExp.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004249 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004250 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004251 goto failed;
4252 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004253 value = ast2obj_expr(state, o->v.IfExp.orelse);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004254 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004255 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004256 goto failed;
4257 Py_DECREF(value);
4258 break;
4259 case Dict_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004260 tp = (PyTypeObject *)state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004261 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004262 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004263 value = ast2obj_list(state, o->v.Dict.keys, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004264 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004265 if (PyObject_SetAttr(result, state->keys, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004266 goto failed;
4267 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004268 value = ast2obj_list(state, o->v.Dict.values, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004269 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004270 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004271 goto failed;
4272 Py_DECREF(value);
4273 break;
4274 case Set_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004275 tp = (PyTypeObject *)state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004276 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004277 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004278 value = ast2obj_list(state, o->v.Set.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004279 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004280 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004281 goto failed;
4282 Py_DECREF(value);
4283 break;
4284 case ListComp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004285 tp = (PyTypeObject *)state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004286 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004287 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004288 value = ast2obj_expr(state, o->v.ListComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004289 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004290 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004291 goto failed;
4292 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004293 value = ast2obj_list(state, o->v.ListComp.generators,
4294 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004295 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004296 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004297 goto failed;
4298 Py_DECREF(value);
4299 break;
4300 case SetComp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004301 tp = (PyTypeObject *)state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004302 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004303 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004304 value = ast2obj_expr(state, o->v.SetComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004305 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004306 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004307 goto failed;
4308 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004309 value = ast2obj_list(state, o->v.SetComp.generators,
4310 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004311 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004312 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004313 goto failed;
4314 Py_DECREF(value);
4315 break;
4316 case DictComp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004317 tp = (PyTypeObject *)state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004318 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004319 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004320 value = ast2obj_expr(state, o->v.DictComp.key);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004321 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004322 if (PyObject_SetAttr(result, state->key, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004323 goto failed;
4324 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004325 value = ast2obj_expr(state, o->v.DictComp.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004326 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004327 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004328 goto failed;
4329 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004330 value = ast2obj_list(state, o->v.DictComp.generators,
4331 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004332 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004333 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004334 goto failed;
4335 Py_DECREF(value);
4336 break;
4337 case GeneratorExp_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004338 tp = (PyTypeObject *)state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004339 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004340 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004341 value = ast2obj_expr(state, o->v.GeneratorExp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004342 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004343 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004344 goto failed;
4345 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004346 value = ast2obj_list(state, o->v.GeneratorExp.generators,
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004347 ast2obj_comprehension);
4348 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004349 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004350 goto failed;
4351 Py_DECREF(value);
4352 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004353 case Await_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004354 tp = (PyTypeObject *)state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004355 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04004356 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004357 value = ast2obj_expr(state, o->v.Await.value);
Yury Selivanov75445082015-05-11 22:57:16 -04004358 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004359 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04004360 goto failed;
4361 Py_DECREF(value);
4362 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004363 case Yield_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004364 tp = (PyTypeObject *)state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004365 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004366 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004367 value = ast2obj_expr(state, o->v.Yield.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004368 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004369 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004370 goto failed;
4371 Py_DECREF(value);
4372 break;
4373 case YieldFrom_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004374 tp = (PyTypeObject *)state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004375 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004376 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004377 value = ast2obj_expr(state, o->v.YieldFrom.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004378 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004379 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004380 goto failed;
4381 Py_DECREF(value);
4382 break;
4383 case Compare_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004384 tp = (PyTypeObject *)state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004385 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004386 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004387 value = ast2obj_expr(state, o->v.Compare.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004388 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004389 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004390 goto failed;
4391 Py_DECREF(value);
4392 {
4393 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
4394 value = PyList_New(n);
4395 if (!value) goto failed;
4396 for(i = 0; i < n; i++)
Victor Stinnerf8599272020-07-03 16:57:19 +02004397 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 +00004398 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00004399 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004400 if (PyObject_SetAttr(result, state->ops, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004401 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004402 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004403 value = ast2obj_list(state, o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00004404 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004405 if (PyObject_SetAttr(result, state->comparators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004406 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004407 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004408 break;
4409 case Call_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004410 tp = (PyTypeObject *)state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004411 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004412 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004413 value = ast2obj_expr(state, o->v.Call.func);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004414 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004415 if (PyObject_SetAttr(result, state->func, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004416 goto failed;
4417 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004418 value = ast2obj_list(state, o->v.Call.args, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004419 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004420 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004421 goto failed;
4422 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004423 value = ast2obj_list(state, o->v.Call.keywords, ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004424 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004425 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004426 goto failed;
4427 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004428 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004429 case FormattedValue_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004430 tp = (PyTypeObject *)state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004431 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004432 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004433 value = ast2obj_expr(state, o->v.FormattedValue.value);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004434 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004435 if (PyObject_SetAttr(result, state->value, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004436 goto failed;
4437 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004438 value = ast2obj_int(state, o->v.FormattedValue.conversion);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004439 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004440 if (PyObject_SetAttr(result, state->conversion, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004441 goto failed;
4442 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004443 value = ast2obj_expr(state, o->v.FormattedValue.format_spec);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004444 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004445 if (PyObject_SetAttr(result, state->format_spec, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004446 goto failed;
4447 Py_DECREF(value);
4448 break;
4449 case JoinedStr_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004450 tp = (PyTypeObject *)state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004451 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004452 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004453 value = ast2obj_list(state, o->v.JoinedStr.values, ast2obj_expr);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004454 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004455 if (PyObject_SetAttr(result, state->values, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004456 goto failed;
4457 Py_DECREF(value);
4458 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004459 case Constant_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004460 tp = (PyTypeObject *)state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004461 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004462 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004463 value = ast2obj_constant(state, o->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004464 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004465 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004466 goto failed;
4467 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004468 value = ast2obj_string(state, o->v.Constant.kind);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004469 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004470 if (PyObject_SetAttr(result, state->kind, value) == -1)
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004471 goto failed;
4472 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004473 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004474 case Attribute_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004475 tp = (PyTypeObject *)state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004476 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004477 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004478 value = ast2obj_expr(state, o->v.Attribute.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004479 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004480 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004481 goto failed;
4482 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004483 value = ast2obj_identifier(state, o->v.Attribute.attr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004484 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004485 if (PyObject_SetAttr(result, state->attr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004486 goto failed;
4487 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004488 value = ast2obj_expr_context(state, o->v.Attribute.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004489 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004490 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004491 goto failed;
4492 Py_DECREF(value);
4493 break;
4494 case Subscript_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004495 tp = (PyTypeObject *)state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004496 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004497 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004498 value = ast2obj_expr(state, o->v.Subscript.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004499 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004500 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004501 goto failed;
4502 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004503 value = ast2obj_expr(state, o->v.Subscript.slice);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004504 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004505 if (PyObject_SetAttr(result, state->slice, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004506 goto failed;
4507 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004508 value = ast2obj_expr_context(state, o->v.Subscript.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004509 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004510 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004511 goto failed;
4512 Py_DECREF(value);
4513 break;
4514 case Starred_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004515 tp = (PyTypeObject *)state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004516 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004517 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004518 value = ast2obj_expr(state, o->v.Starred.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004519 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004520 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004521 goto failed;
4522 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004523 value = ast2obj_expr_context(state, o->v.Starred.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004524 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004525 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004526 goto failed;
4527 Py_DECREF(value);
4528 break;
4529 case Name_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004530 tp = (PyTypeObject *)state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004531 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004532 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004533 value = ast2obj_identifier(state, o->v.Name.id);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004534 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004535 if (PyObject_SetAttr(result, state->id, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004536 goto failed;
4537 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004538 value = ast2obj_expr_context(state, o->v.Name.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004539 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004540 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004541 goto failed;
4542 Py_DECREF(value);
4543 break;
4544 case List_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004545 tp = (PyTypeObject *)state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004546 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004547 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004548 value = ast2obj_list(state, o->v.List.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004549 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004550 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004551 goto failed;
4552 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004553 value = ast2obj_expr_context(state, o->v.List.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004554 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004555 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004556 goto failed;
4557 Py_DECREF(value);
4558 break;
4559 case Tuple_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004560 tp = (PyTypeObject *)state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004561 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004562 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004563 value = ast2obj_list(state, o->v.Tuple.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004564 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004565 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004566 goto failed;
4567 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004568 value = ast2obj_expr_context(state, o->v.Tuple.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004569 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004570 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004571 goto failed;
4572 Py_DECREF(value);
4573 break;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004574 case Slice_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004575 tp = (PyTypeObject *)state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004576 result = PyType_GenericNew(tp, NULL, NULL);
4577 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004578 value = ast2obj_expr(state, o->v.Slice.lower);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004579 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004580 if (PyObject_SetAttr(result, state->lower, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004581 goto failed;
4582 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004583 value = ast2obj_expr(state, o->v.Slice.upper);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004584 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004585 if (PyObject_SetAttr(result, state->upper, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004586 goto failed;
4587 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004588 value = ast2obj_expr(state, o->v.Slice.step);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004589 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004590 if (PyObject_SetAttr(result, state->step, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004591 goto failed;
4592 Py_DECREF(value);
4593 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004594 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004595 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004596 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004597 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004598 goto failed;
4599 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004600 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004601 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004602 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004603 goto failed;
4604 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004605 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004606 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004607 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004608 goto failed;
4609 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004610 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004611 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004612 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004613 goto failed;
4614 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004615 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004616failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004617 Py_XDECREF(value);
4618 Py_XDECREF(result);
4619 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004620}
4621
Victor Stinnerf8599272020-07-03 16:57:19 +02004622PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004623{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004624 switch(o) {
4625 case Load:
Victor Stinnerf8599272020-07-03 16:57:19 +02004626 Py_INCREF(state->Load_singleton);
4627 return state->Load_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004628 case Store:
Victor Stinnerf8599272020-07-03 16:57:19 +02004629 Py_INCREF(state->Store_singleton);
4630 return state->Store_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004631 case Del:
Victor Stinnerf8599272020-07-03 16:57:19 +02004632 Py_INCREF(state->Del_singleton);
4633 return state->Del_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004634 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004635 Py_UNREACHABLE();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004636}
Victor Stinnerf8599272020-07-03 16:57:19 +02004637PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004638{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004639 switch(o) {
4640 case And:
Victor Stinnerf8599272020-07-03 16:57:19 +02004641 Py_INCREF(state->And_singleton);
4642 return state->And_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004643 case Or:
Victor Stinnerf8599272020-07-03 16:57:19 +02004644 Py_INCREF(state->Or_singleton);
4645 return state->Or_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004646 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004647 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004648}
Victor Stinnerf8599272020-07-03 16:57:19 +02004649PyObject* ast2obj_operator(astmodulestate *state, operator_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004650{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004651 switch(o) {
4652 case Add:
Victor Stinnerf8599272020-07-03 16:57:19 +02004653 Py_INCREF(state->Add_singleton);
4654 return state->Add_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004655 case Sub:
Victor Stinnerf8599272020-07-03 16:57:19 +02004656 Py_INCREF(state->Sub_singleton);
4657 return state->Sub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004658 case Mult:
Victor Stinnerf8599272020-07-03 16:57:19 +02004659 Py_INCREF(state->Mult_singleton);
4660 return state->Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04004661 case MatMult:
Victor Stinnerf8599272020-07-03 16:57:19 +02004662 Py_INCREF(state->MatMult_singleton);
4663 return state->MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004664 case Div:
Victor Stinnerf8599272020-07-03 16:57:19 +02004665 Py_INCREF(state->Div_singleton);
4666 return state->Div_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004667 case Mod:
Victor Stinnerf8599272020-07-03 16:57:19 +02004668 Py_INCREF(state->Mod_singleton);
4669 return state->Mod_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004670 case Pow:
Victor Stinnerf8599272020-07-03 16:57:19 +02004671 Py_INCREF(state->Pow_singleton);
4672 return state->Pow_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004673 case LShift:
Victor Stinnerf8599272020-07-03 16:57:19 +02004674 Py_INCREF(state->LShift_singleton);
4675 return state->LShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004676 case RShift:
Victor Stinnerf8599272020-07-03 16:57:19 +02004677 Py_INCREF(state->RShift_singleton);
4678 return state->RShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004679 case BitOr:
Victor Stinnerf8599272020-07-03 16:57:19 +02004680 Py_INCREF(state->BitOr_singleton);
4681 return state->BitOr_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004682 case BitXor:
Victor Stinnerf8599272020-07-03 16:57:19 +02004683 Py_INCREF(state->BitXor_singleton);
4684 return state->BitXor_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004685 case BitAnd:
Victor Stinnerf8599272020-07-03 16:57:19 +02004686 Py_INCREF(state->BitAnd_singleton);
4687 return state->BitAnd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004688 case FloorDiv:
Victor Stinnerf8599272020-07-03 16:57:19 +02004689 Py_INCREF(state->FloorDiv_singleton);
4690 return state->FloorDiv_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004691 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004692 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004693}
Victor Stinnerf8599272020-07-03 16:57:19 +02004694PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004695{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004696 switch(o) {
4697 case Invert:
Victor Stinnerf8599272020-07-03 16:57:19 +02004698 Py_INCREF(state->Invert_singleton);
4699 return state->Invert_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004700 case Not:
Victor Stinnerf8599272020-07-03 16:57:19 +02004701 Py_INCREF(state->Not_singleton);
4702 return state->Not_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004703 case UAdd:
Victor Stinnerf8599272020-07-03 16:57:19 +02004704 Py_INCREF(state->UAdd_singleton);
4705 return state->UAdd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004706 case USub:
Victor Stinnerf8599272020-07-03 16:57:19 +02004707 Py_INCREF(state->USub_singleton);
4708 return state->USub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004709 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004710 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004711}
Victor Stinnerf8599272020-07-03 16:57:19 +02004712PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004713{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004714 switch(o) {
4715 case Eq:
Victor Stinnerf8599272020-07-03 16:57:19 +02004716 Py_INCREF(state->Eq_singleton);
4717 return state->Eq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004718 case NotEq:
Victor Stinnerf8599272020-07-03 16:57:19 +02004719 Py_INCREF(state->NotEq_singleton);
4720 return state->NotEq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004721 case Lt:
Victor Stinnerf8599272020-07-03 16:57:19 +02004722 Py_INCREF(state->Lt_singleton);
4723 return state->Lt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004724 case LtE:
Victor Stinnerf8599272020-07-03 16:57:19 +02004725 Py_INCREF(state->LtE_singleton);
4726 return state->LtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004727 case Gt:
Victor Stinnerf8599272020-07-03 16:57:19 +02004728 Py_INCREF(state->Gt_singleton);
4729 return state->Gt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004730 case GtE:
Victor Stinnerf8599272020-07-03 16:57:19 +02004731 Py_INCREF(state->GtE_singleton);
4732 return state->GtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004733 case Is:
Victor Stinnerf8599272020-07-03 16:57:19 +02004734 Py_INCREF(state->Is_singleton);
4735 return state->Is_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004736 case IsNot:
Victor Stinnerf8599272020-07-03 16:57:19 +02004737 Py_INCREF(state->IsNot_singleton);
4738 return state->IsNot_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004739 case In:
Victor Stinnerf8599272020-07-03 16:57:19 +02004740 Py_INCREF(state->In_singleton);
4741 return state->In_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004742 case NotIn:
Victor Stinnerf8599272020-07-03 16:57:19 +02004743 Py_INCREF(state->NotIn_singleton);
4744 return state->NotIn_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004745 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004746 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004747}
4748PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004749ast2obj_comprehension(astmodulestate *state, void* _o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004750{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004751 comprehension_ty o = (comprehension_ty)_o;
4752 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004753 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004754 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004755 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004756 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004757 tp = (PyTypeObject *)state->comprehension_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004758 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004759 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004760 value = ast2obj_expr(state, o->target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004761 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004762 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004763 goto failed;
4764 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004765 value = ast2obj_expr(state, o->iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004766 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004767 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004768 goto failed;
4769 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004770 value = ast2obj_list(state, o->ifs, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004771 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004772 if (PyObject_SetAttr(result, state->ifs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 goto failed;
4774 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004775 value = ast2obj_int(state, o->is_async);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004776 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004777 if (PyObject_SetAttr(result, state->is_async, value) == -1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004778 goto failed;
4779 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004780 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004781failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004782 Py_XDECREF(value);
4783 Py_XDECREF(result);
4784 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004785}
4786
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004787PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004788ast2obj_excepthandler(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004789{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004790 excepthandler_ty o = (excepthandler_ty)_o;
4791 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004792 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004793 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004794 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004795 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004796 switch (o->kind) {
4797 case ExceptHandler_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02004798 tp = (PyTypeObject *)state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004799 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004800 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004801 value = ast2obj_expr(state, o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004802 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004803 if (PyObject_SetAttr(result, state->type, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004804 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004805 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004806 value = ast2obj_identifier(state, o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004807 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004808 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004809 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004810 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004811 value = ast2obj_list(state, o->v.ExceptHandler.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004812 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004813 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004814 goto failed;
4815 Py_DECREF(value);
4816 break;
4817 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004818 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004819 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004820 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004821 goto failed;
4822 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004823 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004824 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004825 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004826 goto failed;
4827 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004828 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004829 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004830 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004831 goto failed;
4832 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004833 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004834 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004835 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004836 goto failed;
4837 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004838 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004839failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004840 Py_XDECREF(value);
4841 Py_XDECREF(result);
4842 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004843}
4844
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004845PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004846ast2obj_arguments(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004847{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004848 arguments_ty o = (arguments_ty)_o;
4849 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004850 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004851 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004852 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004853 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004854 tp = (PyTypeObject *)state->arguments_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004855 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004856 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004857 value = ast2obj_list(state, o->posonlyargs, ast2obj_arg);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004858 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004859 if (PyObject_SetAttr(result, state->posonlyargs, value) == -1)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004860 goto failed;
4861 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004862 value = ast2obj_list(state, o->args, ast2obj_arg);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004863 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004864 if (PyObject_SetAttr(result, state->args, value) == -1)
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004865 goto failed;
4866 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004867 value = ast2obj_arg(state, o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004868 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004869 if (PyObject_SetAttr(result, state->vararg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004870 goto failed;
4871 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004872 value = ast2obj_list(state, o->kwonlyargs, ast2obj_arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004873 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004874 if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004875 goto failed;
4876 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004877 value = ast2obj_list(state, o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004878 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004879 if (PyObject_SetAttr(result, state->kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004880 goto failed;
4881 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004882 value = ast2obj_arg(state, o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004883 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004884 if (PyObject_SetAttr(result, state->kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004885 goto failed;
4886 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004887 value = ast2obj_list(state, o->defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004888 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004889 if (PyObject_SetAttr(result, state->defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004890 goto failed;
4891 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004892 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004893failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004894 Py_XDECREF(value);
4895 Py_XDECREF(result);
4896 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004897}
4898
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004899PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004900ast2obj_arg(astmodulestate *state, void* _o)
Neal Norwitzc1505362006-12-28 06:47:50 +00004901{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004902 arg_ty o = (arg_ty)_o;
4903 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004904 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004905 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004906 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004907 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004908 tp = (PyTypeObject *)state->arg_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004909 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004910 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004911 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004912 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004913 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004914 goto failed;
4915 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004916 value = ast2obj_expr(state, o->annotation);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004917 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004918 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004919 goto failed;
4920 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004921 value = ast2obj_string(state, o->type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004922 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004923 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004924 goto failed;
4925 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004926 value = ast2obj_int(state, o->lineno);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004927 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004928 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004929 goto failed;
4930 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004931 value = ast2obj_int(state, o->col_offset);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004932 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004933 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004934 goto failed;
4935 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004936 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004937 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004938 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004939 goto failed;
4940 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004941 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004942 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004943 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004944 goto failed;
4945 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004946 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004947failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004948 Py_XDECREF(value);
4949 Py_XDECREF(result);
4950 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004951}
4952
4953PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02004954ast2obj_keyword(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004955{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004956 keyword_ty o = (keyword_ty)_o;
4957 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004958 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004959 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004960 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004961 }
Victor Stinnerf8599272020-07-03 16:57:19 +02004962 tp = (PyTypeObject *)state->keyword_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004963 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004964 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02004965 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004966 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004967 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004968 goto failed;
4969 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004970 value = ast2obj_expr(state, o->value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004971 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004972 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004973 goto failed;
4974 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004975 value = ast2obj_int(state, o->lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01004976 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004977 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004978 goto failed;
4979 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004980 value = ast2obj_int(state, o->col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01004981 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004982 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004983 goto failed;
4984 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004985 value = ast2obj_int(state, o->end_lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01004986 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004987 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004988 goto failed;
4989 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02004990 value = ast2obj_int(state, o->end_col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01004991 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02004992 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004993 goto failed;
4994 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004995 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004996failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004997 Py_XDECREF(value);
4998 Py_XDECREF(result);
4999 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005000}
5001
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005002PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02005003ast2obj_alias(astmodulestate *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005004{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005005 alias_ty o = (alias_ty)_o;
5006 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005007 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005008 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005009 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005010 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005011 tp = (PyTypeObject *)state->alias_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005012 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005013 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02005014 value = ast2obj_identifier(state, o->name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005015 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005016 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005017 goto failed;
5018 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005019 value = ast2obj_identifier(state, o->asname);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005020 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005021 if (PyObject_SetAttr(result, state->asname, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005022 goto failed;
5023 Py_DECREF(value);
5024 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00005025failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005026 Py_XDECREF(value);
5027 Py_XDECREF(result);
5028 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005029}
5030
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005031PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02005032ast2obj_withitem(astmodulestate *state, void* _o)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005033{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005034 withitem_ty o = (withitem_ty)_o;
5035 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005036 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005037 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005038 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005039 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005040 tp = (PyTypeObject *)state->withitem_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005041 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005042 if (!result) return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +02005043 value = ast2obj_expr(state, o->context_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005044 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005045 if (PyObject_SetAttr(result, state->context_expr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005046 goto failed;
5047 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005048 value = ast2obj_expr(state, o->optional_vars);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005049 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005050 if (PyObject_SetAttr(result, state->optional_vars, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005051 goto failed;
5052 Py_DECREF(value);
5053 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005054failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005055 Py_XDECREF(value);
5056 Py_XDECREF(result);
5057 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005058}
5059
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005060PyObject*
Victor Stinnerf8599272020-07-03 16:57:19 +02005061ast2obj_type_ignore(astmodulestate *state, void* _o)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005062{
5063 type_ignore_ty o = (type_ignore_ty)_o;
5064 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005065 PyTypeObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005066 if (!o) {
5067 Py_RETURN_NONE;
5068 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005069 switch (o->kind) {
5070 case TypeIgnore_kind:
Victor Stinnerf8599272020-07-03 16:57:19 +02005071 tp = (PyTypeObject *)state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005072 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005073 if (!result) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005074 value = ast2obj_int(state, o->v.TypeIgnore.lineno);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005075 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005076 if (PyObject_SetAttr(result, state->lineno, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005077 goto failed;
5078 Py_DECREF(value);
Victor Stinnerf8599272020-07-03 16:57:19 +02005079 value = ast2obj_string(state, o->v.TypeIgnore.tag);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07005080 if (!value) goto failed;
Victor Stinnerf8599272020-07-03 16:57:19 +02005081 if (PyObject_SetAttr(result, state->tag, value) == -1)
Michael J. Sullivan933e1502019-05-22 07:54:20 -07005082 goto failed;
5083 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005084 break;
5085 }
5086 return result;
5087failed:
5088 Py_XDECREF(value);
5089 Py_XDECREF(result);
5090 return NULL;
5091}
5092
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005093
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005094int
Victor Stinnerf8599272020-07-03 16:57:19 +02005095obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005096{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005097 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005098
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005099 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005100 PyObject *tp;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005101
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005102 if (obj == Py_None) {
5103 *out = NULL;
5104 return 0;
5105 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005106 tp = state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005107 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005108 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005109 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005110 }
5111 if (isinstance) {
5112 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005113 asdl_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005114
Victor Stinnerf8599272020-07-03 16:57:19 +02005115 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005116 return 1;
5117 }
5118 if (tmp == NULL) {
5119 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
5120 return 1;
5121 }
5122 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005123 int res;
5124 Py_ssize_t len;
5125 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005126 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005127 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 +02005128 goto failed;
5129 }
5130 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005131 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005132 if (body == NULL) goto failed;
5133 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005134 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005135 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5136 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005137 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005138 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005139 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005140 if (len != PyList_GET_SIZE(tmp)) {
5141 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
5142 goto failed;
5143 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005144 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005145 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005146 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005147 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005148 if (_PyObject_LookupAttr(obj, state->type_ignores, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005149 return 1;
5150 }
5151 if (tmp == NULL) {
5152 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
5153 return 1;
5154 }
5155 else {
5156 int res;
5157 Py_ssize_t len;
5158 Py_ssize_t i;
5159 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005160 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 -08005161 goto failed;
5162 }
5163 len = PyList_GET_SIZE(tmp);
5164 type_ignores = _Py_asdl_seq_new(len, arena);
5165 if (type_ignores == NULL) goto failed;
5166 for (i = 0; i < len; i++) {
5167 type_ignore_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005168 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5169 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005170 res = obj2ast_type_ignore(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005171 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005172 if (res != 0) goto failed;
5173 if (len != PyList_GET_SIZE(tmp)) {
5174 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
5175 goto failed;
5176 }
5177 asdl_seq_SET(type_ignores, i, val);
5178 }
5179 Py_CLEAR(tmp);
5180 }
5181 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005182 if (*out == NULL) goto failed;
5183 return 0;
5184 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005185 tp = state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005186 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005187 if (isinstance == -1) {
5188 return 1;
5189 }
5190 if (isinstance) {
5191 asdl_seq* body;
5192
Victor Stinnerf8599272020-07-03 16:57:19 +02005193 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005194 return 1;
5195 }
5196 if (tmp == NULL) {
5197 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
5198 return 1;
5199 }
5200 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005201 int res;
5202 Py_ssize_t len;
5203 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005204 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005205 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 +02005206 goto failed;
5207 }
5208 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005209 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005210 if (body == NULL) goto failed;
5211 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005212 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005213 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5214 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005215 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005216 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005217 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005218 if (len != PyList_GET_SIZE(tmp)) {
5219 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
5220 goto failed;
5221 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005222 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005223 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005224 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005225 }
5226 *out = Interactive(body, arena);
5227 if (*out == NULL) goto failed;
5228 return 0;
5229 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005230 tp = state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005231 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005232 if (isinstance == -1) {
5233 return 1;
5234 }
5235 if (isinstance) {
5236 expr_ty body;
5237
Victor Stinnerf8599272020-07-03 16:57:19 +02005238 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005239 return 1;
5240 }
5241 if (tmp == NULL) {
5242 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
5243 return 1;
5244 }
5245 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005246 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005247 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005248 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005249 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005250 }
5251 *out = Expression(body, arena);
5252 if (*out == NULL) goto failed;
5253 return 0;
5254 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005255 tp = state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005256 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005257 if (isinstance == -1) {
5258 return 1;
5259 }
5260 if (isinstance) {
5261 asdl_seq* argtypes;
5262 expr_ty returns;
5263
Victor Stinnerf8599272020-07-03 16:57:19 +02005264 if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005265 return 1;
5266 }
5267 if (tmp == NULL) {
5268 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
5269 return 1;
5270 }
5271 else {
5272 int res;
5273 Py_ssize_t len;
5274 Py_ssize_t i;
5275 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005276 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 -08005277 goto failed;
5278 }
5279 len = PyList_GET_SIZE(tmp);
5280 argtypes = _Py_asdl_seq_new(len, arena);
5281 if (argtypes == NULL) goto failed;
5282 for (i = 0; i < len; i++) {
5283 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005284 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5285 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005286 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005287 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005288 if (res != 0) goto failed;
5289 if (len != PyList_GET_SIZE(tmp)) {
5290 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
5291 goto failed;
5292 }
5293 asdl_seq_SET(argtypes, i, val);
5294 }
5295 Py_CLEAR(tmp);
5296 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005297 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005298 return 1;
5299 }
5300 if (tmp == NULL) {
5301 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
5302 return 1;
5303 }
5304 else {
5305 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005306 res = obj2ast_expr(state, tmp, &returns, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005307 if (res != 0) goto failed;
5308 Py_CLEAR(tmp);
5309 }
5310 *out = FunctionType(argtypes, returns, arena);
5311 if (*out == NULL) goto failed;
5312 return 0;
5313 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005314
5315 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
5316 failed:
5317 Py_XDECREF(tmp);
5318 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005319}
5320
5321int
Victor Stinnerf8599272020-07-03 16:57:19 +02005322obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005323{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005324 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005325
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005326 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005327 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005328 int lineno;
5329 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005330 int end_lineno;
5331 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005332
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005333 if (obj == Py_None) {
5334 *out = NULL;
5335 return 0;
5336 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005337 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005338 return 1;
5339 }
5340 if (tmp == NULL) {
5341 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
5342 return 1;
5343 }
5344 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005345 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005346 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005347 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005348 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005349 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005350 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005351 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005352 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005353 if (tmp == NULL) {
5354 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
5355 return 1;
5356 }
5357 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005358 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005359 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005360 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005361 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005362 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005363 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005364 return 1;
5365 }
5366 if (tmp == NULL || tmp == Py_None) {
5367 Py_CLEAR(tmp);
5368 end_lineno = 0;
5369 }
5370 else {
5371 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005372 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005373 if (res != 0) goto failed;
5374 Py_CLEAR(tmp);
5375 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005376 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005377 return 1;
5378 }
5379 if (tmp == NULL || tmp == Py_None) {
5380 Py_CLEAR(tmp);
5381 end_col_offset = 0;
5382 }
5383 else {
5384 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005385 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005386 if (res != 0) goto failed;
5387 Py_CLEAR(tmp);
5388 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005389 tp = state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005390 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005391 if (isinstance == -1) {
5392 return 1;
5393 }
5394 if (isinstance) {
5395 identifier name;
5396 arguments_ty args;
5397 asdl_seq* body;
5398 asdl_seq* decorator_list;
5399 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005400 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005401
Victor Stinnerf8599272020-07-03 16:57:19 +02005402 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005403 return 1;
5404 }
5405 if (tmp == NULL) {
5406 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
5407 return 1;
5408 }
5409 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005410 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005411 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005412 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005413 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005414 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005415 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005416 return 1;
5417 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005418 if (tmp == NULL) {
5419 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
5420 return 1;
5421 }
5422 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005423 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005424 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005425 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005426 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005427 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005428 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005429 return 1;
5430 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005431 if (tmp == NULL) {
5432 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
5433 return 1;
5434 }
5435 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005436 int res;
5437 Py_ssize_t len;
5438 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005439 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005440 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 +02005441 goto failed;
5442 }
5443 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005444 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005445 if (body == NULL) goto failed;
5446 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005447 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005448 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5449 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005450 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005451 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005452 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005453 if (len != PyList_GET_SIZE(tmp)) {
5454 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
5455 goto failed;
5456 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005457 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005458 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005459 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005460 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005461 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005462 return 1;
5463 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005464 if (tmp == NULL) {
5465 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
5466 return 1;
5467 }
5468 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005469 int res;
5470 Py_ssize_t len;
5471 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005472 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005473 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 +02005474 goto failed;
5475 }
5476 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005477 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005478 if (decorator_list == NULL) goto failed;
5479 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005480 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005481 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5482 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005483 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005484 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005485 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005486 if (len != PyList_GET_SIZE(tmp)) {
5487 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
5488 goto failed;
5489 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005490 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005491 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005492 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005493 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005494 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005495 return 1;
5496 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005497 if (tmp == NULL || tmp == Py_None) {
5498 Py_CLEAR(tmp);
5499 returns = NULL;
5500 }
5501 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005502 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005503 res = obj2ast_expr(state, tmp, &returns, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005504 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005505 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005506 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005507 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005508 return 1;
5509 }
5510 if (tmp == NULL || tmp == Py_None) {
5511 Py_CLEAR(tmp);
5512 type_comment = NULL;
5513 }
5514 else {
5515 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005516 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005517 if (res != 0) goto failed;
5518 Py_CLEAR(tmp);
5519 }
5520 *out = FunctionDef(name, args, body, decorator_list, returns,
5521 type_comment, lineno, col_offset, end_lineno,
5522 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005523 if (*out == NULL) goto failed;
5524 return 0;
5525 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005526 tp = state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005527 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04005528 if (isinstance == -1) {
5529 return 1;
5530 }
5531 if (isinstance) {
5532 identifier name;
5533 arguments_ty args;
5534 asdl_seq* body;
5535 asdl_seq* decorator_list;
5536 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005537 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005538
Victor Stinnerf8599272020-07-03 16:57:19 +02005539 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005540 return 1;
5541 }
5542 if (tmp == NULL) {
5543 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
5544 return 1;
5545 }
5546 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005547 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005548 res = obj2ast_identifier(state, tmp, &name, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005549 if (res != 0) goto failed;
5550 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005551 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005552 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005553 return 1;
5554 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005555 if (tmp == NULL) {
5556 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
5557 return 1;
5558 }
5559 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005560 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005561 res = obj2ast_arguments(state, tmp, &args, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005562 if (res != 0) goto failed;
5563 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005564 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005565 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005566 return 1;
5567 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005568 if (tmp == NULL) {
5569 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
5570 return 1;
5571 }
5572 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005573 int res;
5574 Py_ssize_t len;
5575 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005576 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005577 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 -04005578 goto failed;
5579 }
5580 len = PyList_GET_SIZE(tmp);
5581 body = _Py_asdl_seq_new(len, arena);
5582 if (body == NULL) goto failed;
5583 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005584 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005585 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5586 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005587 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005588 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005589 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005590 if (len != PyList_GET_SIZE(tmp)) {
5591 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
5592 goto failed;
5593 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005594 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005595 }
5596 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005597 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005598 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005599 return 1;
5600 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005601 if (tmp == NULL) {
5602 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
5603 return 1;
5604 }
5605 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005606 int res;
5607 Py_ssize_t len;
5608 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005609 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005610 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 -04005611 goto failed;
5612 }
5613 len = PyList_GET_SIZE(tmp);
5614 decorator_list = _Py_asdl_seq_new(len, arena);
5615 if (decorator_list == NULL) goto failed;
5616 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005617 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005618 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5619 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005620 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005621 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005622 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005623 if (len != PyList_GET_SIZE(tmp)) {
5624 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
5625 goto failed;
5626 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005627 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005628 }
5629 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005630 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005631 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005632 return 1;
5633 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005634 if (tmp == NULL || tmp == Py_None) {
5635 Py_CLEAR(tmp);
5636 returns = NULL;
5637 }
5638 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005639 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005640 res = obj2ast_expr(state, tmp, &returns, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005641 if (res != 0) goto failed;
5642 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005643 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005644 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005645 return 1;
5646 }
5647 if (tmp == NULL || tmp == Py_None) {
5648 Py_CLEAR(tmp);
5649 type_comment = NULL;
5650 }
5651 else {
5652 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005653 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005654 if (res != 0) goto failed;
5655 Py_CLEAR(tmp);
5656 }
Yury Selivanov75445082015-05-11 22:57:16 -04005657 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005658 type_comment, lineno, col_offset, end_lineno,
5659 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005660 if (*out == NULL) goto failed;
5661 return 0;
5662 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005663 tp = state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005664 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005665 if (isinstance == -1) {
5666 return 1;
5667 }
5668 if (isinstance) {
5669 identifier name;
5670 asdl_seq* bases;
5671 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005672 asdl_seq* body;
5673 asdl_seq* decorator_list;
5674
Victor Stinnerf8599272020-07-03 16:57:19 +02005675 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005676 return 1;
5677 }
5678 if (tmp == NULL) {
5679 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
5680 return 1;
5681 }
5682 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005683 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005684 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005685 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005686 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005687 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005688 if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005689 return 1;
5690 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005691 if (tmp == NULL) {
5692 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
5693 return 1;
5694 }
5695 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005696 int res;
5697 Py_ssize_t len;
5698 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005699 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005700 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 +02005701 goto failed;
5702 }
5703 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005704 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005705 if (bases == NULL) goto failed;
5706 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005707 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005708 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5709 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005710 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005711 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005712 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005713 if (len != PyList_GET_SIZE(tmp)) {
5714 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
5715 goto failed;
5716 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005717 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005718 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005719 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005720 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005721 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005722 return 1;
5723 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005724 if (tmp == NULL) {
5725 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
5726 return 1;
5727 }
5728 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005729 int res;
5730 Py_ssize_t len;
5731 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005732 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005733 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 +02005734 goto failed;
5735 }
5736 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005737 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005738 if (keywords == NULL) goto failed;
5739 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005740 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005741 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5742 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005743 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005744 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005745 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005746 if (len != PyList_GET_SIZE(tmp)) {
5747 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
5748 goto failed;
5749 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005750 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005751 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005752 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005753 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005754 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005755 return 1;
5756 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005757 if (tmp == NULL) {
5758 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
5759 return 1;
5760 }
5761 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005762 int res;
5763 Py_ssize_t len;
5764 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005765 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005766 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 +02005767 goto failed;
5768 }
5769 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005770 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005771 if (body == NULL) goto failed;
5772 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005773 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005774 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5775 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005776 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005777 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005778 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005779 if (len != PyList_GET_SIZE(tmp)) {
5780 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
5781 goto failed;
5782 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005783 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005784 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005785 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005786 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005787 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005788 return 1;
5789 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005790 if (tmp == NULL) {
5791 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
5792 return 1;
5793 }
5794 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005795 int res;
5796 Py_ssize_t len;
5797 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005798 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005799 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 +02005800 goto failed;
5801 }
5802 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005803 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005804 if (decorator_list == NULL) goto failed;
5805 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005806 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005807 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5808 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005809 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005810 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005811 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005812 if (len != PyList_GET_SIZE(tmp)) {
5813 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
5814 goto failed;
5815 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005816 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005817 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005818 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005819 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03005820 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005821 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005822 if (*out == NULL) goto failed;
5823 return 0;
5824 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005825 tp = state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005826 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005827 if (isinstance == -1) {
5828 return 1;
5829 }
5830 if (isinstance) {
5831 expr_ty value;
5832
Victor Stinnerf8599272020-07-03 16:57:19 +02005833 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005834 return 1;
5835 }
5836 if (tmp == NULL || tmp == Py_None) {
5837 Py_CLEAR(tmp);
5838 value = NULL;
5839 }
5840 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005841 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005842 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005843 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005844 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005845 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005846 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
5847 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005848 if (*out == NULL) goto failed;
5849 return 0;
5850 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005851 tp = state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005852 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005853 if (isinstance == -1) {
5854 return 1;
5855 }
5856 if (isinstance) {
5857 asdl_seq* targets;
5858
Victor Stinnerf8599272020-07-03 16:57:19 +02005859 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005860 return 1;
5861 }
5862 if (tmp == NULL) {
5863 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
5864 return 1;
5865 }
5866 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005867 int res;
5868 Py_ssize_t len;
5869 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005870 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005871 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 +02005872 goto failed;
5873 }
5874 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005875 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005876 if (targets == NULL) goto failed;
5877 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005878 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005879 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5880 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005881 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005882 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005883 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005884 if (len != PyList_GET_SIZE(tmp)) {
5885 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
5886 goto failed;
5887 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005888 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005889 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005890 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005891 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005892 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
5893 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005894 if (*out == NULL) goto failed;
5895 return 0;
5896 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005897 tp = state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005898 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005899 if (isinstance == -1) {
5900 return 1;
5901 }
5902 if (isinstance) {
5903 asdl_seq* targets;
5904 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005905 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005906
Victor Stinnerf8599272020-07-03 16:57:19 +02005907 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005908 return 1;
5909 }
5910 if (tmp == NULL) {
5911 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
5912 return 1;
5913 }
5914 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005915 int res;
5916 Py_ssize_t len;
5917 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005918 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005919 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 +02005920 goto failed;
5921 }
5922 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005923 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005924 if (targets == NULL) goto failed;
5925 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005926 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005927 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5928 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02005929 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005930 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005931 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005932 if (len != PyList_GET_SIZE(tmp)) {
5933 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
5934 goto failed;
5935 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005936 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005937 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005938 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005939 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005940 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005941 return 1;
5942 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005943 if (tmp == NULL) {
5944 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
5945 return 1;
5946 }
5947 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005948 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005949 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005950 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005951 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005952 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005953 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005954 return 1;
5955 }
5956 if (tmp == NULL || tmp == Py_None) {
5957 Py_CLEAR(tmp);
5958 type_comment = NULL;
5959 }
5960 else {
5961 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005962 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005963 if (res != 0) goto failed;
5964 Py_CLEAR(tmp);
5965 }
5966 *out = Assign(targets, value, type_comment, lineno, col_offset,
5967 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005968 if (*out == NULL) goto failed;
5969 return 0;
5970 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005971 tp = state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005972 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005973 if (isinstance == -1) {
5974 return 1;
5975 }
5976 if (isinstance) {
5977 expr_ty target;
5978 operator_ty op;
5979 expr_ty value;
5980
Victor Stinnerf8599272020-07-03 16:57:19 +02005981 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005982 return 1;
5983 }
5984 if (tmp == NULL) {
5985 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
5986 return 1;
5987 }
5988 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005989 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02005990 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005991 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005992 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005993 }
Victor Stinnerf8599272020-07-03 16:57:19 +02005994 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005995 return 1;
5996 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005997 if (tmp == NULL) {
5998 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
5999 return 1;
6000 }
6001 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006002 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006003 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006004 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006005 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006006 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006007 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006008 return 1;
6009 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006010 if (tmp == NULL) {
6011 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
6012 return 1;
6013 }
6014 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006015 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006016 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006017 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006018 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006019 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006020 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
6021 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006022 if (*out == NULL) goto failed;
6023 return 0;
6024 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006025 tp = state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006026 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006027 if (isinstance == -1) {
6028 return 1;
6029 }
6030 if (isinstance) {
6031 expr_ty target;
6032 expr_ty annotation;
6033 expr_ty value;
6034 int simple;
6035
Victor Stinnerf8599272020-07-03 16:57:19 +02006036 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006037 return 1;
6038 }
6039 if (tmp == NULL) {
6040 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
6041 return 1;
6042 }
6043 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006044 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006045 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006046 if (res != 0) goto failed;
6047 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006048 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006049 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006050 return 1;
6051 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006052 if (tmp == NULL) {
6053 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
6054 return 1;
6055 }
6056 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006057 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006058 res = obj2ast_expr(state, tmp, &annotation, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006059 if (res != 0) goto failed;
6060 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006061 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006062 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006063 return 1;
6064 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006065 if (tmp == NULL || tmp == Py_None) {
6066 Py_CLEAR(tmp);
6067 value = NULL;
6068 }
6069 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006070 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006071 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006072 if (res != 0) goto failed;
6073 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006074 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006075 if (_PyObject_LookupAttr(obj, state->simple, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006076 return 1;
6077 }
6078 if (tmp == NULL) {
6079 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
6080 return 1;
6081 }
6082 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006083 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006084 res = obj2ast_int(state, tmp, &simple, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006085 if (res != 0) goto failed;
6086 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006087 }
6088 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006089 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07006090 if (*out == NULL) goto failed;
6091 return 0;
6092 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006093 tp = state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006094 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006095 if (isinstance == -1) {
6096 return 1;
6097 }
6098 if (isinstance) {
6099 expr_ty target;
6100 expr_ty iter;
6101 asdl_seq* body;
6102 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006103 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006104
Victor Stinnerf8599272020-07-03 16:57:19 +02006105 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006106 return 1;
6107 }
6108 if (tmp == NULL) {
6109 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
6110 return 1;
6111 }
6112 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006113 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006114 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006115 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006116 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006117 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006118 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006119 return 1;
6120 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006121 if (tmp == NULL) {
6122 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
6123 return 1;
6124 }
6125 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006126 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006127 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006128 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006129 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006130 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006131 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006132 return 1;
6133 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006134 if (tmp == NULL) {
6135 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
6136 return 1;
6137 }
6138 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006139 int res;
6140 Py_ssize_t len;
6141 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006142 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006143 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 +02006144 goto failed;
6145 }
6146 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006147 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006148 if (body == NULL) goto failed;
6149 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006150 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006151 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6152 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006153 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006154 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006155 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006156 if (len != PyList_GET_SIZE(tmp)) {
6157 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
6158 goto failed;
6159 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006160 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006161 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006162 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006163 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006164 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006165 return 1;
6166 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006167 if (tmp == NULL) {
6168 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
6169 return 1;
6170 }
6171 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006172 int res;
6173 Py_ssize_t len;
6174 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006175 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006176 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 +02006177 goto failed;
6178 }
6179 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006180 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006181 if (orelse == NULL) goto failed;
6182 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006183 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006184 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6185 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006186 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006187 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006188 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006189 if (len != PyList_GET_SIZE(tmp)) {
6190 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
6191 goto failed;
6192 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006193 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006194 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006195 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006196 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006197 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006198 return 1;
6199 }
6200 if (tmp == NULL || tmp == Py_None) {
6201 Py_CLEAR(tmp);
6202 type_comment = NULL;
6203 }
6204 else {
6205 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006206 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006207 if (res != 0) goto failed;
6208 Py_CLEAR(tmp);
6209 }
6210 *out = For(target, iter, body, orelse, type_comment, lineno,
6211 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006212 if (*out == NULL) goto failed;
6213 return 0;
6214 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006215 tp = state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006216 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006217 if (isinstance == -1) {
6218 return 1;
6219 }
6220 if (isinstance) {
6221 expr_ty target;
6222 expr_ty iter;
6223 asdl_seq* body;
6224 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006225 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006226
Victor Stinnerf8599272020-07-03 16:57:19 +02006227 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006228 return 1;
6229 }
6230 if (tmp == NULL) {
6231 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
6232 return 1;
6233 }
6234 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006235 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006236 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006237 if (res != 0) goto failed;
6238 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006239 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006240 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006241 return 1;
6242 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006243 if (tmp == NULL) {
6244 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
6245 return 1;
6246 }
6247 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006248 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006249 res = obj2ast_expr(state, tmp, &iter, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006250 if (res != 0) goto failed;
6251 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006252 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006253 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006254 return 1;
6255 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006256 if (tmp == NULL) {
6257 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
6258 return 1;
6259 }
6260 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006261 int res;
6262 Py_ssize_t len;
6263 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006264 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006265 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 -04006266 goto failed;
6267 }
6268 len = PyList_GET_SIZE(tmp);
6269 body = _Py_asdl_seq_new(len, arena);
6270 if (body == NULL) goto failed;
6271 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006272 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006273 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6274 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006275 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006276 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006277 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006278 if (len != PyList_GET_SIZE(tmp)) {
6279 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
6280 goto failed;
6281 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006282 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006283 }
6284 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006285 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006286 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006287 return 1;
6288 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006289 if (tmp == NULL) {
6290 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
6291 return 1;
6292 }
6293 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006294 int res;
6295 Py_ssize_t len;
6296 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006297 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006298 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 -04006299 goto failed;
6300 }
6301 len = PyList_GET_SIZE(tmp);
6302 orelse = _Py_asdl_seq_new(len, arena);
6303 if (orelse == NULL) goto failed;
6304 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006305 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006306 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6307 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006308 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006309 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006310 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006311 if (len != PyList_GET_SIZE(tmp)) {
6312 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
6313 goto failed;
6314 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006315 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006316 }
6317 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006318 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006319 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006320 return 1;
6321 }
6322 if (tmp == NULL || tmp == Py_None) {
6323 Py_CLEAR(tmp);
6324 type_comment = NULL;
6325 }
6326 else {
6327 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006328 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006329 if (res != 0) goto failed;
6330 Py_CLEAR(tmp);
6331 }
6332 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
6333 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006334 if (*out == NULL) goto failed;
6335 return 0;
6336 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006337 tp = state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006338 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006339 if (isinstance == -1) {
6340 return 1;
6341 }
6342 if (isinstance) {
6343 expr_ty test;
6344 asdl_seq* body;
6345 asdl_seq* orelse;
6346
Victor Stinnerf8599272020-07-03 16:57:19 +02006347 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006348 return 1;
6349 }
6350 if (tmp == NULL) {
6351 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
6352 return 1;
6353 }
6354 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006355 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006356 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006357 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006358 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006359 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006360 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006361 return 1;
6362 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006363 if (tmp == NULL) {
6364 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
6365 return 1;
6366 }
6367 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006368 int res;
6369 Py_ssize_t len;
6370 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006371 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006372 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 +02006373 goto failed;
6374 }
6375 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006376 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006377 if (body == NULL) goto failed;
6378 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006379 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006380 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6381 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006382 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006383 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006384 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006385 if (len != PyList_GET_SIZE(tmp)) {
6386 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
6387 goto failed;
6388 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006389 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006390 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006391 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006392 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006393 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006394 return 1;
6395 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006396 if (tmp == NULL) {
6397 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
6398 return 1;
6399 }
6400 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006401 int res;
6402 Py_ssize_t len;
6403 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006404 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006405 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 +02006406 goto failed;
6407 }
6408 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006409 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006410 if (orelse == NULL) goto failed;
6411 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006412 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006413 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6414 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006415 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006416 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006417 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006418 if (len != PyList_GET_SIZE(tmp)) {
6419 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
6420 goto failed;
6421 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006422 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006423 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006424 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006425 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006426 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
6427 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006428 if (*out == NULL) goto failed;
6429 return 0;
6430 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006431 tp = state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006432 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006433 if (isinstance == -1) {
6434 return 1;
6435 }
6436 if (isinstance) {
6437 expr_ty test;
6438 asdl_seq* body;
6439 asdl_seq* orelse;
6440
Victor Stinnerf8599272020-07-03 16:57:19 +02006441 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006442 return 1;
6443 }
6444 if (tmp == NULL) {
6445 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
6446 return 1;
6447 }
6448 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006449 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006450 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006451 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006452 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006453 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006454 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006455 return 1;
6456 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006457 if (tmp == NULL) {
6458 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
6459 return 1;
6460 }
6461 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006462 int res;
6463 Py_ssize_t len;
6464 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006465 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006466 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 +02006467 goto failed;
6468 }
6469 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006470 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006471 if (body == NULL) goto failed;
6472 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006473 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006474 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6475 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006476 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006477 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006478 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006479 if (len != PyList_GET_SIZE(tmp)) {
6480 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
6481 goto failed;
6482 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006483 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006484 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006485 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006486 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006487 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006488 return 1;
6489 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006490 if (tmp == NULL) {
6491 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
6492 return 1;
6493 }
6494 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006495 int res;
6496 Py_ssize_t len;
6497 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006498 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006499 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 +02006500 goto failed;
6501 }
6502 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006503 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006504 if (orelse == NULL) goto failed;
6505 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006506 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006507 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6508 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006509 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006510 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006511 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006512 if (len != PyList_GET_SIZE(tmp)) {
6513 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
6514 goto failed;
6515 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006516 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006517 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006518 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006519 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006520 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
6521 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006522 if (*out == NULL) goto failed;
6523 return 0;
6524 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006525 tp = state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006526 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006527 if (isinstance == -1) {
6528 return 1;
6529 }
6530 if (isinstance) {
6531 asdl_seq* items;
6532 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006533 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006534
Victor Stinnerf8599272020-07-03 16:57:19 +02006535 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006536 return 1;
6537 }
6538 if (tmp == NULL) {
6539 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
6540 return 1;
6541 }
6542 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006543 int res;
6544 Py_ssize_t len;
6545 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006546 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006547 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 +02006548 goto failed;
6549 }
6550 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006551 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006552 if (items == NULL) goto failed;
6553 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006554 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006555 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6556 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006557 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006558 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006559 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006560 if (len != PyList_GET_SIZE(tmp)) {
6561 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
6562 goto failed;
6563 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006564 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006565 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006566 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006567 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006568 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006569 return 1;
6570 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006571 if (tmp == NULL) {
6572 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
6573 return 1;
6574 }
6575 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006576 int res;
6577 Py_ssize_t len;
6578 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006579 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006580 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 +02006581 goto failed;
6582 }
6583 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006584 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006585 if (body == NULL) goto failed;
6586 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006587 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006588 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6589 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006590 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006591 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006592 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006593 if (len != PyList_GET_SIZE(tmp)) {
6594 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
6595 goto failed;
6596 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006597 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006598 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006599 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006600 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006601 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006602 return 1;
6603 }
6604 if (tmp == NULL || tmp == Py_None) {
6605 Py_CLEAR(tmp);
6606 type_comment = NULL;
6607 }
6608 else {
6609 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006610 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006611 if (res != 0) goto failed;
6612 Py_CLEAR(tmp);
6613 }
6614 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006615 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006616 if (*out == NULL) goto failed;
6617 return 0;
6618 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006619 tp = state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006620 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006621 if (isinstance == -1) {
6622 return 1;
6623 }
6624 if (isinstance) {
6625 asdl_seq* items;
6626 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006627 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006628
Victor Stinnerf8599272020-07-03 16:57:19 +02006629 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006630 return 1;
6631 }
6632 if (tmp == NULL) {
6633 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
6634 return 1;
6635 }
6636 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006637 int res;
6638 Py_ssize_t len;
6639 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006640 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006641 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 -04006642 goto failed;
6643 }
6644 len = PyList_GET_SIZE(tmp);
6645 items = _Py_asdl_seq_new(len, arena);
6646 if (items == NULL) goto failed;
6647 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006648 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006649 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6650 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006651 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006652 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006653 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006654 if (len != PyList_GET_SIZE(tmp)) {
6655 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
6656 goto failed;
6657 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006658 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006659 }
6660 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006661 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006662 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006663 return 1;
6664 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006665 if (tmp == NULL) {
6666 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
6667 return 1;
6668 }
6669 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006670 int res;
6671 Py_ssize_t len;
6672 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006673 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006674 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 -04006675 goto failed;
6676 }
6677 len = PyList_GET_SIZE(tmp);
6678 body = _Py_asdl_seq_new(len, arena);
6679 if (body == NULL) goto failed;
6680 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006681 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006682 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6683 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006684 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006685 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006686 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006687 if (len != PyList_GET_SIZE(tmp)) {
6688 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
6689 goto failed;
6690 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006691 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006692 }
6693 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006694 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006695 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006696 return 1;
6697 }
6698 if (tmp == NULL || tmp == Py_None) {
6699 Py_CLEAR(tmp);
6700 type_comment = NULL;
6701 }
6702 else {
6703 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006704 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006705 if (res != 0) goto failed;
6706 Py_CLEAR(tmp);
6707 }
6708 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
6709 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006710 if (*out == NULL) goto failed;
6711 return 0;
6712 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006713 tp = state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006714 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006715 if (isinstance == -1) {
6716 return 1;
6717 }
6718 if (isinstance) {
6719 expr_ty exc;
6720 expr_ty cause;
6721
Victor Stinnerf8599272020-07-03 16:57:19 +02006722 if (_PyObject_LookupAttr(obj, state->exc, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006723 return 1;
6724 }
6725 if (tmp == NULL || tmp == Py_None) {
6726 Py_CLEAR(tmp);
6727 exc = NULL;
6728 }
6729 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006730 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006731 res = obj2ast_expr(state, tmp, &exc, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006732 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006733 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006734 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006735 if (_PyObject_LookupAttr(obj, state->cause, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006736 return 1;
6737 }
6738 if (tmp == NULL || tmp == Py_None) {
6739 Py_CLEAR(tmp);
6740 cause = NULL;
6741 }
6742 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006743 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006744 res = obj2ast_expr(state, tmp, &cause, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006745 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006746 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006747 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006748 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
6749 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006750 if (*out == NULL) goto failed;
6751 return 0;
6752 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006753 tp = state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006754 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006755 if (isinstance == -1) {
6756 return 1;
6757 }
6758 if (isinstance) {
6759 asdl_seq* body;
6760 asdl_seq* handlers;
6761 asdl_seq* orelse;
6762 asdl_seq* finalbody;
6763
Victor Stinnerf8599272020-07-03 16:57:19 +02006764 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006765 return 1;
6766 }
6767 if (tmp == NULL) {
6768 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
6769 return 1;
6770 }
6771 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006772 int res;
6773 Py_ssize_t len;
6774 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006775 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006776 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 +02006777 goto failed;
6778 }
6779 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006780 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006781 if (body == NULL) goto failed;
6782 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006783 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006784 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6785 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006786 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006787 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006788 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006789 if (len != PyList_GET_SIZE(tmp)) {
6790 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
6791 goto failed;
6792 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006793 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006794 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006795 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006796 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006797 if (_PyObject_LookupAttr(obj, state->handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006798 return 1;
6799 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006800 if (tmp == NULL) {
6801 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
6802 return 1;
6803 }
6804 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006805 int res;
6806 Py_ssize_t len;
6807 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006808 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006809 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 +02006810 goto failed;
6811 }
6812 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006813 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006814 if (handlers == NULL) goto failed;
6815 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006816 excepthandler_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006817 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6818 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006819 res = obj2ast_excepthandler(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006820 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006821 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006822 if (len != PyList_GET_SIZE(tmp)) {
6823 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
6824 goto failed;
6825 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006826 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006827 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006828 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006829 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006830 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006831 return 1;
6832 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006833 if (tmp == NULL) {
6834 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
6835 return 1;
6836 }
6837 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006838 int res;
6839 Py_ssize_t len;
6840 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006841 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006842 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 +02006843 goto failed;
6844 }
6845 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006846 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006847 if (orelse == NULL) goto failed;
6848 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006849 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006850 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6851 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006852 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006853 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006854 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006855 if (len != PyList_GET_SIZE(tmp)) {
6856 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
6857 goto failed;
6858 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006859 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006860 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006861 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006862 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006863 if (_PyObject_LookupAttr(obj, state->finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006864 return 1;
6865 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006866 if (tmp == NULL) {
6867 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
6868 return 1;
6869 }
6870 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006871 int res;
6872 Py_ssize_t len;
6873 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006874 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006875 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 +02006876 goto failed;
6877 }
6878 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006879 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006880 if (finalbody == NULL) goto failed;
6881 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006882 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006883 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6884 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006885 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006886 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006887 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006888 if (len != PyList_GET_SIZE(tmp)) {
6889 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
6890 goto failed;
6891 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006892 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006893 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006894 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006895 }
6896 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006897 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006898 if (*out == NULL) goto failed;
6899 return 0;
6900 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006901 tp = state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006902 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006903 if (isinstance == -1) {
6904 return 1;
6905 }
6906 if (isinstance) {
6907 expr_ty test;
6908 expr_ty msg;
6909
Victor Stinnerf8599272020-07-03 16:57:19 +02006910 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006911 return 1;
6912 }
6913 if (tmp == NULL) {
6914 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
6915 return 1;
6916 }
6917 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006918 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006919 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006920 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006921 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006922 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006923 if (_PyObject_LookupAttr(obj, state->msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006924 return 1;
6925 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006926 if (tmp == NULL || tmp == Py_None) {
6927 Py_CLEAR(tmp);
6928 msg = NULL;
6929 }
6930 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006931 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02006932 res = obj2ast_expr(state, tmp, &msg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006933 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006934 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006935 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006936 *out = Assert(test, msg, lineno, col_offset, end_lineno,
6937 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006938 if (*out == NULL) goto failed;
6939 return 0;
6940 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006941 tp = state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006942 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006943 if (isinstance == -1) {
6944 return 1;
6945 }
6946 if (isinstance) {
6947 asdl_seq* names;
6948
Victor Stinnerf8599272020-07-03 16:57:19 +02006949 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006950 return 1;
6951 }
6952 if (tmp == NULL) {
6953 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
6954 return 1;
6955 }
6956 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006957 int res;
6958 Py_ssize_t len;
6959 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006960 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006961 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 +02006962 goto failed;
6963 }
6964 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006965 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006966 if (names == NULL) goto failed;
6967 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006968 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006969 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6970 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02006971 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006972 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006973 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006974 if (len != PyList_GET_SIZE(tmp)) {
6975 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
6976 goto failed;
6977 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006978 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006979 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006980 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006981 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006982 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
6983 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006984 if (*out == NULL) goto failed;
6985 return 0;
6986 }
Victor Stinnerf8599272020-07-03 16:57:19 +02006987 tp = state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006988 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006989 if (isinstance == -1) {
6990 return 1;
6991 }
6992 if (isinstance) {
6993 identifier module;
6994 asdl_seq* names;
6995 int level;
6996
Victor Stinnerf8599272020-07-03 16:57:19 +02006997 if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006998 return 1;
6999 }
7000 if (tmp == NULL || tmp == Py_None) {
7001 Py_CLEAR(tmp);
7002 module = NULL;
7003 }
7004 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007005 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007006 res = obj2ast_identifier(state, tmp, &module, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007007 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007008 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007009 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007010 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007011 return 1;
7012 }
7013 if (tmp == NULL) {
7014 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
7015 return 1;
7016 }
7017 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007018 int res;
7019 Py_ssize_t len;
7020 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007021 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007022 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 +02007023 goto failed;
7024 }
7025 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007026 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007027 if (names == NULL) goto failed;
7028 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007029 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007030 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7031 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007032 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007033 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007034 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007035 if (len != PyList_GET_SIZE(tmp)) {
7036 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
7037 goto failed;
7038 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007039 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007040 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007041 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007042 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007043 if (_PyObject_LookupAttr(obj, state->level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007044 return 1;
7045 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007046 if (tmp == NULL || tmp == Py_None) {
7047 Py_CLEAR(tmp);
7048 level = 0;
7049 }
7050 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007051 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007052 res = obj2ast_int(state, tmp, &level, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007053 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007054 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007055 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007056 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
7057 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007058 if (*out == NULL) goto failed;
7059 return 0;
7060 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007061 tp = state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007062 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007063 if (isinstance == -1) {
7064 return 1;
7065 }
7066 if (isinstance) {
7067 asdl_seq* names;
7068
Victor Stinnerf8599272020-07-03 16:57:19 +02007069 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007070 return 1;
7071 }
7072 if (tmp == NULL) {
7073 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
7074 return 1;
7075 }
7076 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007077 int res;
7078 Py_ssize_t len;
7079 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007080 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007081 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 +02007082 goto failed;
7083 }
7084 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007085 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007086 if (names == NULL) goto failed;
7087 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007088 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007089 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7090 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007091 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007092 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007093 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007094 if (len != PyList_GET_SIZE(tmp)) {
7095 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
7096 goto failed;
7097 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007098 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007099 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007100 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007101 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007102 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
7103 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007104 if (*out == NULL) goto failed;
7105 return 0;
7106 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007107 tp = state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007108 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007109 if (isinstance == -1) {
7110 return 1;
7111 }
7112 if (isinstance) {
7113 asdl_seq* names;
7114
Victor Stinnerf8599272020-07-03 16:57:19 +02007115 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007116 return 1;
7117 }
7118 if (tmp == NULL) {
7119 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
7120 return 1;
7121 }
7122 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007123 int res;
7124 Py_ssize_t len;
7125 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007126 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007127 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 +02007128 goto failed;
7129 }
7130 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007131 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007132 if (names == NULL) goto failed;
7133 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007134 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007135 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7136 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007137 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007138 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007139 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007140 if (len != PyList_GET_SIZE(tmp)) {
7141 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
7142 goto failed;
7143 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007144 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007145 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007146 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007147 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007148 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
7149 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007150 if (*out == NULL) goto failed;
7151 return 0;
7152 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007153 tp = state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007154 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007155 if (isinstance == -1) {
7156 return 1;
7157 }
7158 if (isinstance) {
7159 expr_ty value;
7160
Victor Stinnerf8599272020-07-03 16:57:19 +02007161 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007162 return 1;
7163 }
7164 if (tmp == NULL) {
7165 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
7166 return 1;
7167 }
7168 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007169 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007170 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007171 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007172 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007173 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007174 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
7175 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007176 if (*out == NULL) goto failed;
7177 return 0;
7178 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007179 tp = state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007180 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007181 if (isinstance == -1) {
7182 return 1;
7183 }
7184 if (isinstance) {
7185
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007186 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007187 if (*out == NULL) goto failed;
7188 return 0;
7189 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007190 tp = state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007191 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007192 if (isinstance == -1) {
7193 return 1;
7194 }
7195 if (isinstance) {
7196
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007197 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007198 if (*out == NULL) goto failed;
7199 return 0;
7200 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007201 tp = state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007202 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007203 if (isinstance == -1) {
7204 return 1;
7205 }
7206 if (isinstance) {
7207
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007208 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007209 if (*out == NULL) goto failed;
7210 return 0;
7211 }
7212
7213 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
7214 failed:
7215 Py_XDECREF(tmp);
7216 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007217}
7218
7219int
Victor Stinnerf8599272020-07-03 16:57:19 +02007220obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007221{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007222 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007223
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007224 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007225 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007226 int lineno;
7227 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007228 int end_lineno;
7229 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007230
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007231 if (obj == Py_None) {
7232 *out = NULL;
7233 return 0;
7234 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007235 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007236 return 1;
7237 }
7238 if (tmp == NULL) {
7239 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
7240 return 1;
7241 }
7242 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007243 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007244 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007245 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007246 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007247 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007248 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007249 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007250 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007251 if (tmp == NULL) {
7252 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
7253 return 1;
7254 }
7255 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007256 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007257 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007258 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007259 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007260 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007261 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007262 return 1;
7263 }
7264 if (tmp == NULL || tmp == Py_None) {
7265 Py_CLEAR(tmp);
7266 end_lineno = 0;
7267 }
7268 else {
7269 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007270 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007271 if (res != 0) goto failed;
7272 Py_CLEAR(tmp);
7273 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007274 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007275 return 1;
7276 }
7277 if (tmp == NULL || tmp == Py_None) {
7278 Py_CLEAR(tmp);
7279 end_col_offset = 0;
7280 }
7281 else {
7282 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007283 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007284 if (res != 0) goto failed;
7285 Py_CLEAR(tmp);
7286 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007287 tp = state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007288 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007289 if (isinstance == -1) {
7290 return 1;
7291 }
7292 if (isinstance) {
7293 boolop_ty op;
7294 asdl_seq* values;
7295
Victor Stinnerf8599272020-07-03 16:57:19 +02007296 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007297 return 1;
7298 }
7299 if (tmp == NULL) {
7300 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
7301 return 1;
7302 }
7303 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007304 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007305 res = obj2ast_boolop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007306 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007307 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007308 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007309 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007310 return 1;
7311 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007312 if (tmp == NULL) {
7313 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
7314 return 1;
7315 }
7316 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007317 int res;
7318 Py_ssize_t len;
7319 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007320 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007321 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 +02007322 goto failed;
7323 }
7324 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007325 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007326 if (values == NULL) goto failed;
7327 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007328 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007329 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7330 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007331 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007332 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007333 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007334 if (len != PyList_GET_SIZE(tmp)) {
7335 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
7336 goto failed;
7337 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007338 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007339 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007340 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007341 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007342 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
7343 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007344 if (*out == NULL) goto failed;
7345 return 0;
7346 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007347 tp = state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007348 isinstance = PyObject_IsInstance(obj, tp);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007349 if (isinstance == -1) {
7350 return 1;
7351 }
7352 if (isinstance) {
7353 expr_ty target;
7354 expr_ty value;
7355
Victor Stinnerf8599272020-07-03 16:57:19 +02007356 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007357 return 1;
7358 }
7359 if (tmp == NULL) {
7360 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
7361 return 1;
7362 }
7363 else {
7364 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007365 res = obj2ast_expr(state, tmp, &target, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007366 if (res != 0) goto failed;
7367 Py_CLEAR(tmp);
7368 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007369 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007370 return 1;
7371 }
7372 if (tmp == NULL) {
7373 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
7374 return 1;
7375 }
7376 else {
7377 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007378 res = obj2ast_expr(state, tmp, &value, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007379 if (res != 0) goto failed;
7380 Py_CLEAR(tmp);
7381 }
7382 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
7383 end_col_offset, arena);
7384 if (*out == NULL) goto failed;
7385 return 0;
7386 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007387 tp = state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007388 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007389 if (isinstance == -1) {
7390 return 1;
7391 }
7392 if (isinstance) {
7393 expr_ty left;
7394 operator_ty op;
7395 expr_ty right;
7396
Victor Stinnerf8599272020-07-03 16:57:19 +02007397 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007398 return 1;
7399 }
7400 if (tmp == NULL) {
7401 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
7402 return 1;
7403 }
7404 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007405 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007406 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007407 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007408 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007409 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007410 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007411 return 1;
7412 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007413 if (tmp == NULL) {
7414 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
7415 return 1;
7416 }
7417 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007418 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007419 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007420 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007421 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007422 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007423 if (_PyObject_LookupAttr(obj, state->right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007424 return 1;
7425 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007426 if (tmp == NULL) {
7427 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
7428 return 1;
7429 }
7430 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007431 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007432 res = obj2ast_expr(state, tmp, &right, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007433 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007434 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007435 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007436 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
7437 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007438 if (*out == NULL) goto failed;
7439 return 0;
7440 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007441 tp = state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007442 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007443 if (isinstance == -1) {
7444 return 1;
7445 }
7446 if (isinstance) {
7447 unaryop_ty op;
7448 expr_ty operand;
7449
Victor Stinnerf8599272020-07-03 16:57:19 +02007450 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007451 return 1;
7452 }
7453 if (tmp == NULL) {
7454 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
7455 return 1;
7456 }
7457 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007458 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007459 res = obj2ast_unaryop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007460 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007461 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007462 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007463 if (_PyObject_LookupAttr(obj, state->operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007464 return 1;
7465 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007466 if (tmp == NULL) {
7467 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
7468 return 1;
7469 }
7470 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007471 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007472 res = obj2ast_expr(state, tmp, &operand, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007473 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007474 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007475 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007476 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
7477 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007478 if (*out == NULL) goto failed;
7479 return 0;
7480 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007481 tp = state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007482 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007483 if (isinstance == -1) {
7484 return 1;
7485 }
7486 if (isinstance) {
7487 arguments_ty args;
7488 expr_ty body;
7489
Victor Stinnerf8599272020-07-03 16:57:19 +02007490 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007491 return 1;
7492 }
7493 if (tmp == NULL) {
7494 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
7495 return 1;
7496 }
7497 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007498 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007499 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007500 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007501 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007502 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007503 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007504 return 1;
7505 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007506 if (tmp == NULL) {
7507 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
7508 return 1;
7509 }
7510 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007511 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007512 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007513 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007514 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007515 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007516 *out = Lambda(args, body, lineno, col_offset, end_lineno,
7517 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007518 if (*out == NULL) goto failed;
7519 return 0;
7520 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007521 tp = state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007522 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007523 if (isinstance == -1) {
7524 return 1;
7525 }
7526 if (isinstance) {
7527 expr_ty test;
7528 expr_ty body;
7529 expr_ty orelse;
7530
Victor Stinnerf8599272020-07-03 16:57:19 +02007531 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007532 return 1;
7533 }
7534 if (tmp == NULL) {
7535 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
7536 return 1;
7537 }
7538 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007539 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007540 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007541 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007542 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007543 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007544 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007545 return 1;
7546 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007547 if (tmp == NULL) {
7548 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
7549 return 1;
7550 }
7551 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007552 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007553 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007554 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007555 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007556 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007557 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007558 return 1;
7559 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007560 if (tmp == NULL) {
7561 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
7562 return 1;
7563 }
7564 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007565 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007566 res = obj2ast_expr(state, tmp, &orelse, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007567 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007568 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007569 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007570 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
7571 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007572 if (*out == NULL) goto failed;
7573 return 0;
7574 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007575 tp = state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007576 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007577 if (isinstance == -1) {
7578 return 1;
7579 }
7580 if (isinstance) {
7581 asdl_seq* keys;
7582 asdl_seq* values;
7583
Victor Stinnerf8599272020-07-03 16:57:19 +02007584 if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007585 return 1;
7586 }
7587 if (tmp == NULL) {
7588 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
7589 return 1;
7590 }
7591 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007592 int res;
7593 Py_ssize_t len;
7594 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007595 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007596 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 +02007597 goto failed;
7598 }
7599 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007600 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007601 if (keys == NULL) goto failed;
7602 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007603 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007604 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7605 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007606 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007607 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007608 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007609 if (len != PyList_GET_SIZE(tmp)) {
7610 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
7611 goto failed;
7612 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007613 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007614 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007615 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007616 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007617 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007618 return 1;
7619 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007620 if (tmp == NULL) {
7621 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
7622 return 1;
7623 }
7624 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007625 int res;
7626 Py_ssize_t len;
7627 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007628 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007629 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 +02007630 goto failed;
7631 }
7632 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007633 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007634 if (values == NULL) goto failed;
7635 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007636 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007637 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7638 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007639 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007640 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007641 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007642 if (len != PyList_GET_SIZE(tmp)) {
7643 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
7644 goto failed;
7645 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007646 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007647 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007648 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007649 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007650 *out = Dict(keys, values, lineno, col_offset, end_lineno,
7651 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007652 if (*out == NULL) goto failed;
7653 return 0;
7654 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007655 tp = state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007656 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007657 if (isinstance == -1) {
7658 return 1;
7659 }
7660 if (isinstance) {
7661 asdl_seq* elts;
7662
Victor Stinnerf8599272020-07-03 16:57:19 +02007663 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007664 return 1;
7665 }
7666 if (tmp == NULL) {
7667 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
7668 return 1;
7669 }
7670 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007671 int res;
7672 Py_ssize_t len;
7673 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007674 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007675 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 +02007676 goto failed;
7677 }
7678 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007679 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007680 if (elts == NULL) goto failed;
7681 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007682 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007683 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7684 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007685 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007686 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007687 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007688 if (len != PyList_GET_SIZE(tmp)) {
7689 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
7690 goto failed;
7691 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007692 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007693 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007694 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007695 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007696 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007697 if (*out == NULL) goto failed;
7698 return 0;
7699 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007700 tp = state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007701 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007702 if (isinstance == -1) {
7703 return 1;
7704 }
7705 if (isinstance) {
7706 expr_ty elt;
7707 asdl_seq* generators;
7708
Victor Stinnerf8599272020-07-03 16:57:19 +02007709 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007710 return 1;
7711 }
7712 if (tmp == NULL) {
7713 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
7714 return 1;
7715 }
7716 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007717 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007718 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007719 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007720 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007721 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007722 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007723 return 1;
7724 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007725 if (tmp == NULL) {
7726 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
7727 return 1;
7728 }
7729 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007730 int res;
7731 Py_ssize_t len;
7732 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007733 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007734 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 +02007735 goto failed;
7736 }
7737 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007738 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007739 if (generators == NULL) goto failed;
7740 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007741 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007742 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7743 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007744 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007745 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007746 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007747 if (len != PyList_GET_SIZE(tmp)) {
7748 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
7749 goto failed;
7750 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007751 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007752 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007753 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007754 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007755 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
7756 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007757 if (*out == NULL) goto failed;
7758 return 0;
7759 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007760 tp = state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007761 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007762 if (isinstance == -1) {
7763 return 1;
7764 }
7765 if (isinstance) {
7766 expr_ty elt;
7767 asdl_seq* generators;
7768
Victor Stinnerf8599272020-07-03 16:57:19 +02007769 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007770 return 1;
7771 }
7772 if (tmp == NULL) {
7773 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
7774 return 1;
7775 }
7776 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007777 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007778 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007779 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007780 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007781 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007782 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007783 return 1;
7784 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007785 if (tmp == NULL) {
7786 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
7787 return 1;
7788 }
7789 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007790 int res;
7791 Py_ssize_t len;
7792 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007793 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007794 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 +02007795 goto failed;
7796 }
7797 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007798 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007799 if (generators == NULL) goto failed;
7800 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007801 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007802 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7803 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007804 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007805 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007806 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007807 if (len != PyList_GET_SIZE(tmp)) {
7808 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
7809 goto failed;
7810 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007811 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007812 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007813 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007814 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007815 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
7816 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007817 if (*out == NULL) goto failed;
7818 return 0;
7819 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007820 tp = state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007821 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007822 if (isinstance == -1) {
7823 return 1;
7824 }
7825 if (isinstance) {
7826 expr_ty key;
7827 expr_ty value;
7828 asdl_seq* generators;
7829
Victor Stinnerf8599272020-07-03 16:57:19 +02007830 if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007831 return 1;
7832 }
7833 if (tmp == NULL) {
7834 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
7835 return 1;
7836 }
7837 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007838 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007839 res = obj2ast_expr(state, tmp, &key, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007840 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007841 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007842 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007843 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007844 return 1;
7845 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007846 if (tmp == NULL) {
7847 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
7848 return 1;
7849 }
7850 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007851 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007852 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007853 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007854 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007855 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007856 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007857 return 1;
7858 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007859 if (tmp == NULL) {
7860 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
7861 return 1;
7862 }
7863 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007864 int res;
7865 Py_ssize_t len;
7866 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007867 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007868 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 +02007869 goto failed;
7870 }
7871 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007872 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007873 if (generators == NULL) goto failed;
7874 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007875 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007876 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7877 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007878 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007879 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007880 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007881 if (len != PyList_GET_SIZE(tmp)) {
7882 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
7883 goto failed;
7884 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007885 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007886 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007887 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007888 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007889 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
7890 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007891 if (*out == NULL) goto failed;
7892 return 0;
7893 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007894 tp = state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007895 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007896 if (isinstance == -1) {
7897 return 1;
7898 }
7899 if (isinstance) {
7900 expr_ty elt;
7901 asdl_seq* generators;
7902
Victor Stinnerf8599272020-07-03 16:57:19 +02007903 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007904 return 1;
7905 }
7906 if (tmp == NULL) {
7907 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
7908 return 1;
7909 }
7910 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007911 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007912 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007913 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007914 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007915 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007916 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007917 return 1;
7918 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007919 if (tmp == NULL) {
7920 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
7921 return 1;
7922 }
7923 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007924 int res;
7925 Py_ssize_t len;
7926 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007927 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007928 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 +02007929 goto failed;
7930 }
7931 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007932 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007933 if (generators == NULL) goto failed;
7934 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007935 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007936 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7937 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02007938 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007939 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007940 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007941 if (len != PyList_GET_SIZE(tmp)) {
7942 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
7943 goto failed;
7944 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007945 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007946 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007947 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007948 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007949 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
7950 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007951 if (*out == NULL) goto failed;
7952 return 0;
7953 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007954 tp = state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007955 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04007956 if (isinstance == -1) {
7957 return 1;
7958 }
7959 if (isinstance) {
7960 expr_ty value;
7961
Victor Stinnerf8599272020-07-03 16:57:19 +02007962 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007963 return 1;
7964 }
7965 if (tmp == NULL) {
7966 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
7967 return 1;
7968 }
7969 else {
Yury Selivanov75445082015-05-11 22:57:16 -04007970 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007971 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007972 if (res != 0) goto failed;
7973 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04007974 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007975 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
7976 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007977 if (*out == NULL) goto failed;
7978 return 0;
7979 }
Victor Stinnerf8599272020-07-03 16:57:19 +02007980 tp = state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007981 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007982 if (isinstance == -1) {
7983 return 1;
7984 }
7985 if (isinstance) {
7986 expr_ty value;
7987
Victor Stinnerf8599272020-07-03 16:57:19 +02007988 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007989 return 1;
7990 }
7991 if (tmp == NULL || tmp == Py_None) {
7992 Py_CLEAR(tmp);
7993 value = NULL;
7994 }
7995 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007996 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02007997 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007998 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007999 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008000 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008001 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
8002 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008003 if (*out == NULL) goto failed;
8004 return 0;
8005 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008006 tp = state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008007 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008008 if (isinstance == -1) {
8009 return 1;
8010 }
8011 if (isinstance) {
8012 expr_ty value;
8013
Victor Stinnerf8599272020-07-03 16:57:19 +02008014 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008015 return 1;
8016 }
8017 if (tmp == NULL) {
8018 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
8019 return 1;
8020 }
8021 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008022 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008023 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008024 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008025 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008026 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008027 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
8028 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008029 if (*out == NULL) goto failed;
8030 return 0;
8031 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008032 tp = state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008033 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008034 if (isinstance == -1) {
8035 return 1;
8036 }
8037 if (isinstance) {
8038 expr_ty left;
8039 asdl_int_seq* ops;
8040 asdl_seq* comparators;
8041
Victor Stinnerf8599272020-07-03 16:57:19 +02008042 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008043 return 1;
8044 }
8045 if (tmp == NULL) {
8046 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
8047 return 1;
8048 }
8049 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008050 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008051 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008052 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008053 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008054 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008055 if (_PyObject_LookupAttr(obj, state->ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008056 return 1;
8057 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008058 if (tmp == NULL) {
8059 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
8060 return 1;
8061 }
8062 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008063 int res;
8064 Py_ssize_t len;
8065 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008066 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008067 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 +02008068 goto failed;
8069 }
8070 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008071 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008072 if (ops == NULL) goto failed;
8073 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008074 cmpop_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008075 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8076 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008077 res = obj2ast_cmpop(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008078 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008079 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008080 if (len != PyList_GET_SIZE(tmp)) {
8081 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
8082 goto failed;
8083 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008084 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008085 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008086 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008087 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008088 if (_PyObject_LookupAttr(obj, state->comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008089 return 1;
8090 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008091 if (tmp == NULL) {
8092 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
8093 return 1;
8094 }
8095 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008096 int res;
8097 Py_ssize_t len;
8098 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008099 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008100 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 +02008101 goto failed;
8102 }
8103 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008104 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008105 if (comparators == NULL) goto failed;
8106 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008107 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008108 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8109 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008110 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008111 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008112 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008113 if (len != PyList_GET_SIZE(tmp)) {
8114 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
8115 goto failed;
8116 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008117 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008118 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008119 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008120 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008121 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
8122 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008123 if (*out == NULL) goto failed;
8124 return 0;
8125 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008126 tp = state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008127 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008128 if (isinstance == -1) {
8129 return 1;
8130 }
8131 if (isinstance) {
8132 expr_ty func;
8133 asdl_seq* args;
8134 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008135
Victor Stinnerf8599272020-07-03 16:57:19 +02008136 if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008137 return 1;
8138 }
8139 if (tmp == NULL) {
8140 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
8141 return 1;
8142 }
8143 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008144 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008145 res = obj2ast_expr(state, tmp, &func, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008146 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008147 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008148 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008149 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008150 return 1;
8151 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008152 if (tmp == NULL) {
8153 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
8154 return 1;
8155 }
8156 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008157 int res;
8158 Py_ssize_t len;
8159 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008160 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008161 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 +02008162 goto failed;
8163 }
8164 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008165 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008166 if (args == NULL) goto failed;
8167 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008168 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008169 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8170 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008171 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008172 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008173 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008174 if (len != PyList_GET_SIZE(tmp)) {
8175 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
8176 goto failed;
8177 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008178 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008179 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008180 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008181 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008182 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008183 return 1;
8184 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008185 if (tmp == NULL) {
8186 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
8187 return 1;
8188 }
8189 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008190 int res;
8191 Py_ssize_t len;
8192 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008193 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008194 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 +02008195 goto failed;
8196 }
8197 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008198 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008199 if (keywords == NULL) goto failed;
8200 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008201 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008202 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8203 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008204 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008205 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008206 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008207 if (len != PyList_GET_SIZE(tmp)) {
8208 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
8209 goto failed;
8210 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008211 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008212 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008213 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008214 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008215 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
8216 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008217 if (*out == NULL) goto failed;
8218 return 0;
8219 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008220 tp = state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008221 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008222 if (isinstance == -1) {
8223 return 1;
8224 }
8225 if (isinstance) {
8226 expr_ty value;
8227 int conversion;
8228 expr_ty format_spec;
8229
Victor Stinnerf8599272020-07-03 16:57:19 +02008230 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008231 return 1;
8232 }
8233 if (tmp == NULL) {
8234 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
8235 return 1;
8236 }
8237 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008238 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008239 res = obj2ast_expr(state, tmp, &value, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008240 if (res != 0) goto failed;
8241 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008242 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008243 if (_PyObject_LookupAttr(obj, state->conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008244 return 1;
8245 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008246 if (tmp == NULL || tmp == Py_None) {
8247 Py_CLEAR(tmp);
8248 conversion = 0;
8249 }
8250 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008251 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008252 res = obj2ast_int(state, tmp, &conversion, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008253 if (res != 0) goto failed;
8254 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008255 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008256 if (_PyObject_LookupAttr(obj, state->format_spec, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008257 return 1;
8258 }
8259 if (tmp == NULL || tmp == Py_None) {
8260 Py_CLEAR(tmp);
8261 format_spec = NULL;
8262 }
8263 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008264 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008265 res = obj2ast_expr(state, tmp, &format_spec, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008266 if (res != 0) goto failed;
8267 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008268 }
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04008269 *out = FormattedValue(value, conversion, format_spec, lineno,
8270 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008271 if (*out == NULL) goto failed;
8272 return 0;
8273 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008274 tp = state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008275 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008276 if (isinstance == -1) {
8277 return 1;
8278 }
8279 if (isinstance) {
8280 asdl_seq* values;
8281
Victor Stinnerf8599272020-07-03 16:57:19 +02008282 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008283 return 1;
8284 }
8285 if (tmp == NULL) {
8286 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
8287 return 1;
8288 }
8289 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008290 int res;
8291 Py_ssize_t len;
8292 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008293 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008294 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 -04008295 goto failed;
8296 }
8297 len = PyList_GET_SIZE(tmp);
8298 values = _Py_asdl_seq_new(len, arena);
8299 if (values == NULL) goto failed;
8300 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008301 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008302 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8303 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008304 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008305 Py_DECREF(tmp2);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008306 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03008307 if (len != PyList_GET_SIZE(tmp)) {
8308 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
8309 goto failed;
8310 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008311 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008312 }
8313 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008314 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008315 *out = JoinedStr(values, lineno, col_offset, end_lineno,
8316 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008317 if (*out == NULL) goto failed;
8318 return 0;
8319 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008320 tp = state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008321 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008322 if (isinstance == -1) {
8323 return 1;
8324 }
8325 if (isinstance) {
8326 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008327 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008328
Victor Stinnerf8599272020-07-03 16:57:19 +02008329 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008330 return 1;
8331 }
8332 if (tmp == NULL) {
8333 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
8334 return 1;
8335 }
8336 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008337 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008338 res = obj2ast_constant(state, tmp, &value, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008339 if (res != 0) goto failed;
8340 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008341 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008342 if (_PyObject_LookupAttr(obj, state->kind, &tmp) < 0) {
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008343 return 1;
8344 }
8345 if (tmp == NULL || tmp == Py_None) {
8346 Py_CLEAR(tmp);
8347 kind = NULL;
8348 }
8349 else {
8350 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008351 res = obj2ast_string(state, tmp, &kind, arena);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008352 if (res != 0) goto failed;
8353 Py_CLEAR(tmp);
8354 }
8355 *out = Constant(value, kind, lineno, col_offset, end_lineno,
8356 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008357 if (*out == NULL) goto failed;
8358 return 0;
8359 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008360 tp = state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008361 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008362 if (isinstance == -1) {
8363 return 1;
8364 }
8365 if (isinstance) {
8366 expr_ty value;
8367 identifier attr;
8368 expr_context_ty ctx;
8369
Victor Stinnerf8599272020-07-03 16:57:19 +02008370 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008371 return 1;
8372 }
8373 if (tmp == NULL) {
8374 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
8375 return 1;
8376 }
8377 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008378 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008379 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008380 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008381 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008382 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008383 if (_PyObject_LookupAttr(obj, state->attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008384 return 1;
8385 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008386 if (tmp == NULL) {
8387 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
8388 return 1;
8389 }
8390 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008391 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008392 res = obj2ast_identifier(state, tmp, &attr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008393 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008394 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008395 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008396 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008397 return 1;
8398 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008399 if (tmp == NULL) {
8400 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
8401 return 1;
8402 }
8403 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008404 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008405 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008406 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008407 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008408 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008409 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
8410 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008411 if (*out == NULL) goto failed;
8412 return 0;
8413 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008414 tp = state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008415 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008416 if (isinstance == -1) {
8417 return 1;
8418 }
8419 if (isinstance) {
8420 expr_ty value;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008421 expr_ty slice;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008422 expr_context_ty ctx;
8423
Victor Stinnerf8599272020-07-03 16:57:19 +02008424 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008425 return 1;
8426 }
8427 if (tmp == NULL) {
8428 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
8429 return 1;
8430 }
8431 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008432 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008433 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008434 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008435 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008436 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008437 if (_PyObject_LookupAttr(obj, state->slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008438 return 1;
8439 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008440 if (tmp == NULL) {
8441 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
8442 return 1;
8443 }
8444 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008445 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008446 res = obj2ast_expr(state, tmp, &slice, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008447 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008448 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008449 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008450 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008451 return 1;
8452 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008453 if (tmp == NULL) {
8454 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
8455 return 1;
8456 }
8457 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008458 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008459 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008460 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008461 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008462 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008463 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
8464 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008465 if (*out == NULL) goto failed;
8466 return 0;
8467 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008468 tp = state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008469 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008470 if (isinstance == -1) {
8471 return 1;
8472 }
8473 if (isinstance) {
8474 expr_ty value;
8475 expr_context_ty ctx;
8476
Victor Stinnerf8599272020-07-03 16:57:19 +02008477 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008478 return 1;
8479 }
8480 if (tmp == NULL) {
8481 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
8482 return 1;
8483 }
8484 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008485 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008486 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008487 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008488 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008489 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008490 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008491 return 1;
8492 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008493 if (tmp == NULL) {
8494 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
8495 return 1;
8496 }
8497 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008498 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008499 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008500 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008501 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008502 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008503 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
8504 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008505 if (*out == NULL) goto failed;
8506 return 0;
8507 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008508 tp = state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008509 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008510 if (isinstance == -1) {
8511 return 1;
8512 }
8513 if (isinstance) {
8514 identifier id;
8515 expr_context_ty ctx;
8516
Victor Stinnerf8599272020-07-03 16:57:19 +02008517 if (_PyObject_LookupAttr(obj, state->id, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008518 return 1;
8519 }
8520 if (tmp == NULL) {
8521 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
8522 return 1;
8523 }
8524 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008525 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008526 res = obj2ast_identifier(state, tmp, &id, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008527 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008528 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008529 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008530 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008531 return 1;
8532 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008533 if (tmp == NULL) {
8534 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
8535 return 1;
8536 }
8537 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008538 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008539 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008540 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008541 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008542 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008543 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
8544 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008545 if (*out == NULL) goto failed;
8546 return 0;
8547 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008548 tp = state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008549 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008550 if (isinstance == -1) {
8551 return 1;
8552 }
8553 if (isinstance) {
8554 asdl_seq* elts;
8555 expr_context_ty ctx;
8556
Victor Stinnerf8599272020-07-03 16:57:19 +02008557 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008558 return 1;
8559 }
8560 if (tmp == NULL) {
8561 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
8562 return 1;
8563 }
8564 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008565 int res;
8566 Py_ssize_t len;
8567 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008568 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008569 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 +02008570 goto failed;
8571 }
8572 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008573 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008574 if (elts == NULL) goto failed;
8575 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008576 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008577 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8578 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008579 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008580 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008581 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008582 if (len != PyList_GET_SIZE(tmp)) {
8583 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
8584 goto failed;
8585 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008586 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008587 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008588 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008589 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008590 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008591 return 1;
8592 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008593 if (tmp == NULL) {
8594 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
8595 return 1;
8596 }
8597 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008598 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008599 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008600 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008601 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008602 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008603 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8604 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008605 if (*out == NULL) goto failed;
8606 return 0;
8607 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008608 tp = state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008609 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008610 if (isinstance == -1) {
8611 return 1;
8612 }
8613 if (isinstance) {
8614 asdl_seq* elts;
8615 expr_context_ty ctx;
8616
Victor Stinnerf8599272020-07-03 16:57:19 +02008617 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008618 return 1;
8619 }
8620 if (tmp == NULL) {
8621 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
8622 return 1;
8623 }
8624 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008625 int res;
8626 Py_ssize_t len;
8627 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008628 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008629 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 +02008630 goto failed;
8631 }
8632 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008633 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008634 if (elts == NULL) goto failed;
8635 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008636 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008637 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8638 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02008639 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008640 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008641 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008642 if (len != PyList_GET_SIZE(tmp)) {
8643 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
8644 goto failed;
8645 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008646 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008647 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008648 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008649 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008650 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008651 return 1;
8652 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008653 if (tmp == NULL) {
8654 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
8655 return 1;
8656 }
8657 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008658 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008659 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008660 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008661 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008662 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008663 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8664 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008665 if (*out == NULL) goto failed;
8666 return 0;
8667 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008668 tp = state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008669 isinstance = PyObject_IsInstance(obj, tp);
8670 if (isinstance == -1) {
8671 return 1;
8672 }
8673 if (isinstance) {
8674 expr_ty lower;
8675 expr_ty upper;
8676 expr_ty step;
8677
Victor Stinnerf8599272020-07-03 16:57:19 +02008678 if (_PyObject_LookupAttr(obj, state->lower, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008679 return 1;
8680 }
8681 if (tmp == NULL || tmp == Py_None) {
8682 Py_CLEAR(tmp);
8683 lower = NULL;
8684 }
8685 else {
8686 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008687 res = obj2ast_expr(state, tmp, &lower, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008688 if (res != 0) goto failed;
8689 Py_CLEAR(tmp);
8690 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008691 if (_PyObject_LookupAttr(obj, state->upper, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008692 return 1;
8693 }
8694 if (tmp == NULL || tmp == Py_None) {
8695 Py_CLEAR(tmp);
8696 upper = NULL;
8697 }
8698 else {
8699 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008700 res = obj2ast_expr(state, tmp, &upper, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008701 if (res != 0) goto failed;
8702 Py_CLEAR(tmp);
8703 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008704 if (_PyObject_LookupAttr(obj, state->step, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008705 return 1;
8706 }
8707 if (tmp == NULL || tmp == Py_None) {
8708 Py_CLEAR(tmp);
8709 step = NULL;
8710 }
8711 else {
8712 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02008713 res = obj2ast_expr(state, tmp, &step, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008714 if (res != 0) goto failed;
8715 Py_CLEAR(tmp);
8716 }
8717 *out = Slice(lower, upper, step, lineno, col_offset, end_lineno,
8718 end_col_offset, arena);
8719 if (*out == NULL) goto failed;
8720 return 0;
8721 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008722
8723 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
8724 failed:
8725 Py_XDECREF(tmp);
8726 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008727}
8728
8729int
Victor Stinnerf8599272020-07-03 16:57:19 +02008730obj2ast_expr_context(astmodulestate *state, PyObject* obj, expr_context_ty*
8731 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008732{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008733 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008734
Victor Stinnerf8599272020-07-03 16:57:19 +02008735 isinstance = PyObject_IsInstance(obj, state->Load_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008736 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008737 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008738 }
8739 if (isinstance) {
8740 *out = Load;
8741 return 0;
8742 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008743 isinstance = PyObject_IsInstance(obj, state->Store_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008744 if (isinstance == -1) {
8745 return 1;
8746 }
8747 if (isinstance) {
8748 *out = Store;
8749 return 0;
8750 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008751 isinstance = PyObject_IsInstance(obj, state->Del_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008752 if (isinstance == -1) {
8753 return 1;
8754 }
8755 if (isinstance) {
8756 *out = Del;
8757 return 0;
8758 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008759
8760 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
8761 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008762}
8763
8764int
Victor Stinnerf8599272020-07-03 16:57:19 +02008765obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, PyArena*
8766 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008767{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008768 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008769
Victor Stinnerf8599272020-07-03 16:57:19 +02008770 isinstance = PyObject_IsInstance(obj, state->And_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008771 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008772 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008773 }
8774 if (isinstance) {
8775 *out = And;
8776 return 0;
8777 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008778 isinstance = PyObject_IsInstance(obj, state->Or_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008779 if (isinstance == -1) {
8780 return 1;
8781 }
8782 if (isinstance) {
8783 *out = Or;
8784 return 0;
8785 }
8786
8787 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
8788 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008789}
8790
8791int
Victor Stinnerf8599272020-07-03 16:57:19 +02008792obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* out,
8793 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008794{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008795 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008796
Victor Stinnerf8599272020-07-03 16:57:19 +02008797 isinstance = PyObject_IsInstance(obj, state->Add_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008798 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008799 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008800 }
8801 if (isinstance) {
8802 *out = Add;
8803 return 0;
8804 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008805 isinstance = PyObject_IsInstance(obj, state->Sub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008806 if (isinstance == -1) {
8807 return 1;
8808 }
8809 if (isinstance) {
8810 *out = Sub;
8811 return 0;
8812 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008813 isinstance = PyObject_IsInstance(obj, state->Mult_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008814 if (isinstance == -1) {
8815 return 1;
8816 }
8817 if (isinstance) {
8818 *out = Mult;
8819 return 0;
8820 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008821 isinstance = PyObject_IsInstance(obj, state->MatMult_type);
Benjamin Petersond51374e2014-04-09 23:55:56 -04008822 if (isinstance == -1) {
8823 return 1;
8824 }
8825 if (isinstance) {
8826 *out = MatMult;
8827 return 0;
8828 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008829 isinstance = PyObject_IsInstance(obj, state->Div_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008830 if (isinstance == -1) {
8831 return 1;
8832 }
8833 if (isinstance) {
8834 *out = Div;
8835 return 0;
8836 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008837 isinstance = PyObject_IsInstance(obj, state->Mod_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008838 if (isinstance == -1) {
8839 return 1;
8840 }
8841 if (isinstance) {
8842 *out = Mod;
8843 return 0;
8844 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008845 isinstance = PyObject_IsInstance(obj, state->Pow_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008846 if (isinstance == -1) {
8847 return 1;
8848 }
8849 if (isinstance) {
8850 *out = Pow;
8851 return 0;
8852 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008853 isinstance = PyObject_IsInstance(obj, state->LShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008854 if (isinstance == -1) {
8855 return 1;
8856 }
8857 if (isinstance) {
8858 *out = LShift;
8859 return 0;
8860 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008861 isinstance = PyObject_IsInstance(obj, state->RShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008862 if (isinstance == -1) {
8863 return 1;
8864 }
8865 if (isinstance) {
8866 *out = RShift;
8867 return 0;
8868 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008869 isinstance = PyObject_IsInstance(obj, state->BitOr_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008870 if (isinstance == -1) {
8871 return 1;
8872 }
8873 if (isinstance) {
8874 *out = BitOr;
8875 return 0;
8876 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008877 isinstance = PyObject_IsInstance(obj, state->BitXor_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008878 if (isinstance == -1) {
8879 return 1;
8880 }
8881 if (isinstance) {
8882 *out = BitXor;
8883 return 0;
8884 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008885 isinstance = PyObject_IsInstance(obj, state->BitAnd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008886 if (isinstance == -1) {
8887 return 1;
8888 }
8889 if (isinstance) {
8890 *out = BitAnd;
8891 return 0;
8892 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008893 isinstance = PyObject_IsInstance(obj, state->FloorDiv_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008894 if (isinstance == -1) {
8895 return 1;
8896 }
8897 if (isinstance) {
8898 *out = FloorDiv;
8899 return 0;
8900 }
8901
8902 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
8903 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008904}
8905
8906int
Victor Stinnerf8599272020-07-03 16:57:19 +02008907obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* out, PyArena*
8908 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008909{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008910 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008911
Victor Stinnerf8599272020-07-03 16:57:19 +02008912 isinstance = PyObject_IsInstance(obj, state->Invert_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008913 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008914 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008915 }
8916 if (isinstance) {
8917 *out = Invert;
8918 return 0;
8919 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008920 isinstance = PyObject_IsInstance(obj, state->Not_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008921 if (isinstance == -1) {
8922 return 1;
8923 }
8924 if (isinstance) {
8925 *out = Not;
8926 return 0;
8927 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008928 isinstance = PyObject_IsInstance(obj, state->UAdd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008929 if (isinstance == -1) {
8930 return 1;
8931 }
8932 if (isinstance) {
8933 *out = UAdd;
8934 return 0;
8935 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008936 isinstance = PyObject_IsInstance(obj, state->USub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008937 if (isinstance == -1) {
8938 return 1;
8939 }
8940 if (isinstance) {
8941 *out = USub;
8942 return 0;
8943 }
8944
8945 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
8946 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008947}
8948
8949int
Victor Stinnerf8599272020-07-03 16:57:19 +02008950obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, PyArena*
8951 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008952{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008953 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008954
Victor Stinnerf8599272020-07-03 16:57:19 +02008955 isinstance = PyObject_IsInstance(obj, state->Eq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008956 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008957 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008958 }
8959 if (isinstance) {
8960 *out = Eq;
8961 return 0;
8962 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008963 isinstance = PyObject_IsInstance(obj, state->NotEq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008964 if (isinstance == -1) {
8965 return 1;
8966 }
8967 if (isinstance) {
8968 *out = NotEq;
8969 return 0;
8970 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008971 isinstance = PyObject_IsInstance(obj, state->Lt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008972 if (isinstance == -1) {
8973 return 1;
8974 }
8975 if (isinstance) {
8976 *out = Lt;
8977 return 0;
8978 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008979 isinstance = PyObject_IsInstance(obj, state->LtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008980 if (isinstance == -1) {
8981 return 1;
8982 }
8983 if (isinstance) {
8984 *out = LtE;
8985 return 0;
8986 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008987 isinstance = PyObject_IsInstance(obj, state->Gt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008988 if (isinstance == -1) {
8989 return 1;
8990 }
8991 if (isinstance) {
8992 *out = Gt;
8993 return 0;
8994 }
Victor Stinnerf8599272020-07-03 16:57:19 +02008995 isinstance = PyObject_IsInstance(obj, state->GtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008996 if (isinstance == -1) {
8997 return 1;
8998 }
8999 if (isinstance) {
9000 *out = GtE;
9001 return 0;
9002 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009003 isinstance = PyObject_IsInstance(obj, state->Is_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009004 if (isinstance == -1) {
9005 return 1;
9006 }
9007 if (isinstance) {
9008 *out = Is;
9009 return 0;
9010 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009011 isinstance = PyObject_IsInstance(obj, state->IsNot_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009012 if (isinstance == -1) {
9013 return 1;
9014 }
9015 if (isinstance) {
9016 *out = IsNot;
9017 return 0;
9018 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009019 isinstance = PyObject_IsInstance(obj, state->In_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009020 if (isinstance == -1) {
9021 return 1;
9022 }
9023 if (isinstance) {
9024 *out = In;
9025 return 0;
9026 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009027 isinstance = PyObject_IsInstance(obj, state->NotIn_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009028 if (isinstance == -1) {
9029 return 1;
9030 }
9031 if (isinstance) {
9032 *out = NotIn;
9033 return 0;
9034 }
9035
9036 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
9037 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009038}
9039
9040int
Victor Stinnerf8599272020-07-03 16:57:19 +02009041obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty*
9042 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009043{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009044 PyObject* tmp = NULL;
9045 expr_ty target;
9046 expr_ty iter;
9047 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009048 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009049
Victor Stinnerf8599272020-07-03 16:57:19 +02009050 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009051 return 1;
9052 }
9053 if (tmp == NULL) {
9054 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
9055 return 1;
9056 }
9057 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009058 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009059 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009060 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009061 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009062 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009063 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009064 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009065 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009066 if (tmp == NULL) {
9067 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
9068 return 1;
9069 }
9070 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009071 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009072 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009073 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009074 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009075 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009076 if (_PyObject_LookupAttr(obj, state->ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009077 return 1;
9078 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009079 if (tmp == NULL) {
9080 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
9081 return 1;
9082 }
9083 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009084 int res;
9085 Py_ssize_t len;
9086 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009087 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009088 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 +02009089 goto failed;
9090 }
9091 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009092 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009093 if (ifs == NULL) goto failed;
9094 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009095 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009096 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9097 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009098 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009099 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009100 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009101 if (len != PyList_GET_SIZE(tmp)) {
9102 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
9103 goto failed;
9104 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009105 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009106 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009107 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009108 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009109 if (_PyObject_LookupAttr(obj, state->is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009110 return 1;
9111 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009112 if (tmp == NULL) {
9113 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
9114 return 1;
9115 }
9116 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009117 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009118 res = obj2ast_int(state, tmp, &is_async, arena);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009119 if (res != 0) goto failed;
9120 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009121 }
9122 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009123 return 0;
9124failed:
9125 Py_XDECREF(tmp);
9126 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009127}
9128
9129int
Victor Stinnerf8599272020-07-03 16:57:19 +02009130obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty*
9131 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009132{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009133 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00009134
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009135 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009136 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009137 int lineno;
9138 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009139 int end_lineno;
9140 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009141
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009142 if (obj == Py_None) {
9143 *out = NULL;
9144 return 0;
9145 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009146 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009147 return 1;
9148 }
9149 if (tmp == NULL) {
9150 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
9151 return 1;
9152 }
9153 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009154 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009155 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009156 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009157 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009158 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009159 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009160 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009161 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009162 if (tmp == NULL) {
9163 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
9164 return 1;
9165 }
9166 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009167 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009168 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009169 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009170 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009171 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009172 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009173 return 1;
9174 }
9175 if (tmp == NULL || tmp == Py_None) {
9176 Py_CLEAR(tmp);
9177 end_lineno = 0;
9178 }
9179 else {
9180 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009181 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009182 if (res != 0) goto failed;
9183 Py_CLEAR(tmp);
9184 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009185 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009186 return 1;
9187 }
9188 if (tmp == NULL || tmp == Py_None) {
9189 Py_CLEAR(tmp);
9190 end_col_offset = 0;
9191 }
9192 else {
9193 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009194 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009195 if (res != 0) goto failed;
9196 Py_CLEAR(tmp);
9197 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009198 tp = state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009199 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009200 if (isinstance == -1) {
9201 return 1;
9202 }
9203 if (isinstance) {
9204 expr_ty type;
9205 identifier name;
9206 asdl_seq* body;
9207
Victor Stinnerf8599272020-07-03 16:57:19 +02009208 if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009209 return 1;
9210 }
9211 if (tmp == NULL || tmp == Py_None) {
9212 Py_CLEAR(tmp);
9213 type = NULL;
9214 }
9215 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009216 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009217 res = obj2ast_expr(state, tmp, &type, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009218 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009219 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009220 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009221 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009222 return 1;
9223 }
9224 if (tmp == NULL || tmp == Py_None) {
9225 Py_CLEAR(tmp);
9226 name = NULL;
9227 }
9228 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009229 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009230 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009231 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009232 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009233 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009234 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009235 return 1;
9236 }
9237 if (tmp == NULL) {
9238 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
9239 return 1;
9240 }
9241 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009242 int res;
9243 Py_ssize_t len;
9244 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009245 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009246 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 +02009247 goto failed;
9248 }
9249 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009250 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009251 if (body == NULL) goto failed;
9252 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009253 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009254 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9255 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009256 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009257 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009258 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009259 if (len != PyList_GET_SIZE(tmp)) {
9260 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
9261 goto failed;
9262 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009263 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009264 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009265 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009266 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009267 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
9268 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009269 if (*out == NULL) goto failed;
9270 return 0;
9271 }
9272
9273 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
9274 failed:
9275 Py_XDECREF(tmp);
9276 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009277}
9278
9279int
Victor Stinnerf8599272020-07-03 16:57:19 +02009280obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out,
9281 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009282{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009283 PyObject* tmp = NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009284 asdl_seq* posonlyargs;
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009285 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009286 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009287 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009288 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009289 arg_ty kwarg;
9290 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009291
Victor Stinnerf8599272020-07-03 16:57:19 +02009292 if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009293 return 1;
9294 }
9295 if (tmp == NULL) {
9296 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
9297 return 1;
9298 }
9299 else {
9300 int res;
9301 Py_ssize_t len;
9302 Py_ssize_t i;
9303 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009304 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 +01009305 goto failed;
9306 }
9307 len = PyList_GET_SIZE(tmp);
9308 posonlyargs = _Py_asdl_seq_new(len, arena);
9309 if (posonlyargs == NULL) goto failed;
9310 for (i = 0; i < len; i++) {
9311 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009312 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9313 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009314 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009315 Py_DECREF(tmp2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009316 if (res != 0) goto failed;
9317 if (len != PyList_GET_SIZE(tmp)) {
9318 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
9319 goto failed;
9320 }
9321 asdl_seq_SET(posonlyargs, i, val);
9322 }
9323 Py_CLEAR(tmp);
9324 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009325 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009326 return 1;
9327 }
9328 if (tmp == NULL) {
9329 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
9330 return 1;
9331 }
9332 else {
9333 int res;
9334 Py_ssize_t len;
9335 Py_ssize_t i;
9336 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009337 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 +02009338 goto failed;
9339 }
9340 len = PyList_GET_SIZE(tmp);
9341 args = _Py_asdl_seq_new(len, arena);
9342 if (args == NULL) goto failed;
9343 for (i = 0; i < len; i++) {
9344 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009345 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9346 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009347 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009348 Py_DECREF(tmp2);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009349 if (res != 0) goto failed;
9350 if (len != PyList_GET_SIZE(tmp)) {
9351 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
9352 goto failed;
9353 }
9354 asdl_seq_SET(args, i, val);
9355 }
9356 Py_CLEAR(tmp);
9357 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009358 if (_PyObject_LookupAttr(obj, state->vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009359 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009360 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009361 if (tmp == NULL || tmp == Py_None) {
9362 Py_CLEAR(tmp);
9363 vararg = NULL;
9364 }
9365 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009366 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009367 res = obj2ast_arg(state, tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009368 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009369 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009370 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009371 if (_PyObject_LookupAttr(obj, state->kwonlyargs, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009372 return 1;
9373 }
9374 if (tmp == NULL) {
9375 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
9376 return 1;
9377 }
9378 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009379 int res;
9380 Py_ssize_t len;
9381 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009382 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009383 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 +02009384 goto failed;
9385 }
9386 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009387 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009388 if (kwonlyargs == NULL) goto failed;
9389 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009390 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009391 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9392 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009393 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009394 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009395 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009396 if (len != PyList_GET_SIZE(tmp)) {
9397 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
9398 goto failed;
9399 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009400 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009401 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009402 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009403 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009404 if (_PyObject_LookupAttr(obj, state->kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009405 return 1;
9406 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009407 if (tmp == NULL) {
9408 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
9409 return 1;
9410 }
9411 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009412 int res;
9413 Py_ssize_t len;
9414 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009415 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009416 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 +02009417 goto failed;
9418 }
9419 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009420 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009421 if (kw_defaults == NULL) goto failed;
9422 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009423 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009424 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9425 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009426 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009427 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009428 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009429 if (len != PyList_GET_SIZE(tmp)) {
9430 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
9431 goto failed;
9432 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009433 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009434 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009435 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009436 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009437 if (_PyObject_LookupAttr(obj, state->kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009438 return 1;
9439 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009440 if (tmp == NULL || tmp == Py_None) {
9441 Py_CLEAR(tmp);
9442 kwarg = NULL;
9443 }
9444 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009445 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009446 res = obj2ast_arg(state, tmp, &kwarg, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009447 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02009448 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009449 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009450 if (_PyObject_LookupAttr(obj, state->defaults, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009451 return 1;
9452 }
9453 if (tmp == NULL) {
9454 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
9455 return 1;
9456 }
9457 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009458 int res;
9459 Py_ssize_t len;
9460 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009461 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009462 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 +02009463 goto failed;
9464 }
9465 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02009466 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009467 if (defaults == NULL) goto failed;
9468 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009469 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009470 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9471 Py_INCREF(tmp2);
Victor Stinnerf8599272020-07-03 16:57:19 +02009472 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009473 Py_DECREF(tmp2);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009474 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009475 if (len != PyList_GET_SIZE(tmp)) {
9476 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
9477 goto failed;
9478 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009479 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009480 }
Victor Stinnerb3189902013-07-27 00:04:42 +02009481 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009482 }
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009483 *out = arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg,
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009484 defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009485 return 0;
9486failed:
9487 Py_XDECREF(tmp);
9488 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009489}
9490
9491int
Victor Stinnerf8599272020-07-03 16:57:19 +02009492obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009493{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009494 PyObject* tmp = NULL;
9495 identifier arg;
9496 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009497 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01009498 int lineno;
9499 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009500 int end_lineno;
9501 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009502
Victor Stinnerf8599272020-07-03 16:57:19 +02009503 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009504 return 1;
9505 }
9506 if (tmp == NULL) {
9507 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
9508 return 1;
9509 }
9510 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009511 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009512 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009513 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009514 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009515 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009516 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009517 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009518 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009519 if (tmp == NULL || tmp == Py_None) {
9520 Py_CLEAR(tmp);
9521 annotation = NULL;
9522 }
9523 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009524 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009525 res = obj2ast_expr(state, tmp, &annotation, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009526 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009527 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009528 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009529 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009530 return 1;
9531 }
9532 if (tmp == NULL || tmp == Py_None) {
9533 Py_CLEAR(tmp);
9534 type_comment = NULL;
9535 }
9536 else {
9537 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009538 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009539 if (res != 0) goto failed;
9540 Py_CLEAR(tmp);
9541 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009542 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009543 return 1;
9544 }
9545 if (tmp == NULL) {
9546 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
9547 return 1;
9548 }
9549 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009550 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009551 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009552 if (res != 0) goto failed;
9553 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009554 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009555 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01009556 return 1;
9557 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009558 if (tmp == NULL) {
9559 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
9560 return 1;
9561 }
9562 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009563 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009564 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009565 if (res != 0) goto failed;
9566 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01009567 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009568 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009569 return 1;
9570 }
9571 if (tmp == NULL || tmp == Py_None) {
9572 Py_CLEAR(tmp);
9573 end_lineno = 0;
9574 }
9575 else {
9576 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009577 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009578 if (res != 0) goto failed;
9579 Py_CLEAR(tmp);
9580 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009581 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009582 return 1;
9583 }
9584 if (tmp == NULL || tmp == Py_None) {
9585 Py_CLEAR(tmp);
9586 end_col_offset = 0;
9587 }
9588 else {
9589 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009590 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009591 if (res != 0) goto failed;
9592 Py_CLEAR(tmp);
9593 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009594 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
9595 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009596 return 0;
9597failed:
9598 Py_XDECREF(tmp);
9599 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009600}
9601
9602int
Victor Stinnerf8599272020-07-03 16:57:19 +02009603obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* out, PyArena*
9604 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009605{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009606 PyObject* tmp = NULL;
9607 identifier arg;
9608 expr_ty value;
Pablo Galindo168660b2020-04-02 00:47:39 +01009609 int lineno;
9610 int col_offset;
9611 int end_lineno;
9612 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009613
Victor Stinnerf8599272020-07-03 16:57:19 +02009614 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009615 return 1;
9616 }
9617 if (tmp == NULL || tmp == Py_None) {
9618 Py_CLEAR(tmp);
9619 arg = NULL;
9620 }
9621 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009622 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009623 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009624 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009625 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009626 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009627 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009628 return 1;
9629 }
9630 if (tmp == NULL) {
9631 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
9632 return 1;
9633 }
9634 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009635 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009636 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009637 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009638 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009639 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009640 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009641 return 1;
9642 }
9643 if (tmp == NULL) {
9644 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from keyword");
9645 return 1;
9646 }
9647 else {
9648 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009649 res = obj2ast_int(state, tmp, &lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009650 if (res != 0) goto failed;
9651 Py_CLEAR(tmp);
9652 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009653 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009654 return 1;
9655 }
9656 if (tmp == NULL) {
9657 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from keyword");
9658 return 1;
9659 }
9660 else {
9661 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009662 res = obj2ast_int(state, tmp, &col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009663 if (res != 0) goto failed;
9664 Py_CLEAR(tmp);
9665 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009666 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009667 return 1;
9668 }
9669 if (tmp == NULL || tmp == Py_None) {
9670 Py_CLEAR(tmp);
9671 end_lineno = 0;
9672 }
9673 else {
9674 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009675 res = obj2ast_int(state, tmp, &end_lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009676 if (res != 0) goto failed;
9677 Py_CLEAR(tmp);
9678 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009679 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009680 return 1;
9681 }
9682 if (tmp == NULL || tmp == Py_None) {
9683 Py_CLEAR(tmp);
9684 end_col_offset = 0;
9685 }
9686 else {
9687 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009688 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009689 if (res != 0) goto failed;
9690 Py_CLEAR(tmp);
9691 }
9692 *out = keyword(arg, value, lineno, col_offset, end_lineno, end_col_offset,
9693 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009694 return 0;
9695failed:
9696 Py_XDECREF(tmp);
9697 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009698}
9699
9700int
Victor Stinnerf8599272020-07-03 16:57:19 +02009701obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, PyArena*
9702 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009703{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009704 PyObject* tmp = NULL;
9705 identifier name;
9706 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009707
Victor Stinnerf8599272020-07-03 16:57:19 +02009708 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009709 return 1;
9710 }
9711 if (tmp == NULL) {
9712 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
9713 return 1;
9714 }
9715 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009716 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009717 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009718 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009719 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009720 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009721 if (_PyObject_LookupAttr(obj, state->asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009722 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009723 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009724 if (tmp == NULL || tmp == Py_None) {
9725 Py_CLEAR(tmp);
9726 asname = NULL;
9727 }
9728 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009729 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009730 res = obj2ast_identifier(state, tmp, &asname, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009731 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009732 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009733 }
9734 *out = alias(name, asname, arena);
9735 return 0;
9736failed:
9737 Py_XDECREF(tmp);
9738 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009739}
9740
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009741int
Victor Stinnerf8599272020-07-03 16:57:19 +02009742obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* out,
9743 PyArena* arena)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009744{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009745 PyObject* tmp = NULL;
9746 expr_ty context_expr;
9747 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009748
Victor Stinnerf8599272020-07-03 16:57:19 +02009749 if (_PyObject_LookupAttr(obj, state->context_expr, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009750 return 1;
9751 }
9752 if (tmp == NULL) {
9753 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
9754 return 1;
9755 }
9756 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009757 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009758 res = obj2ast_expr(state, tmp, &context_expr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009759 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009760 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009761 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009762 if (_PyObject_LookupAttr(obj, state->optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009763 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009764 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009765 if (tmp == NULL || tmp == Py_None) {
9766 Py_CLEAR(tmp);
9767 optional_vars = NULL;
9768 }
9769 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009770 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009771 res = obj2ast_expr(state, tmp, &optional_vars, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009772 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009773 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009774 }
9775 *out = withitem(context_expr, optional_vars, arena);
9776 return 0;
9777failed:
9778 Py_XDECREF(tmp);
9779 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009780}
9781
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009782int
Victor Stinnerf8599272020-07-03 16:57:19 +02009783obj2ast_type_ignore(astmodulestate *state, PyObject* obj, type_ignore_ty* out,
9784 PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009785{
9786 int isinstance;
9787
9788 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009789 PyObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009790
9791 if (obj == Py_None) {
9792 *out = NULL;
9793 return 0;
9794 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009795 tp = state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009796 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009797 if (isinstance == -1) {
9798 return 1;
9799 }
9800 if (isinstance) {
9801 int lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009802 string tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009803
Victor Stinnerf8599272020-07-03 16:57:19 +02009804 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009805 return 1;
9806 }
9807 if (tmp == NULL) {
9808 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
9809 return 1;
9810 }
9811 else {
9812 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009813 res = obj2ast_int(state, tmp, &lineno, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009814 if (res != 0) goto failed;
9815 Py_CLEAR(tmp);
9816 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009817 if (_PyObject_LookupAttr(obj, state->tag, &tmp) < 0) {
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009818 return 1;
9819 }
9820 if (tmp == NULL) {
9821 PyErr_SetString(PyExc_TypeError, "required field \"tag\" missing from TypeIgnore");
9822 return 1;
9823 }
9824 else {
9825 int res;
Victor Stinnerf8599272020-07-03 16:57:19 +02009826 res = obj2ast_string(state, tmp, &tag, arena);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009827 if (res != 0) goto failed;
9828 Py_CLEAR(tmp);
9829 }
9830 *out = TypeIgnore(lineno, tag, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009831 if (*out == NULL) goto failed;
9832 return 0;
9833 }
9834
9835 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
9836 failed:
9837 Py_XDECREF(tmp);
9838 return 1;
9839}
9840
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009841
Martin v. Löwis577b5b92006-02-27 15:23:19 +00009842PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00009843PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00009844{
Victor Stinnerf8599272020-07-03 16:57:19 +02009845 PyObject *m = PyModule_Create(&_astmodule);
9846 if (!m) {
9847 return NULL;
9848 }
9849 astmodulestate *state = get_ast_state(m);
9850
9851 if (!init_types()) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009852 goto error;
9853 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009854 if (PyModule_AddObject(m, "AST", state->AST_type) < 0) {
9855 goto error;
9856 }
9857 Py_INCREF(state->AST_type);
Brandt Bucherd2f96672020-02-06 06:45:46 -08009858 if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {
9859 goto error;
9860 }
9861 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {
9862 goto error;
9863 }
9864 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {
9865 goto error;
9866 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009867 if (PyModule_AddObject(m, "mod", state->mod_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009868 goto error;
9869 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009870 Py_INCREF(state->mod_type);
9871 if (PyModule_AddObject(m, "Module", state->Module_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009872 goto error;
9873 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009874 Py_INCREF(state->Module_type);
9875 if (PyModule_AddObject(m, "Interactive", state->Interactive_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009876 goto error;
9877 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009878 Py_INCREF(state->Interactive_type);
9879 if (PyModule_AddObject(m, "Expression", state->Expression_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009880 goto error;
9881 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009882 Py_INCREF(state->Expression_type);
9883 if (PyModule_AddObject(m, "FunctionType", state->FunctionType_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009884 goto error;
9885 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009886 Py_INCREF(state->FunctionType_type);
9887 if (PyModule_AddObject(m, "stmt", state->stmt_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009888 goto error;
9889 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009890 Py_INCREF(state->stmt_type);
9891 if (PyModule_AddObject(m, "FunctionDef", state->FunctionDef_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -08009892 goto error;
9893 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009894 Py_INCREF(state->FunctionDef_type);
9895 if (PyModule_AddObject(m, "AsyncFunctionDef", state->AsyncFunctionDef_type)
Brandt Bucherd2f96672020-02-06 06:45:46 -08009896 < 0) {
9897 goto error;
9898 }
Victor Stinnerf8599272020-07-03 16:57:19 +02009899 Py_INCREF(state->AsyncFunctionDef_type);
9900 if (PyModule_AddObject(m, "ClassDef", state->ClassDef_type) < 0) {
9901 goto error;
9902 }
9903 Py_INCREF(state->ClassDef_type);
9904 if (PyModule_AddObject(m, "Return", state->Return_type) < 0) {
9905 goto error;
9906 }
9907 Py_INCREF(state->Return_type);
9908 if (PyModule_AddObject(m, "Delete", state->Delete_type) < 0) {
9909 goto error;
9910 }
9911 Py_INCREF(state->Delete_type);
9912 if (PyModule_AddObject(m, "Assign", state->Assign_type) < 0) {
9913 goto error;
9914 }
9915 Py_INCREF(state->Assign_type);
9916 if (PyModule_AddObject(m, "AugAssign", state->AugAssign_type) < 0) {
9917 goto error;
9918 }
9919 Py_INCREF(state->AugAssign_type);
9920 if (PyModule_AddObject(m, "AnnAssign", state->AnnAssign_type) < 0) {
9921 goto error;
9922 }
9923 Py_INCREF(state->AnnAssign_type);
9924 if (PyModule_AddObject(m, "For", state->For_type) < 0) {
9925 goto error;
9926 }
9927 Py_INCREF(state->For_type);
9928 if (PyModule_AddObject(m, "AsyncFor", state->AsyncFor_type) < 0) {
9929 goto error;
9930 }
9931 Py_INCREF(state->AsyncFor_type);
9932 if (PyModule_AddObject(m, "While", state->While_type) < 0) {
9933 goto error;
9934 }
9935 Py_INCREF(state->While_type);
9936 if (PyModule_AddObject(m, "If", state->If_type) < 0) {
9937 goto error;
9938 }
9939 Py_INCREF(state->If_type);
9940 if (PyModule_AddObject(m, "With", state->With_type) < 0) {
9941 goto error;
9942 }
9943 Py_INCREF(state->With_type);
9944 if (PyModule_AddObject(m, "AsyncWith", state->AsyncWith_type) < 0) {
9945 goto error;
9946 }
9947 Py_INCREF(state->AsyncWith_type);
9948 if (PyModule_AddObject(m, "Raise", state->Raise_type) < 0) {
9949 goto error;
9950 }
9951 Py_INCREF(state->Raise_type);
9952 if (PyModule_AddObject(m, "Try", state->Try_type) < 0) {
9953 goto error;
9954 }
9955 Py_INCREF(state->Try_type);
9956 if (PyModule_AddObject(m, "Assert", state->Assert_type) < 0) {
9957 goto error;
9958 }
9959 Py_INCREF(state->Assert_type);
9960 if (PyModule_AddObject(m, "Import", state->Import_type) < 0) {
9961 goto error;
9962 }
9963 Py_INCREF(state->Import_type);
9964 if (PyModule_AddObject(m, "ImportFrom", state->ImportFrom_type) < 0) {
9965 goto error;
9966 }
9967 Py_INCREF(state->ImportFrom_type);
9968 if (PyModule_AddObject(m, "Global", state->Global_type) < 0) {
9969 goto error;
9970 }
9971 Py_INCREF(state->Global_type);
9972 if (PyModule_AddObject(m, "Nonlocal", state->Nonlocal_type) < 0) {
9973 goto error;
9974 }
9975 Py_INCREF(state->Nonlocal_type);
9976 if (PyModule_AddObject(m, "Expr", state->Expr_type) < 0) {
9977 goto error;
9978 }
9979 Py_INCREF(state->Expr_type);
9980 if (PyModule_AddObject(m, "Pass", state->Pass_type) < 0) {
9981 goto error;
9982 }
9983 Py_INCREF(state->Pass_type);
9984 if (PyModule_AddObject(m, "Break", state->Break_type) < 0) {
9985 goto error;
9986 }
9987 Py_INCREF(state->Break_type);
9988 if (PyModule_AddObject(m, "Continue", state->Continue_type) < 0) {
9989 goto error;
9990 }
9991 Py_INCREF(state->Continue_type);
9992 if (PyModule_AddObject(m, "expr", state->expr_type) < 0) {
9993 goto error;
9994 }
9995 Py_INCREF(state->expr_type);
9996 if (PyModule_AddObject(m, "BoolOp", state->BoolOp_type) < 0) {
9997 goto error;
9998 }
9999 Py_INCREF(state->BoolOp_type);
10000 if (PyModule_AddObject(m, "NamedExpr", state->NamedExpr_type) < 0) {
10001 goto error;
10002 }
10003 Py_INCREF(state->NamedExpr_type);
10004 if (PyModule_AddObject(m, "BinOp", state->BinOp_type) < 0) {
10005 goto error;
10006 }
10007 Py_INCREF(state->BinOp_type);
10008 if (PyModule_AddObject(m, "UnaryOp", state->UnaryOp_type) < 0) {
10009 goto error;
10010 }
10011 Py_INCREF(state->UnaryOp_type);
10012 if (PyModule_AddObject(m, "Lambda", state->Lambda_type) < 0) {
10013 goto error;
10014 }
10015 Py_INCREF(state->Lambda_type);
10016 if (PyModule_AddObject(m, "IfExp", state->IfExp_type) < 0) {
10017 goto error;
10018 }
10019 Py_INCREF(state->IfExp_type);
10020 if (PyModule_AddObject(m, "Dict", state->Dict_type) < 0) {
10021 goto error;
10022 }
10023 Py_INCREF(state->Dict_type);
10024 if (PyModule_AddObject(m, "Set", state->Set_type) < 0) {
10025 goto error;
10026 }
10027 Py_INCREF(state->Set_type);
10028 if (PyModule_AddObject(m, "ListComp", state->ListComp_type) < 0) {
10029 goto error;
10030 }
10031 Py_INCREF(state->ListComp_type);
10032 if (PyModule_AddObject(m, "SetComp", state->SetComp_type) < 0) {
10033 goto error;
10034 }
10035 Py_INCREF(state->SetComp_type);
10036 if (PyModule_AddObject(m, "DictComp", state->DictComp_type) < 0) {
10037 goto error;
10038 }
10039 Py_INCREF(state->DictComp_type);
10040 if (PyModule_AddObject(m, "GeneratorExp", state->GeneratorExp_type) < 0) {
10041 goto error;
10042 }
10043 Py_INCREF(state->GeneratorExp_type);
10044 if (PyModule_AddObject(m, "Await", state->Await_type) < 0) {
10045 goto error;
10046 }
10047 Py_INCREF(state->Await_type);
10048 if (PyModule_AddObject(m, "Yield", state->Yield_type) < 0) {
10049 goto error;
10050 }
10051 Py_INCREF(state->Yield_type);
10052 if (PyModule_AddObject(m, "YieldFrom", state->YieldFrom_type) < 0) {
10053 goto error;
10054 }
10055 Py_INCREF(state->YieldFrom_type);
10056 if (PyModule_AddObject(m, "Compare", state->Compare_type) < 0) {
10057 goto error;
10058 }
10059 Py_INCREF(state->Compare_type);
10060 if (PyModule_AddObject(m, "Call", state->Call_type) < 0) {
10061 goto error;
10062 }
10063 Py_INCREF(state->Call_type);
10064 if (PyModule_AddObject(m, "FormattedValue", state->FormattedValue_type) <
Brandt Bucherd2f96672020-02-06 06:45:46 -080010065 0) {
10066 goto error;
10067 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010068 Py_INCREF(state->FormattedValue_type);
10069 if (PyModule_AddObject(m, "JoinedStr", state->JoinedStr_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010070 goto error;
10071 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010072 Py_INCREF(state->JoinedStr_type);
10073 if (PyModule_AddObject(m, "Constant", state->Constant_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010074 goto error;
10075 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010076 Py_INCREF(state->Constant_type);
10077 if (PyModule_AddObject(m, "Attribute", state->Attribute_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010078 goto error;
10079 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010080 Py_INCREF(state->Attribute_type);
10081 if (PyModule_AddObject(m, "Subscript", state->Subscript_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010082 goto error;
10083 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010084 Py_INCREF(state->Subscript_type);
10085 if (PyModule_AddObject(m, "Starred", state->Starred_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010086 goto error;
10087 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010088 Py_INCREF(state->Starred_type);
10089 if (PyModule_AddObject(m, "Name", state->Name_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010090 goto error;
10091 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010092 Py_INCREF(state->Name_type);
10093 if (PyModule_AddObject(m, "List", state->List_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010094 goto error;
10095 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010096 Py_INCREF(state->List_type);
10097 if (PyModule_AddObject(m, "Tuple", state->Tuple_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010098 goto error;
10099 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010100 Py_INCREF(state->Tuple_type);
10101 if (PyModule_AddObject(m, "Slice", state->Slice_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010102 goto error;
10103 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010104 Py_INCREF(state->Slice_type);
10105 if (PyModule_AddObject(m, "expr_context", state->expr_context_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010106 goto error;
10107 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010108 Py_INCREF(state->expr_context_type);
10109 if (PyModule_AddObject(m, "Load", state->Load_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010110 goto error;
10111 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010112 Py_INCREF(state->Load_type);
10113 if (PyModule_AddObject(m, "Store", state->Store_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010114 goto error;
10115 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010116 Py_INCREF(state->Store_type);
10117 if (PyModule_AddObject(m, "Del", state->Del_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010118 goto error;
10119 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010120 Py_INCREF(state->Del_type);
10121 if (PyModule_AddObject(m, "boolop", state->boolop_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010122 goto error;
10123 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010124 Py_INCREF(state->boolop_type);
10125 if (PyModule_AddObject(m, "And", state->And_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010126 goto error;
10127 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010128 Py_INCREF(state->And_type);
10129 if (PyModule_AddObject(m, "Or", state->Or_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010130 goto error;
10131 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010132 Py_INCREF(state->Or_type);
10133 if (PyModule_AddObject(m, "operator", state->operator_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010134 goto error;
10135 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010136 Py_INCREF(state->operator_type);
10137 if (PyModule_AddObject(m, "Add", state->Add_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010138 goto error;
10139 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010140 Py_INCREF(state->Add_type);
10141 if (PyModule_AddObject(m, "Sub", state->Sub_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010142 goto error;
10143 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010144 Py_INCREF(state->Sub_type);
10145 if (PyModule_AddObject(m, "Mult", state->Mult_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010146 goto error;
10147 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010148 Py_INCREF(state->Mult_type);
10149 if (PyModule_AddObject(m, "MatMult", state->MatMult_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010150 goto error;
10151 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010152 Py_INCREF(state->MatMult_type);
10153 if (PyModule_AddObject(m, "Div", state->Div_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010154 goto error;
10155 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010156 Py_INCREF(state->Div_type);
10157 if (PyModule_AddObject(m, "Mod", state->Mod_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010158 goto error;
10159 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010160 Py_INCREF(state->Mod_type);
10161 if (PyModule_AddObject(m, "Pow", state->Pow_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010162 goto error;
10163 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010164 Py_INCREF(state->Pow_type);
10165 if (PyModule_AddObject(m, "LShift", state->LShift_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010166 goto error;
10167 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010168 Py_INCREF(state->LShift_type);
10169 if (PyModule_AddObject(m, "RShift", state->RShift_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010170 goto error;
10171 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010172 Py_INCREF(state->RShift_type);
10173 if (PyModule_AddObject(m, "BitOr", state->BitOr_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010174 goto error;
10175 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010176 Py_INCREF(state->BitOr_type);
10177 if (PyModule_AddObject(m, "BitXor", state->BitXor_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010178 goto error;
10179 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010180 Py_INCREF(state->BitXor_type);
10181 if (PyModule_AddObject(m, "BitAnd", state->BitAnd_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010182 goto error;
10183 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010184 Py_INCREF(state->BitAnd_type);
10185 if (PyModule_AddObject(m, "FloorDiv", state->FloorDiv_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010186 goto error;
10187 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010188 Py_INCREF(state->FloorDiv_type);
10189 if (PyModule_AddObject(m, "unaryop", state->unaryop_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010190 goto error;
10191 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010192 Py_INCREF(state->unaryop_type);
10193 if (PyModule_AddObject(m, "Invert", state->Invert_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010194 goto error;
10195 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010196 Py_INCREF(state->Invert_type);
10197 if (PyModule_AddObject(m, "Not", state->Not_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010198 goto error;
10199 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010200 Py_INCREF(state->Not_type);
10201 if (PyModule_AddObject(m, "UAdd", state->UAdd_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010202 goto error;
10203 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010204 Py_INCREF(state->UAdd_type);
10205 if (PyModule_AddObject(m, "USub", state->USub_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010206 goto error;
10207 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010208 Py_INCREF(state->USub_type);
10209 if (PyModule_AddObject(m, "cmpop", state->cmpop_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010210 goto error;
10211 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010212 Py_INCREF(state->cmpop_type);
10213 if (PyModule_AddObject(m, "Eq", state->Eq_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010214 goto error;
10215 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010216 Py_INCREF(state->Eq_type);
10217 if (PyModule_AddObject(m, "NotEq", state->NotEq_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010218 goto error;
10219 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010220 Py_INCREF(state->NotEq_type);
10221 if (PyModule_AddObject(m, "Lt", state->Lt_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010222 goto error;
10223 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010224 Py_INCREF(state->Lt_type);
10225 if (PyModule_AddObject(m, "LtE", state->LtE_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010226 goto error;
10227 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010228 Py_INCREF(state->LtE_type);
10229 if (PyModule_AddObject(m, "Gt", state->Gt_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010230 goto error;
10231 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010232 Py_INCREF(state->Gt_type);
10233 if (PyModule_AddObject(m, "GtE", state->GtE_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010234 goto error;
10235 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010236 Py_INCREF(state->GtE_type);
10237 if (PyModule_AddObject(m, "Is", state->Is_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010238 goto error;
10239 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010240 Py_INCREF(state->Is_type);
10241 if (PyModule_AddObject(m, "IsNot", state->IsNot_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010242 goto error;
10243 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010244 Py_INCREF(state->IsNot_type);
10245 if (PyModule_AddObject(m, "In", state->In_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010246 goto error;
10247 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010248 Py_INCREF(state->In_type);
10249 if (PyModule_AddObject(m, "NotIn", state->NotIn_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010250 goto error;
10251 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010252 Py_INCREF(state->NotIn_type);
10253 if (PyModule_AddObject(m, "comprehension", state->comprehension_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010254 goto error;
10255 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010256 Py_INCREF(state->comprehension_type);
10257 if (PyModule_AddObject(m, "excepthandler", state->excepthandler_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010258 goto error;
10259 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010260 Py_INCREF(state->excepthandler_type);
10261 if (PyModule_AddObject(m, "ExceptHandler", state->ExceptHandler_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010262 goto error;
10263 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010264 Py_INCREF(state->ExceptHandler_type);
10265 if (PyModule_AddObject(m, "arguments", state->arguments_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010266 goto error;
10267 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010268 Py_INCREF(state->arguments_type);
10269 if (PyModule_AddObject(m, "arg", state->arg_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010270 goto error;
10271 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010272 Py_INCREF(state->arg_type);
10273 if (PyModule_AddObject(m, "keyword", state->keyword_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010274 goto error;
10275 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010276 Py_INCREF(state->keyword_type);
10277 if (PyModule_AddObject(m, "alias", state->alias_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010278 goto error;
10279 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010280 Py_INCREF(state->alias_type);
10281 if (PyModule_AddObject(m, "withitem", state->withitem_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010282 goto error;
10283 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010284 Py_INCREF(state->withitem_type);
10285 if (PyModule_AddObject(m, "type_ignore", state->type_ignore_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010286 goto error;
10287 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010288 Py_INCREF(state->type_ignore_type);
10289 if (PyModule_AddObject(m, "TypeIgnore", state->TypeIgnore_type) < 0) {
Brandt Bucherd2f96672020-02-06 06:45:46 -080010290 goto error;
10291 }
Victor Stinnerf8599272020-07-03 16:57:19 +020010292 Py_INCREF(state->TypeIgnore_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +020010293 return m;
Victor Stinnerf8599272020-07-03 16:57:19 +020010294
Brandt Bucherd2f96672020-02-06 06:45:46 -080010295error:
10296 Py_DECREF(m);
10297 return NULL;
Martin v. Löwis577b5b92006-02-27 15:23:19 +000010298}
10299
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010300
Martin v. Löwisbd260da2006-02-26 19:42:26 +000010301PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010302{
Victor Stinnerf8599272020-07-03 16:57:19 +020010303 if (!init_types()) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010304 return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +020010305 }
10306
10307 astmodulestate *state = get_global_ast_state();
10308 return ast2obj_mod(state, t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010309}
Martin v. Löwis5b222132007-06-10 09:51:05 +000010310
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010311/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
10312mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010313{
Serhiy Storchaka43c97312019-09-10 13:02:30 +030010314 const char * const req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010315 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010316
Steve Dowerb82e17e2019-05-23 08:45:22 -070010317 if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
10318 return NULL;
10319 }
10320
Victor Stinnerf8599272020-07-03 16:57:19 +020010321 astmodulestate *state = get_global_ast_state();
10322 PyObject *req_type[3];
10323 req_type[0] = state->Module_type;
10324 req_type[1] = state->Expression_type;
10325 req_type[2] = state->Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010326
Guido van Rossum3a32e3b2019-02-01 11:37:34 -080010327 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010328
Victor Stinnerf8599272020-07-03 16:57:19 +020010329 if (!init_types()) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010330 return NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +020010331 }
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010332
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010333 isinstance = PyObject_IsInstance(ast, req_type[mode]);
10334 if (isinstance == -1)
10335 return NULL;
10336 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010337 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
Dino Viehlandac46eb42019-09-11 10:16:34 -070010338 req_name[mode], _PyType_Name(Py_TYPE(ast)));
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010339 return NULL;
10340 }
Dong-hee Naa05fcd32019-10-10 16:41:26 +090010341
10342 mod_ty res = NULL;
Victor Stinnerf8599272020-07-03 16:57:19 +020010343 if (obj2ast_mod(state, ast, &res, arena) != 0)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010344 return NULL;
10345 else
10346 return res;
10347}
10348
10349int PyAST_Check(PyObject* obj)
10350{
Victor Stinnerf8599272020-07-03 16:57:19 +020010351 if (!init_types()) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010352 return -1;
Victor Stinnerf8599272020-07-03 16:57:19 +020010353 }
10354
10355 astmodulestate *state = get_global_ast_state();
10356 return PyObject_IsInstance(obj, state->AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010357}
10358
Martin v. Löwis5b222132007-06-10 09:51:05 +000010359