blob: a333ff95b110d7024fa24809d7f358a56cf6c300 [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"
7
Neal Norwitz207c9f32008-03-31 04:42:11 +00008static PyTypeObject AST_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +00009static PyTypeObject *mod_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +000010static PyObject* ast2obj_mod(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000011static PyTypeObject *Module_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020012_Py_IDENTIFIER(body);
Neal Norwitz53d960c2006-02-28 22:47:29 +000013static char *Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020014 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000015};
Neal Norwitz53d960c2006-02-28 22:47:29 +000016static PyTypeObject *Interactive_type;
17static char *Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020018 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000019};
Neal Norwitz53d960c2006-02-28 22:47:29 +000020static PyTypeObject *Expression_type;
21static char *Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020022 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000023};
Neal Norwitz53d960c2006-02-28 22:47:29 +000024static PyTypeObject *Suite_type;
25static char *Suite_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020026 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000027};
Neal Norwitz53d960c2006-02-28 22:47:29 +000028static PyTypeObject *stmt_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020029_Py_IDENTIFIER(lineno);
30_Py_IDENTIFIER(col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +000031_Py_IDENTIFIER(end_lineno);
32_Py_IDENTIFIER(end_col_offset);
Neal Norwitz53d960c2006-02-28 22:47:29 +000033static char *stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +020034 "lineno",
35 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +000036 "end_lineno",
37 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +000038};
Martin v. Löwisbd260da2006-02-26 19:42:26 +000039static PyObject* ast2obj_stmt(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000040static PyTypeObject *FunctionDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020041_Py_IDENTIFIER(name);
42_Py_IDENTIFIER(args);
43_Py_IDENTIFIER(decorator_list);
44_Py_IDENTIFIER(returns);
Neal Norwitz53d960c2006-02-28 22:47:29 +000045static char *FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020046 "name",
47 "args",
48 "body",
49 "decorator_list",
50 "returns",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000051};
Yury Selivanov75445082015-05-11 22:57:16 -040052static PyTypeObject *AsyncFunctionDef_type;
53static char *AsyncFunctionDef_fields[]={
54 "name",
55 "args",
56 "body",
57 "decorator_list",
58 "returns",
59};
Neal Norwitz53d960c2006-02-28 22:47:29 +000060static PyTypeObject *ClassDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020061_Py_IDENTIFIER(bases);
62_Py_IDENTIFIER(keywords);
Neal Norwitz53d960c2006-02-28 22:47:29 +000063static char *ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020064 "name",
65 "bases",
66 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +020067 "body",
68 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000069};
Neal Norwitz53d960c2006-02-28 22:47:29 +000070static PyTypeObject *Return_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020071_Py_IDENTIFIER(value);
Neal Norwitz53d960c2006-02-28 22:47:29 +000072static char *Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020073 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000074};
Neal Norwitz53d960c2006-02-28 22:47:29 +000075static PyTypeObject *Delete_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020076_Py_IDENTIFIER(targets);
Neal Norwitz53d960c2006-02-28 22:47:29 +000077static char *Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020078 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000079};
Neal Norwitz53d960c2006-02-28 22:47:29 +000080static PyTypeObject *Assign_type;
81static char *Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020082 "targets",
83 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000084};
Neal Norwitz53d960c2006-02-28 22:47:29 +000085static PyTypeObject *AugAssign_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020086_Py_IDENTIFIER(target);
87_Py_IDENTIFIER(op);
Neal Norwitz53d960c2006-02-28 22:47:29 +000088static char *AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020089 "target",
90 "op",
91 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000092};
Yury Selivanovf8cb8a12016-09-08 20:50:03 -070093static PyTypeObject *AnnAssign_type;
94_Py_IDENTIFIER(annotation);
95_Py_IDENTIFIER(simple);
96static char *AnnAssign_fields[]={
97 "target",
98 "annotation",
99 "value",
100 "simple",
101};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000102static PyTypeObject *For_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200103_Py_IDENTIFIER(iter);
104_Py_IDENTIFIER(orelse);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000105static char *For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200106 "target",
107 "iter",
108 "body",
109 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000110};
Yury Selivanov75445082015-05-11 22:57:16 -0400111static PyTypeObject *AsyncFor_type;
112static char *AsyncFor_fields[]={
113 "target",
114 "iter",
115 "body",
116 "orelse",
117};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000118static PyTypeObject *While_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200119_Py_IDENTIFIER(test);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000120static char *While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200121 "test",
122 "body",
123 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000124};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000125static PyTypeObject *If_type;
126static char *If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200127 "test",
128 "body",
129 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000130};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000131static PyTypeObject *With_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200132_Py_IDENTIFIER(items);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000133static char *With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200134 "items",
135 "body",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000136};
Yury Selivanov75445082015-05-11 22:57:16 -0400137static PyTypeObject *AsyncWith_type;
138static char *AsyncWith_fields[]={
139 "items",
140 "body",
141};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000142static PyTypeObject *Raise_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200143_Py_IDENTIFIER(exc);
144_Py_IDENTIFIER(cause);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000145static char *Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200146 "exc",
147 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000148};
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500149static PyTypeObject *Try_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200150_Py_IDENTIFIER(handlers);
151_Py_IDENTIFIER(finalbody);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500152static char *Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200153 "body",
154 "handlers",
155 "orelse",
156 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000157};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000158static PyTypeObject *Assert_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200159_Py_IDENTIFIER(msg);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000160static char *Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200161 "test",
162 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000163};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000164static PyTypeObject *Import_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200165_Py_IDENTIFIER(names);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000166static char *Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200167 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000168};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000169static PyTypeObject *ImportFrom_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200170_Py_IDENTIFIER(module);
171_Py_IDENTIFIER(level);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000172static char *ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200173 "module",
174 "names",
175 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000176};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000177static PyTypeObject *Global_type;
178static char *Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200179 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000180};
Jeremy Hylton81e95022007-02-27 06:50:52 +0000181static PyTypeObject *Nonlocal_type;
182static char *Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200183 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000184};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000185static PyTypeObject *Expr_type;
186static char *Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200187 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000188};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000189static PyTypeObject *Pass_type;
190static PyTypeObject *Break_type;
191static PyTypeObject *Continue_type;
192static PyTypeObject *expr_type;
193static char *expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200194 "lineno",
195 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000196 "end_lineno",
197 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000198};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000199static PyObject* ast2obj_expr(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000200static PyTypeObject *BoolOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200201_Py_IDENTIFIER(values);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000202static char *BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200203 "op",
204 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000205};
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700206static PyTypeObject *NamedExpr_type;
207static char *NamedExpr_fields[]={
208 "target",
209 "value",
210};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000211static PyTypeObject *BinOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200212_Py_IDENTIFIER(left);
213_Py_IDENTIFIER(right);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000214static char *BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200215 "left",
216 "op",
217 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000218};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000219static PyTypeObject *UnaryOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200220_Py_IDENTIFIER(operand);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000221static char *UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200222 "op",
223 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000224};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000225static PyTypeObject *Lambda_type;
226static char *Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200227 "args",
228 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000229};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000230static PyTypeObject *IfExp_type;
231static char *IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200232 "test",
233 "body",
234 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000235};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000236static PyTypeObject *Dict_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200237_Py_IDENTIFIER(keys);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000238static char *Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200239 "keys",
240 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000241};
Guido van Rossum86e58e22006-08-28 15:27:34 +0000242static PyTypeObject *Set_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200243_Py_IDENTIFIER(elts);
Guido van Rossum86e58e22006-08-28 15:27:34 +0000244static char *Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200245 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000246};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000247static PyTypeObject *ListComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200248_Py_IDENTIFIER(elt);
249_Py_IDENTIFIER(generators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000250static char *ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200251 "elt",
252 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000253};
Nick Coghlan650f0d02007-04-15 12:05:43 +0000254static PyTypeObject *SetComp_type;
255static char *SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200256 "elt",
257 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000258};
Guido van Rossum992d4a32007-07-11 13:09:30 +0000259static PyTypeObject *DictComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200260_Py_IDENTIFIER(key);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000261static char *DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200262 "key",
263 "value",
264 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000265};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000266static PyTypeObject *GeneratorExp_type;
267static char *GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200268 "elt",
269 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000270};
Yury Selivanov75445082015-05-11 22:57:16 -0400271static PyTypeObject *Await_type;
272static char *Await_fields[]={
273 "value",
274};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000275static PyTypeObject *Yield_type;
276static char *Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200277 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500278};
279static PyTypeObject *YieldFrom_type;
280static char *YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200281 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000282};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000283static PyTypeObject *Compare_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200284_Py_IDENTIFIER(ops);
285_Py_IDENTIFIER(comparators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000286static char *Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200287 "left",
288 "ops",
289 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000290};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000291static PyTypeObject *Call_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200292_Py_IDENTIFIER(func);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000293static char *Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200294 "func",
295 "args",
296 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000297};
Eric V. Smith235a6f02015-09-19 14:51:32 -0400298static PyTypeObject *FormattedValue_type;
299_Py_IDENTIFIER(conversion);
300_Py_IDENTIFIER(format_spec);
301static char *FormattedValue_fields[]={
302 "value",
303 "conversion",
304 "format_spec",
305};
306static PyTypeObject *JoinedStr_type;
307static char *JoinedStr_fields[]={
308 "values",
309};
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100310static PyTypeObject *Constant_type;
311static char *Constant_fields[]={
312 "value",
313};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000314static PyTypeObject *Attribute_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200315_Py_IDENTIFIER(attr);
316_Py_IDENTIFIER(ctx);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000317static char *Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200318 "value",
319 "attr",
320 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000321};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000322static PyTypeObject *Subscript_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200323_Py_IDENTIFIER(slice);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000324static char *Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200325 "value",
326 "slice",
327 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000328};
Guido van Rossum0368b722007-05-11 16:50:42 +0000329static PyTypeObject *Starred_type;
330static char *Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200331 "value",
332 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000333};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000334static PyTypeObject *Name_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200335_Py_IDENTIFIER(id);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000336static char *Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200337 "id",
338 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000339};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000340static PyTypeObject *List_type;
341static char *List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200342 "elts",
343 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000344};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000345static PyTypeObject *Tuple_type;
346static char *Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200347 "elts",
348 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000349};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000350static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000351static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700352*AugLoad_singleton, *AugStore_singleton, *Param_singleton,
353*NamedStore_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000354static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000355static PyTypeObject *Load_type;
356static PyTypeObject *Store_type;
357static PyTypeObject *Del_type;
358static PyTypeObject *AugLoad_type;
359static PyTypeObject *AugStore_type;
360static PyTypeObject *Param_type;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700361static PyTypeObject *NamedStore_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000362static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000363static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000364static PyTypeObject *Slice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200365_Py_IDENTIFIER(lower);
366_Py_IDENTIFIER(upper);
367_Py_IDENTIFIER(step);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000368static char *Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200369 "lower",
370 "upper",
371 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000372};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000373static PyTypeObject *ExtSlice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200374_Py_IDENTIFIER(dims);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000375static char *ExtSlice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200376 "dims",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000377};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000378static PyTypeObject *Index_type;
379static char *Index_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200380 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000381};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000382static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000383static PyObject *And_singleton, *Or_singleton;
384static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000385static PyTypeObject *And_type;
386static PyTypeObject *Or_type;
387static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000388static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
Benjamin Petersond51374e2014-04-09 23:55:56 -0400389*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton,
390*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton,
391*BitAnd_singleton, *FloorDiv_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000392static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000393static PyTypeObject *Add_type;
394static PyTypeObject *Sub_type;
395static PyTypeObject *Mult_type;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400396static PyTypeObject *MatMult_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000397static PyTypeObject *Div_type;
398static PyTypeObject *Mod_type;
399static PyTypeObject *Pow_type;
400static PyTypeObject *LShift_type;
401static PyTypeObject *RShift_type;
402static PyTypeObject *BitOr_type;
403static PyTypeObject *BitXor_type;
404static PyTypeObject *BitAnd_type;
405static PyTypeObject *FloorDiv_type;
406static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000407static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
408*USub_singleton;
409static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000410static PyTypeObject *Invert_type;
411static PyTypeObject *Not_type;
412static PyTypeObject *UAdd_type;
413static PyTypeObject *USub_type;
414static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000415static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
416*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
417*NotIn_singleton;
418static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000419static PyTypeObject *Eq_type;
420static PyTypeObject *NotEq_type;
421static PyTypeObject *Lt_type;
422static PyTypeObject *LtE_type;
423static PyTypeObject *Gt_type;
424static PyTypeObject *GtE_type;
425static PyTypeObject *Is_type;
426static PyTypeObject *IsNot_type;
427static PyTypeObject *In_type;
428static PyTypeObject *NotIn_type;
429static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000430static PyObject* ast2obj_comprehension(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200431_Py_IDENTIFIER(ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700432_Py_IDENTIFIER(is_async);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000433static char *comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200434 "target",
435 "iter",
436 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700437 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000438};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000439static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000440static char *excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200441 "lineno",
442 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000443 "end_lineno",
444 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000445};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000446static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000447static PyTypeObject *ExceptHandler_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200448_Py_IDENTIFIER(type);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000449static char *ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200450 "type",
451 "name",
452 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000453};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000454static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000455static PyObject* ast2obj_arguments(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200456_Py_IDENTIFIER(vararg);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200457_Py_IDENTIFIER(kwonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200458_Py_IDENTIFIER(kw_defaults);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700459_Py_IDENTIFIER(kwarg);
460_Py_IDENTIFIER(defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000461static char *arguments_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200462 "args",
463 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200464 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200465 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200466 "kwarg",
467 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000468};
Neal Norwitzc1505362006-12-28 06:47:50 +0000469static PyTypeObject *arg_type;
470static PyObject* ast2obj_arg(void*);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700471static char *arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200472 "lineno",
473 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000474 "end_lineno",
475 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700476};
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200477_Py_IDENTIFIER(arg);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000478static char *arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200479 "arg",
480 "annotation",
Neal Norwitzc1505362006-12-28 06:47:50 +0000481};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000482static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000483static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000484static char *keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200485 "arg",
486 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000487};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000488static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000489static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200490_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000491static char *alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200492 "name",
493 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000494};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500495static PyTypeObject *withitem_type;
496static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200497_Py_IDENTIFIER(context_expr);
498_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500499static char *withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200500 "context_expr",
501 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500502};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000503
504
INADA Naokifc489082017-01-25 22:33:43 +0900505_Py_IDENTIFIER(_fields);
506_Py_IDENTIFIER(_attributes);
507
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700508typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100509 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700510 PyObject *dict;
511} AST_object;
512
Benjamin Peterson1767e022012-03-14 21:50:29 -0500513static void
514ast_dealloc(AST_object *self)
515{
INADA Naokia6296d32017-08-24 14:55:17 +0900516 /* bpo-31095: UnTrack is needed before calling any callbacks */
517 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500518 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200519 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500520}
521
Neal Norwitz207c9f32008-03-31 04:42:11 +0000522static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700523ast_traverse(AST_object *self, visitproc visit, void *arg)
524{
525 Py_VISIT(self->dict);
526 return 0;
527}
528
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300529static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700530ast_clear(AST_object *self)
531{
532 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300533 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700534}
535
536static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000537ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
538{
539 Py_ssize_t i, numfields = 0;
540 int res = -1;
541 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200542 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
543 goto cleanup;
544 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000545 if (fields) {
546 numfields = PySequence_Size(fields);
547 if (numfields == -1)
548 goto cleanup;
549 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900550
Neal Norwitz207c9f32008-03-31 04:42:11 +0000551 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900552 if (numfields < PyTuple_GET_SIZE(args)) {
553 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
554 "%zd positional argument%s",
555 Py_TYPE(self)->tp_name,
556 numfields, numfields == 1 ? "" : "s");
557 res = -1;
558 goto cleanup;
559 }
560 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
561 /* cannot be reached when fields is NULL */
562 PyObject *name = PySequence_GetItem(fields, i);
563 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000564 res = -1;
565 goto cleanup;
566 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900567 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
568 Py_DECREF(name);
569 if (res < 0)
570 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000571 }
572 if (kw) {
573 i = 0; /* needed by PyDict_Next */
574 while (PyDict_Next(kw, &i, &key, &value)) {
575 res = PyObject_SetAttr(self, key, value);
576 if (res < 0)
577 goto cleanup;
578 }
579 }
580 cleanup:
581 Py_XDECREF(fields);
582 return res;
583}
584
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000585/* Pickling support */
586static PyObject *
587ast_type_reduce(PyObject *self, PyObject *unused)
588{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200589 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200590 PyObject *dict;
591 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
592 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000593 }
594 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200595 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000596 }
597 return Py_BuildValue("O()", Py_TYPE(self));
598}
599
600static PyMethodDef ast_type_methods[] = {
601 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
602 {NULL}
603};
604
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700605static PyGetSetDef ast_type_getsets[] = {
606 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
607 {NULL}
608};
609
Neal Norwitz207c9f32008-03-31 04:42:11 +0000610static PyTypeObject AST_type = {
611 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000612 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700613 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000614 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500615 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000616 0, /* tp_print */
617 0, /* tp_getattr */
618 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000619 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000620 0, /* tp_repr */
621 0, /* tp_as_number */
622 0, /* tp_as_sequence */
623 0, /* tp_as_mapping */
624 0, /* tp_hash */
625 0, /* tp_call */
626 0, /* tp_str */
627 PyObject_GenericGetAttr, /* tp_getattro */
628 PyObject_GenericSetAttr, /* tp_setattro */
629 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700630 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000631 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700632 (traverseproc)ast_traverse, /* tp_traverse */
633 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000634 0, /* tp_richcompare */
635 0, /* tp_weaklistoffset */
636 0, /* tp_iter */
637 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000638 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000639 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700640 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000641 0, /* tp_base */
642 0, /* tp_dict */
643 0, /* tp_descr_get */
644 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700645 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000646 (initproc)ast_type_init, /* tp_init */
647 PyType_GenericAlloc, /* tp_alloc */
648 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700649 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000650};
651
652
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000653static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
654{
INADA Naokifc489082017-01-25 22:33:43 +0900655 _Py_IDENTIFIER(__module__);
656 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000657 PyObject *fnames, *result;
658 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000659 fnames = PyTuple_New(num_fields);
660 if (!fnames) return NULL;
661 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000662 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000663 if (!field) {
664 Py_DECREF(fnames);
665 return NULL;
666 }
667 PyTuple_SET_ITEM(fnames, i, field);
668 }
INADA Naokifc489082017-01-25 22:33:43 +0900669 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
670 type, base,
671 _PyUnicode_FromId(&PyId__fields), fnames,
672 _PyUnicode_FromId(&PyId___module__),
673 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000674 Py_DECREF(fnames);
675 return (PyTypeObject*)result;
676}
677
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000678static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
679{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000680 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000681 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000682 if (!l)
683 return 0;
684 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000685 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000686 if (!s) {
687 Py_DECREF(l);
688 return 0;
689 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000690 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000691 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200692 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000693 Py_DECREF(l);
694 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000695}
696
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000697/* Conversion AST -> Python */
698
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000699static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
700{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700701 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000702 PyObject *result = PyList_New(n);
703 PyObject *value;
704 if (!result)
705 return NULL;
706 for (i = 0; i < n; i++) {
707 value = func(asdl_seq_GET(seq, i));
708 if (!value) {
709 Py_DECREF(result);
710 return NULL;
711 }
712 PyList_SET_ITEM(result, i, value);
713 }
714 return result;
715}
716
717static PyObject* ast2obj_object(void *o)
718{
719 if (!o)
720 o = Py_None;
721 Py_INCREF((PyObject*)o);
722 return (PyObject*)o;
723}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500724#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100725#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000726#define ast2obj_identifier ast2obj_object
727#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500728#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000729
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000730static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000731{
Christian Heimes217cfd12007-12-02 14:31:20 +0000732 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000733}
734
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000735/* Conversion Python -> AST */
736
737static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
738{
739 if (obj == Py_None)
740 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200741 if (obj) {
742 if (PyArena_AddPyObject(arena, obj) < 0) {
743 *out = NULL;
744 return -1;
745 }
746 Py_INCREF(obj);
747 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000748 *out = obj;
749 return 0;
750}
751
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100752static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
753{
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300754 if (PyArena_AddPyObject(arena, obj) < 0) {
755 *out = NULL;
756 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100757 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300758 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100759 *out = obj;
760 return 0;
761}
762
Benjamin Peterson180e6352011-07-22 11:09:07 -0500763static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500764{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500765 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
766 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500767 return 1;
768 }
769 return obj2ast_object(obj, out, arena);
770}
771
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000772static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
773{
774 int i;
775 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100776 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000777 return 1;
778 }
779
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300780 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000781 if (i == -1 && PyErr_Occurred())
782 return 1;
783 *out = i;
784 return 0;
785}
786
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000787static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000788{
789 PyObject *empty_tuple, *d;
790 if (PyType_Ready(&AST_type) < 0)
791 return -1;
792 d = AST_type.tp_dict;
793 empty_tuple = PyTuple_New(0);
794 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900795 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
796 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000797 Py_XDECREF(empty_tuple);
798 return -1;
799 }
800 Py_DECREF(empty_tuple);
801 return 0;
802}
803
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000804
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000805static int init_types(void)
806{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200807 static int initialized;
808 if (initialized) return 1;
809 if (add_ast_fields() < 0) return 0;
810 mod_type = make_type("mod", &AST_type, NULL, 0);
811 if (!mod_type) return 0;
812 if (!add_attributes(mod_type, NULL, 0)) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300813 Module_type = make_type("Module", mod_type, Module_fields, 1);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200814 if (!Module_type) return 0;
815 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
816 1);
817 if (!Interactive_type) return 0;
818 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
819 if (!Expression_type) return 0;
820 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
821 if (!Suite_type) return 0;
822 stmt_type = make_type("stmt", &AST_type, NULL, 0);
823 if (!stmt_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000824 if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200825 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300826 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200827 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400828 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300829 AsyncFunctionDef_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400830 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300831 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200832 if (!ClassDef_type) return 0;
833 Return_type = make_type("Return", stmt_type, Return_fields, 1);
834 if (!Return_type) return 0;
835 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
836 if (!Delete_type) return 0;
837 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
838 if (!Assign_type) return 0;
839 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
840 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700841 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
842 if (!AnnAssign_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200843 For_type = make_type("For", stmt_type, For_fields, 4);
844 if (!For_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400845 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4);
846 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200847 While_type = make_type("While", stmt_type, While_fields, 3);
848 if (!While_type) return 0;
849 If_type = make_type("If", stmt_type, If_fields, 3);
850 if (!If_type) return 0;
851 With_type = make_type("With", stmt_type, With_fields, 2);
852 if (!With_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400853 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 2);
854 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200855 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
856 if (!Raise_type) return 0;
857 Try_type = make_type("Try", stmt_type, Try_fields, 4);
858 if (!Try_type) return 0;
859 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
860 if (!Assert_type) return 0;
861 Import_type = make_type("Import", stmt_type, Import_fields, 1);
862 if (!Import_type) return 0;
863 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
864 if (!ImportFrom_type) return 0;
865 Global_type = make_type("Global", stmt_type, Global_fields, 1);
866 if (!Global_type) return 0;
867 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
868 if (!Nonlocal_type) return 0;
869 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
870 if (!Expr_type) return 0;
871 Pass_type = make_type("Pass", stmt_type, NULL, 0);
872 if (!Pass_type) return 0;
873 Break_type = make_type("Break", stmt_type, NULL, 0);
874 if (!Break_type) return 0;
875 Continue_type = make_type("Continue", stmt_type, NULL, 0);
876 if (!Continue_type) return 0;
877 expr_type = make_type("expr", &AST_type, NULL, 0);
878 if (!expr_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000879 if (!add_attributes(expr_type, expr_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200880 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
881 if (!BoolOp_type) return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700882 NamedExpr_type = make_type("NamedExpr", expr_type, NamedExpr_fields, 2);
883 if (!NamedExpr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200884 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
885 if (!BinOp_type) return 0;
886 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
887 if (!UnaryOp_type) return 0;
888 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
889 if (!Lambda_type) return 0;
890 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
891 if (!IfExp_type) return 0;
892 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
893 if (!Dict_type) return 0;
894 Set_type = make_type("Set", expr_type, Set_fields, 1);
895 if (!Set_type) return 0;
896 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
897 if (!ListComp_type) return 0;
898 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
899 if (!SetComp_type) return 0;
900 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
901 if (!DictComp_type) return 0;
902 GeneratorExp_type = make_type("GeneratorExp", expr_type,
903 GeneratorExp_fields, 2);
904 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400905 Await_type = make_type("Await", expr_type, Await_fields, 1);
906 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200907 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
908 if (!Yield_type) return 0;
909 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
910 if (!YieldFrom_type) return 0;
911 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
912 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400913 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200914 if (!Call_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400915 FormattedValue_type = make_type("FormattedValue", expr_type,
916 FormattedValue_fields, 3);
917 if (!FormattedValue_type) return 0;
918 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
919 if (!JoinedStr_type) return 0;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100920 Constant_type = make_type("Constant", expr_type, Constant_fields, 1);
921 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200922 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
923 if (!Attribute_type) return 0;
924 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
925 if (!Subscript_type) return 0;
926 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
927 if (!Starred_type) return 0;
928 Name_type = make_type("Name", expr_type, Name_fields, 2);
929 if (!Name_type) return 0;
930 List_type = make_type("List", expr_type, List_fields, 2);
931 if (!List_type) return 0;
932 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
933 if (!Tuple_type) return 0;
934 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
935 if (!expr_context_type) return 0;
936 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
937 Load_type = make_type("Load", expr_context_type, NULL, 0);
938 if (!Load_type) return 0;
939 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
940 if (!Load_singleton) return 0;
941 Store_type = make_type("Store", expr_context_type, NULL, 0);
942 if (!Store_type) return 0;
943 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
944 if (!Store_singleton) return 0;
945 Del_type = make_type("Del", expr_context_type, NULL, 0);
946 if (!Del_type) return 0;
947 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
948 if (!Del_singleton) return 0;
949 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
950 if (!AugLoad_type) return 0;
951 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
952 if (!AugLoad_singleton) return 0;
953 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
954 if (!AugStore_type) return 0;
955 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
956 if (!AugStore_singleton) return 0;
957 Param_type = make_type("Param", expr_context_type, NULL, 0);
958 if (!Param_type) return 0;
959 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
960 if (!Param_singleton) return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700961 NamedStore_type = make_type("NamedStore", expr_context_type, NULL, 0);
962 if (!NamedStore_type) return 0;
963 NamedStore_singleton = PyType_GenericNew(NamedStore_type, NULL, NULL);
964 if (!NamedStore_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200965 slice_type = make_type("slice", &AST_type, NULL, 0);
966 if (!slice_type) return 0;
967 if (!add_attributes(slice_type, NULL, 0)) return 0;
968 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
969 if (!Slice_type) return 0;
970 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
971 if (!ExtSlice_type) return 0;
972 Index_type = make_type("Index", slice_type, Index_fields, 1);
973 if (!Index_type) return 0;
974 boolop_type = make_type("boolop", &AST_type, NULL, 0);
975 if (!boolop_type) return 0;
976 if (!add_attributes(boolop_type, NULL, 0)) return 0;
977 And_type = make_type("And", boolop_type, NULL, 0);
978 if (!And_type) return 0;
979 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
980 if (!And_singleton) return 0;
981 Or_type = make_type("Or", boolop_type, NULL, 0);
982 if (!Or_type) return 0;
983 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
984 if (!Or_singleton) return 0;
985 operator_type = make_type("operator", &AST_type, NULL, 0);
986 if (!operator_type) return 0;
987 if (!add_attributes(operator_type, NULL, 0)) return 0;
988 Add_type = make_type("Add", operator_type, NULL, 0);
989 if (!Add_type) return 0;
990 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
991 if (!Add_singleton) return 0;
992 Sub_type = make_type("Sub", operator_type, NULL, 0);
993 if (!Sub_type) return 0;
994 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
995 if (!Sub_singleton) return 0;
996 Mult_type = make_type("Mult", operator_type, NULL, 0);
997 if (!Mult_type) return 0;
998 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
999 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001000 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1001 if (!MatMult_type) return 0;
1002 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1003 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001004 Div_type = make_type("Div", operator_type, NULL, 0);
1005 if (!Div_type) return 0;
1006 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1007 if (!Div_singleton) return 0;
1008 Mod_type = make_type("Mod", operator_type, NULL, 0);
1009 if (!Mod_type) return 0;
1010 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1011 if (!Mod_singleton) return 0;
1012 Pow_type = make_type("Pow", operator_type, NULL, 0);
1013 if (!Pow_type) return 0;
1014 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1015 if (!Pow_singleton) return 0;
1016 LShift_type = make_type("LShift", operator_type, NULL, 0);
1017 if (!LShift_type) return 0;
1018 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1019 if (!LShift_singleton) return 0;
1020 RShift_type = make_type("RShift", operator_type, NULL, 0);
1021 if (!RShift_type) return 0;
1022 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1023 if (!RShift_singleton) return 0;
1024 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1025 if (!BitOr_type) return 0;
1026 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1027 if (!BitOr_singleton) return 0;
1028 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1029 if (!BitXor_type) return 0;
1030 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1031 if (!BitXor_singleton) return 0;
1032 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1033 if (!BitAnd_type) return 0;
1034 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1035 if (!BitAnd_singleton) return 0;
1036 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1037 if (!FloorDiv_type) return 0;
1038 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1039 if (!FloorDiv_singleton) return 0;
1040 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1041 if (!unaryop_type) return 0;
1042 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1043 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1044 if (!Invert_type) return 0;
1045 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1046 if (!Invert_singleton) return 0;
1047 Not_type = make_type("Not", unaryop_type, NULL, 0);
1048 if (!Not_type) return 0;
1049 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1050 if (!Not_singleton) return 0;
1051 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1052 if (!UAdd_type) return 0;
1053 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1054 if (!UAdd_singleton) return 0;
1055 USub_type = make_type("USub", unaryop_type, NULL, 0);
1056 if (!USub_type) return 0;
1057 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1058 if (!USub_singleton) return 0;
1059 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1060 if (!cmpop_type) return 0;
1061 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1062 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1063 if (!Eq_type) return 0;
1064 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1065 if (!Eq_singleton) return 0;
1066 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1067 if (!NotEq_type) return 0;
1068 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1069 if (!NotEq_singleton) return 0;
1070 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1071 if (!Lt_type) return 0;
1072 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1073 if (!Lt_singleton) return 0;
1074 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1075 if (!LtE_type) return 0;
1076 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1077 if (!LtE_singleton) return 0;
1078 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1079 if (!Gt_type) return 0;
1080 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1081 if (!Gt_singleton) return 0;
1082 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1083 if (!GtE_type) return 0;
1084 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1085 if (!GtE_singleton) return 0;
1086 Is_type = make_type("Is", cmpop_type, NULL, 0);
1087 if (!Is_type) return 0;
1088 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1089 if (!Is_singleton) return 0;
1090 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1091 if (!IsNot_type) return 0;
1092 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1093 if (!IsNot_singleton) return 0;
1094 In_type = make_type("In", cmpop_type, NULL, 0);
1095 if (!In_type) return 0;
1096 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1097 if (!In_singleton) return 0;
1098 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1099 if (!NotIn_type) return 0;
1100 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1101 if (!NotIn_singleton) return 0;
1102 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001103 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001104 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001105 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001106 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1107 if (!excepthandler_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001108 if (!add_attributes(excepthandler_type, excepthandler_attributes, 4))
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001109 return 0;
1110 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1111 ExceptHandler_fields, 3);
1112 if (!ExceptHandler_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001113 arguments_type = make_type("arguments", &AST_type, arguments_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001114 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001115 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001116 arg_type = make_type("arg", &AST_type, arg_fields, 2);
1117 if (!arg_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001118 if (!add_attributes(arg_type, arg_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001119 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1120 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001121 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001122 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1123 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001124 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001125 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1126 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001127 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001128 initialized = 1;
1129 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001130}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001131
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001132static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1133static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1134static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1135static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1136 arena);
1137static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1138static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1139static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1140static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1141static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1142static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1143 arena);
1144static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1145 arena);
1146static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1147static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1148static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1149static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001150static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001151
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152mod_ty
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001153Module(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001155 mod_ty p;
1156 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1157 if (!p)
1158 return NULL;
1159 p->kind = Module_kind;
1160 p->v.Module.body = body;
1161 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162}
1163
1164mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001165Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001167 mod_ty p;
1168 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1169 if (!p)
1170 return NULL;
1171 p->kind = Interactive_kind;
1172 p->v.Interactive.body = body;
1173 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174}
1175
1176mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001177Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001179 mod_ty p;
1180 if (!body) {
1181 PyErr_SetString(PyExc_ValueError,
1182 "field body is required for Expression");
1183 return NULL;
1184 }
1185 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1186 if (!p)
1187 return NULL;
1188 p->kind = Expression_kind;
1189 p->v.Expression.body = body;
1190 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191}
1192
1193mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001196 mod_ty p;
1197 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1198 if (!p)
1199 return NULL;
1200 p->kind = Suite_kind;
1201 p->v.Suite.body = body;
1202 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203}
1204
1205stmt_ty
1206FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001207 decorator_list, expr_ty returns, int lineno, int col_offset, int
1208 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001210 stmt_ty p;
1211 if (!name) {
1212 PyErr_SetString(PyExc_ValueError,
1213 "field name is required for FunctionDef");
1214 return NULL;
1215 }
1216 if (!args) {
1217 PyErr_SetString(PyExc_ValueError,
1218 "field args is required for FunctionDef");
1219 return NULL;
1220 }
1221 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1222 if (!p)
1223 return NULL;
1224 p->kind = FunctionDef_kind;
1225 p->v.FunctionDef.name = name;
1226 p->v.FunctionDef.args = args;
1227 p->v.FunctionDef.body = body;
1228 p->v.FunctionDef.decorator_list = decorator_list;
1229 p->v.FunctionDef.returns = returns;
1230 p->lineno = lineno;
1231 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001232 p->end_lineno = end_lineno;
1233 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001234 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235}
1236
1237stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001238AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001239 * decorator_list, expr_ty returns, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001240 int end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001241{
1242 stmt_ty p;
1243 if (!name) {
1244 PyErr_SetString(PyExc_ValueError,
1245 "field name is required for AsyncFunctionDef");
1246 return NULL;
1247 }
1248 if (!args) {
1249 PyErr_SetString(PyExc_ValueError,
1250 "field args is required for AsyncFunctionDef");
1251 return NULL;
1252 }
1253 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1254 if (!p)
1255 return NULL;
1256 p->kind = AsyncFunctionDef_kind;
1257 p->v.AsyncFunctionDef.name = name;
1258 p->v.AsyncFunctionDef.args = args;
1259 p->v.AsyncFunctionDef.body = body;
1260 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1261 p->v.AsyncFunctionDef.returns = returns;
1262 p->lineno = lineno;
1263 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001264 p->end_lineno = end_lineno;
1265 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001266 return p;
1267}
1268
1269stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001270ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001271 body, asdl_seq * decorator_list, int lineno, int col_offset, int
1272 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001274 stmt_ty p;
1275 if (!name) {
1276 PyErr_SetString(PyExc_ValueError,
1277 "field name is required for ClassDef");
1278 return NULL;
1279 }
1280 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1281 if (!p)
1282 return NULL;
1283 p->kind = ClassDef_kind;
1284 p->v.ClassDef.name = name;
1285 p->v.ClassDef.bases = bases;
1286 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001287 p->v.ClassDef.body = body;
1288 p->v.ClassDef.decorator_list = decorator_list;
1289 p->lineno = lineno;
1290 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001291 p->end_lineno = end_lineno;
1292 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001293 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001294}
1295
1296stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001297Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
1298 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001300 stmt_ty p;
1301 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1302 if (!p)
1303 return NULL;
1304 p->kind = Return_kind;
1305 p->v.Return.value = value;
1306 p->lineno = lineno;
1307 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001308 p->end_lineno = end_lineno;
1309 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001310 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311}
1312
1313stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001314Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int
1315 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001317 stmt_ty p;
1318 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1319 if (!p)
1320 return NULL;
1321 p->kind = Delete_kind;
1322 p->v.Delete.targets = targets;
1323 p->lineno = lineno;
1324 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001325 p->end_lineno = end_lineno;
1326 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001327 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328}
1329
1330stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001331Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, int
1332 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001334 stmt_ty p;
1335 if (!value) {
1336 PyErr_SetString(PyExc_ValueError,
1337 "field value is required for Assign");
1338 return NULL;
1339 }
1340 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1341 if (!p)
1342 return NULL;
1343 p->kind = Assign_kind;
1344 p->v.Assign.targets = targets;
1345 p->v.Assign.value = value;
1346 p->lineno = lineno;
1347 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001348 p->end_lineno = end_lineno;
1349 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001350 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351}
1352
1353stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001354AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001355 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001357 stmt_ty p;
1358 if (!target) {
1359 PyErr_SetString(PyExc_ValueError,
1360 "field target is required for AugAssign");
1361 return NULL;
1362 }
1363 if (!op) {
1364 PyErr_SetString(PyExc_ValueError,
1365 "field op is required for AugAssign");
1366 return NULL;
1367 }
1368 if (!value) {
1369 PyErr_SetString(PyExc_ValueError,
1370 "field value is required for AugAssign");
1371 return NULL;
1372 }
1373 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1374 if (!p)
1375 return NULL;
1376 p->kind = AugAssign_kind;
1377 p->v.AugAssign.target = target;
1378 p->v.AugAssign.op = op;
1379 p->v.AugAssign.value = value;
1380 p->lineno = lineno;
1381 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001382 p->end_lineno = end_lineno;
1383 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001384 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385}
1386
1387stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001388AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001389 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1390 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001391{
1392 stmt_ty p;
1393 if (!target) {
1394 PyErr_SetString(PyExc_ValueError,
1395 "field target is required for AnnAssign");
1396 return NULL;
1397 }
1398 if (!annotation) {
1399 PyErr_SetString(PyExc_ValueError,
1400 "field annotation is required for AnnAssign");
1401 return NULL;
1402 }
1403 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1404 if (!p)
1405 return NULL;
1406 p->kind = AnnAssign_kind;
1407 p->v.AnnAssign.target = target;
1408 p->v.AnnAssign.annotation = annotation;
1409 p->v.AnnAssign.value = value;
1410 p->v.AnnAssign.simple = simple;
1411 p->lineno = lineno;
1412 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001413 p->end_lineno = end_lineno;
1414 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001415 return p;
1416}
1417
1418stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001420 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001422 stmt_ty p;
1423 if (!target) {
1424 PyErr_SetString(PyExc_ValueError,
1425 "field target is required for For");
1426 return NULL;
1427 }
1428 if (!iter) {
1429 PyErr_SetString(PyExc_ValueError,
1430 "field iter is required for For");
1431 return NULL;
1432 }
1433 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1434 if (!p)
1435 return NULL;
1436 p->kind = For_kind;
1437 p->v.For.target = target;
1438 p->v.For.iter = iter;
1439 p->v.For.body = body;
1440 p->v.For.orelse = orelse;
1441 p->lineno = lineno;
1442 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001443 p->end_lineno = end_lineno;
1444 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001445 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446}
1447
1448stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001449AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001450 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1451 *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001452{
1453 stmt_ty p;
1454 if (!target) {
1455 PyErr_SetString(PyExc_ValueError,
1456 "field target is required for AsyncFor");
1457 return NULL;
1458 }
1459 if (!iter) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "field iter is required for AsyncFor");
1462 return NULL;
1463 }
1464 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1465 if (!p)
1466 return NULL;
1467 p->kind = AsyncFor_kind;
1468 p->v.AsyncFor.target = target;
1469 p->v.AsyncFor.iter = iter;
1470 p->v.AsyncFor.body = body;
1471 p->v.AsyncFor.orelse = orelse;
1472 p->lineno = lineno;
1473 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001474 p->end_lineno = end_lineno;
1475 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001476 return p;
1477}
1478
1479stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001480While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001481 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001483 stmt_ty p;
1484 if (!test) {
1485 PyErr_SetString(PyExc_ValueError,
1486 "field test is required for While");
1487 return NULL;
1488 }
1489 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1490 if (!p)
1491 return NULL;
1492 p->kind = While_kind;
1493 p->v.While.test = test;
1494 p->v.While.body = body;
1495 p->v.While.orelse = orelse;
1496 p->lineno = lineno;
1497 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001498 p->end_lineno = end_lineno;
1499 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001500 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
1503stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001504If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001505 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001507 stmt_ty p;
1508 if (!test) {
1509 PyErr_SetString(PyExc_ValueError,
1510 "field test is required for If");
1511 return NULL;
1512 }
1513 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1514 if (!p)
1515 return NULL;
1516 p->kind = If_kind;
1517 p->v.If.test = test;
1518 p->v.If.body = body;
1519 p->v.If.orelse = orelse;
1520 p->lineno = lineno;
1521 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001522 p->end_lineno = end_lineno;
1523 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001524 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525}
1526
1527stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001528With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, int
1529 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001530{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001531 stmt_ty p;
1532 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1533 if (!p)
1534 return NULL;
1535 p->kind = With_kind;
1536 p->v.With.items = items;
1537 p->v.With.body = body;
1538 p->lineno = lineno;
1539 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001540 p->end_lineno = end_lineno;
1541 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001542 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001543}
1544
1545stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001546AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, int
1547 end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001548{
1549 stmt_ty p;
1550 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1551 if (!p)
1552 return NULL;
1553 p->kind = AsyncWith_kind;
1554 p->v.AsyncWith.items = items;
1555 p->v.AsyncWith.body = body;
1556 p->lineno = lineno;
1557 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001558 p->end_lineno = end_lineno;
1559 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001560 return p;
1561}
1562
1563stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001564Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
1565 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001567 stmt_ty p;
1568 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1569 if (!p)
1570 return NULL;
1571 p->kind = Raise_kind;
1572 p->v.Raise.exc = exc;
1573 p->v.Raise.cause = cause;
1574 p->lineno = lineno;
1575 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001576 p->end_lineno = end_lineno;
1577 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001578 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579}
1580
1581stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001582Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001583 finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset,
1584 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001585{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001586 stmt_ty p;
1587 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1588 if (!p)
1589 return NULL;
1590 p->kind = Try_kind;
1591 p->v.Try.body = body;
1592 p->v.Try.handlers = handlers;
1593 p->v.Try.orelse = orelse;
1594 p->v.Try.finalbody = finalbody;
1595 p->lineno = lineno;
1596 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001597 p->end_lineno = end_lineno;
1598 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001599 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600}
1601
1602stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001603Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
1604 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001606 stmt_ty p;
1607 if (!test) {
1608 PyErr_SetString(PyExc_ValueError,
1609 "field test is required for Assert");
1610 return NULL;
1611 }
1612 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1613 if (!p)
1614 return NULL;
1615 p->kind = Assert_kind;
1616 p->v.Assert.test = test;
1617 p->v.Assert.msg = msg;
1618 p->lineno = lineno;
1619 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001620 p->end_lineno = end_lineno;
1621 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001622 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623}
1624
1625stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001626Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1627 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001628{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001629 stmt_ty p;
1630 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1631 if (!p)
1632 return NULL;
1633 p->kind = Import_kind;
1634 p->v.Import.names = names;
1635 p->lineno = lineno;
1636 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001637 p->end_lineno = end_lineno;
1638 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001639 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001640}
1641
1642stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001643ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001644 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001646 stmt_ty p;
1647 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1648 if (!p)
1649 return NULL;
1650 p->kind = ImportFrom_kind;
1651 p->v.ImportFrom.module = module;
1652 p->v.ImportFrom.names = names;
1653 p->v.ImportFrom.level = level;
1654 p->lineno = lineno;
1655 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001656 p->end_lineno = end_lineno;
1657 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001658 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659}
1660
1661stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001662Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1663 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001665 stmt_ty p;
1666 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1667 if (!p)
1668 return NULL;
1669 p->kind = Global_kind;
1670 p->v.Global.names = names;
1671 p->lineno = lineno;
1672 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001673 p->end_lineno = end_lineno;
1674 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001675 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676}
1677
1678stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001679Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1680 end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00001681{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001682 stmt_ty p;
1683 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1684 if (!p)
1685 return NULL;
1686 p->kind = Nonlocal_kind;
1687 p->v.Nonlocal.names = names;
1688 p->lineno = lineno;
1689 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001690 p->end_lineno = end_lineno;
1691 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001692 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001693}
1694
1695stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001696Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
1697 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001699 stmt_ty p;
1700 if (!value) {
1701 PyErr_SetString(PyExc_ValueError,
1702 "field value is required for Expr");
1703 return NULL;
1704 }
1705 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1706 if (!p)
1707 return NULL;
1708 p->kind = Expr_kind;
1709 p->v.Expr.value = value;
1710 p->lineno = lineno;
1711 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001712 p->end_lineno = end_lineno;
1713 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001714 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715}
1716
1717stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001718Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1719 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001720{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001721 stmt_ty p;
1722 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1723 if (!p)
1724 return NULL;
1725 p->kind = Pass_kind;
1726 p->lineno = lineno;
1727 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001728 p->end_lineno = end_lineno;
1729 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001730 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731}
1732
1733stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001734Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1735 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001737 stmt_ty p;
1738 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1739 if (!p)
1740 return NULL;
1741 p->kind = Break_kind;
1742 p->lineno = lineno;
1743 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001744 p->end_lineno = end_lineno;
1745 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001746 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747}
1748
1749stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001750Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
1751 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001752{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001753 stmt_ty p;
1754 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1755 if (!p)
1756 return NULL;
1757 p->kind = Continue_kind;
1758 p->lineno = lineno;
1759 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001760 p->end_lineno = end_lineno;
1761 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001762 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763}
1764
1765expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001766BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int
1767 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001769 expr_ty p;
1770 if (!op) {
1771 PyErr_SetString(PyExc_ValueError,
1772 "field op is required for BoolOp");
1773 return NULL;
1774 }
1775 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1776 if (!p)
1777 return NULL;
1778 p->kind = BoolOp_kind;
1779 p->v.BoolOp.op = op;
1780 p->v.BoolOp.values = values;
1781 p->lineno = lineno;
1782 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001783 p->end_lineno = end_lineno;
1784 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001785 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786}
1787
1788expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001789NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
1790 end_lineno, int end_col_offset, PyArena *arena)
1791{
1792 expr_ty p;
1793 if (!target) {
1794 PyErr_SetString(PyExc_ValueError,
1795 "field target is required for NamedExpr");
1796 return NULL;
1797 }
1798 if (!value) {
1799 PyErr_SetString(PyExc_ValueError,
1800 "field value is required for NamedExpr");
1801 return NULL;
1802 }
1803 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1804 if (!p)
1805 return NULL;
1806 p->kind = NamedExpr_kind;
1807 p->v.NamedExpr.target = target;
1808 p->v.NamedExpr.value = value;
1809 p->lineno = lineno;
1810 p->col_offset = col_offset;
1811 p->end_lineno = end_lineno;
1812 p->end_col_offset = end_col_offset;
1813 return p;
1814}
1815
1816expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001817BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001818 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001820 expr_ty p;
1821 if (!left) {
1822 PyErr_SetString(PyExc_ValueError,
1823 "field left is required for BinOp");
1824 return NULL;
1825 }
1826 if (!op) {
1827 PyErr_SetString(PyExc_ValueError,
1828 "field op is required for BinOp");
1829 return NULL;
1830 }
1831 if (!right) {
1832 PyErr_SetString(PyExc_ValueError,
1833 "field right is required for BinOp");
1834 return NULL;
1835 }
1836 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1837 if (!p)
1838 return NULL;
1839 p->kind = BinOp_kind;
1840 p->v.BinOp.left = left;
1841 p->v.BinOp.op = op;
1842 p->v.BinOp.right = right;
1843 p->lineno = lineno;
1844 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001845 p->end_lineno = end_lineno;
1846 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001847 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848}
1849
1850expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001851UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
1852 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001854 expr_ty p;
1855 if (!op) {
1856 PyErr_SetString(PyExc_ValueError,
1857 "field op is required for UnaryOp");
1858 return NULL;
1859 }
1860 if (!operand) {
1861 PyErr_SetString(PyExc_ValueError,
1862 "field operand is required for UnaryOp");
1863 return NULL;
1864 }
1865 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1866 if (!p)
1867 return NULL;
1868 p->kind = UnaryOp_kind;
1869 p->v.UnaryOp.op = op;
1870 p->v.UnaryOp.operand = operand;
1871 p->lineno = lineno;
1872 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001873 p->end_lineno = end_lineno;
1874 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001875 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876}
1877
1878expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001879Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
1880 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001882 expr_ty p;
1883 if (!args) {
1884 PyErr_SetString(PyExc_ValueError,
1885 "field args is required for Lambda");
1886 return NULL;
1887 }
1888 if (!body) {
1889 PyErr_SetString(PyExc_ValueError,
1890 "field body is required for Lambda");
1891 return NULL;
1892 }
1893 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1894 if (!p)
1895 return NULL;
1896 p->kind = Lambda_kind;
1897 p->v.Lambda.args = args;
1898 p->v.Lambda.body = body;
1899 p->lineno = lineno;
1900 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001901 p->end_lineno = end_lineno;
1902 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001903 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904}
1905
1906expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001907IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001908 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001909{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001910 expr_ty p;
1911 if (!test) {
1912 PyErr_SetString(PyExc_ValueError,
1913 "field test is required for IfExp");
1914 return NULL;
1915 }
1916 if (!body) {
1917 PyErr_SetString(PyExc_ValueError,
1918 "field body is required for IfExp");
1919 return NULL;
1920 }
1921 if (!orelse) {
1922 PyErr_SetString(PyExc_ValueError,
1923 "field orelse is required for IfExp");
1924 return NULL;
1925 }
1926 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1927 if (!p)
1928 return NULL;
1929 p->kind = IfExp_kind;
1930 p->v.IfExp.test = test;
1931 p->v.IfExp.body = body;
1932 p->v.IfExp.orelse = orelse;
1933 p->lineno = lineno;
1934 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001935 p->end_lineno = end_lineno;
1936 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001937 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001938}
1939
1940expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001941Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int
1942 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001944 expr_ty p;
1945 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1946 if (!p)
1947 return NULL;
1948 p->kind = Dict_kind;
1949 p->v.Dict.keys = keys;
1950 p->v.Dict.values = values;
1951 p->lineno = lineno;
1952 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001953 p->end_lineno = end_lineno;
1954 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001955 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956}
1957
1958expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001959Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int
1960 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001961{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001962 expr_ty p;
1963 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1964 if (!p)
1965 return NULL;
1966 p->kind = Set_kind;
1967 p->v.Set.elts = elts;
1968 p->lineno = lineno;
1969 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001970 p->end_lineno = end_lineno;
1971 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001972 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001973}
1974
1975expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001976ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
1977 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001979 expr_ty p;
1980 if (!elt) {
1981 PyErr_SetString(PyExc_ValueError,
1982 "field elt is required for ListComp");
1983 return NULL;
1984 }
1985 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1986 if (!p)
1987 return NULL;
1988 p->kind = ListComp_kind;
1989 p->v.ListComp.elt = elt;
1990 p->v.ListComp.generators = generators;
1991 p->lineno = lineno;
1992 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001993 p->end_lineno = end_lineno;
1994 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001995 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996}
1997
1998expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001999SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2000 end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002001{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002002 expr_ty p;
2003 if (!elt) {
2004 PyErr_SetString(PyExc_ValueError,
2005 "field elt is required for SetComp");
2006 return NULL;
2007 }
2008 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2009 if (!p)
2010 return NULL;
2011 p->kind = SetComp_kind;
2012 p->v.SetComp.elt = elt;
2013 p->v.SetComp.generators = generators;
2014 p->lineno = lineno;
2015 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002016 p->end_lineno = end_lineno;
2017 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002018 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002019}
2020
2021expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00002022DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002023 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002024{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002025 expr_ty p;
2026 if (!key) {
2027 PyErr_SetString(PyExc_ValueError,
2028 "field key is required for DictComp");
2029 return NULL;
2030 }
2031 if (!value) {
2032 PyErr_SetString(PyExc_ValueError,
2033 "field value is required for DictComp");
2034 return NULL;
2035 }
2036 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2037 if (!p)
2038 return NULL;
2039 p->kind = DictComp_kind;
2040 p->v.DictComp.key = key;
2041 p->v.DictComp.value = value;
2042 p->v.DictComp.generators = generators;
2043 p->lineno = lineno;
2044 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002045 p->end_lineno = end_lineno;
2046 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002047 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002048}
2049
2050expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002051GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002052 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002054 expr_ty p;
2055 if (!elt) {
2056 PyErr_SetString(PyExc_ValueError,
2057 "field elt is required for GeneratorExp");
2058 return NULL;
2059 }
2060 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2061 if (!p)
2062 return NULL;
2063 p->kind = GeneratorExp_kind;
2064 p->v.GeneratorExp.elt = elt;
2065 p->v.GeneratorExp.generators = generators;
2066 p->lineno = lineno;
2067 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002068 p->end_lineno = end_lineno;
2069 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002070 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071}
2072
2073expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002074Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2075 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002076{
2077 expr_ty p;
2078 if (!value) {
2079 PyErr_SetString(PyExc_ValueError,
2080 "field value is required for Await");
2081 return NULL;
2082 }
2083 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2084 if (!p)
2085 return NULL;
2086 p->kind = Await_kind;
2087 p->v.Await.value = value;
2088 p->lineno = lineno;
2089 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002090 p->end_lineno = end_lineno;
2091 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002092 return p;
2093}
2094
2095expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002096Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
2097 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002099 expr_ty p;
2100 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2101 if (!p)
2102 return NULL;
2103 p->kind = Yield_kind;
2104 p->v.Yield.value = value;
2105 p->lineno = lineno;
2106 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002107 p->end_lineno = end_lineno;
2108 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002109 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110}
2111
2112expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002113YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
2114 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05002115{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002116 expr_ty p;
2117 if (!value) {
2118 PyErr_SetString(PyExc_ValueError,
2119 "field value is required for YieldFrom");
2120 return NULL;
2121 }
2122 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2123 if (!p)
2124 return NULL;
2125 p->kind = YieldFrom_kind;
2126 p->v.YieldFrom.value = value;
2127 p->lineno = lineno;
2128 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002129 p->end_lineno = end_lineno;
2130 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002131 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002132}
2133
2134expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002135Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002136 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002138 expr_ty p;
2139 if (!left) {
2140 PyErr_SetString(PyExc_ValueError,
2141 "field left is required for Compare");
2142 return NULL;
2143 }
2144 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2145 if (!p)
2146 return NULL;
2147 p->kind = Compare_kind;
2148 p->v.Compare.left = left;
2149 p->v.Compare.ops = ops;
2150 p->v.Compare.comparators = comparators;
2151 p->lineno = lineno;
2152 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002153 p->end_lineno = end_lineno;
2154 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002155 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156}
2157
2158expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002159Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002160 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002162 expr_ty p;
2163 if (!func) {
2164 PyErr_SetString(PyExc_ValueError,
2165 "field func is required for Call");
2166 return NULL;
2167 }
2168 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2169 if (!p)
2170 return NULL;
2171 p->kind = Call_kind;
2172 p->v.Call.func = func;
2173 p->v.Call.args = args;
2174 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002175 p->lineno = lineno;
2176 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002177 p->end_lineno = end_lineno;
2178 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002179 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180}
2181
2182expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002183FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002184 int col_offset, int end_lineno, int end_col_offset, PyArena
2185 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002186{
2187 expr_ty p;
2188 if (!value) {
2189 PyErr_SetString(PyExc_ValueError,
2190 "field value is required for FormattedValue");
2191 return NULL;
2192 }
2193 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2194 if (!p)
2195 return NULL;
2196 p->kind = FormattedValue_kind;
2197 p->v.FormattedValue.value = value;
2198 p->v.FormattedValue.conversion = conversion;
2199 p->v.FormattedValue.format_spec = format_spec;
2200 p->lineno = lineno;
2201 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002202 p->end_lineno = end_lineno;
2203 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002204 return p;
2205}
2206
2207expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002208JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int
2209 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002210{
2211 expr_ty p;
2212 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2213 if (!p)
2214 return NULL;
2215 p->kind = JoinedStr_kind;
2216 p->v.JoinedStr.values = values;
2217 p->lineno = lineno;
2218 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002219 p->end_lineno = end_lineno;
2220 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002221 return p;
2222}
2223
2224expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002225Constant(constant value, int lineno, int col_offset, int end_lineno, int
2226 end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002227{
2228 expr_ty p;
2229 if (!value) {
2230 PyErr_SetString(PyExc_ValueError,
2231 "field value is required for Constant");
2232 return NULL;
2233 }
2234 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2235 if (!p)
2236 return NULL;
2237 p->kind = Constant_kind;
2238 p->v.Constant.value = value;
2239 p->lineno = lineno;
2240 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002241 p->end_lineno = end_lineno;
2242 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002243 return p;
2244}
2245
2246expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002247Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002248 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002250 expr_ty p;
2251 if (!value) {
2252 PyErr_SetString(PyExc_ValueError,
2253 "field value is required for Attribute");
2254 return NULL;
2255 }
2256 if (!attr) {
2257 PyErr_SetString(PyExc_ValueError,
2258 "field attr is required for Attribute");
2259 return NULL;
2260 }
2261 if (!ctx) {
2262 PyErr_SetString(PyExc_ValueError,
2263 "field ctx is required for Attribute");
2264 return NULL;
2265 }
2266 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2267 if (!p)
2268 return NULL;
2269 p->kind = Attribute_kind;
2270 p->v.Attribute.value = value;
2271 p->v.Attribute.attr = attr;
2272 p->v.Attribute.ctx = ctx;
2273 p->lineno = lineno;
2274 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002275 p->end_lineno = end_lineno;
2276 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002277 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278}
2279
2280expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002281Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002282 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002284 expr_ty p;
2285 if (!value) {
2286 PyErr_SetString(PyExc_ValueError,
2287 "field value is required for Subscript");
2288 return NULL;
2289 }
2290 if (!slice) {
2291 PyErr_SetString(PyExc_ValueError,
2292 "field slice is required for Subscript");
2293 return NULL;
2294 }
2295 if (!ctx) {
2296 PyErr_SetString(PyExc_ValueError,
2297 "field ctx is required for Subscript");
2298 return NULL;
2299 }
2300 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2301 if (!p)
2302 return NULL;
2303 p->kind = Subscript_kind;
2304 p->v.Subscript.value = value;
2305 p->v.Subscript.slice = slice;
2306 p->v.Subscript.ctx = ctx;
2307 p->lineno = lineno;
2308 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002309 p->end_lineno = end_lineno;
2310 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002311 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312}
2313
2314expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002315Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
2316 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00002317{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002318 expr_ty p;
2319 if (!value) {
2320 PyErr_SetString(PyExc_ValueError,
2321 "field value is required for Starred");
2322 return NULL;
2323 }
2324 if (!ctx) {
2325 PyErr_SetString(PyExc_ValueError,
2326 "field ctx is required for Starred");
2327 return NULL;
2328 }
2329 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2330 if (!p)
2331 return NULL;
2332 p->kind = Starred_kind;
2333 p->v.Starred.value = value;
2334 p->v.Starred.ctx = ctx;
2335 p->lineno = lineno;
2336 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002337 p->end_lineno = end_lineno;
2338 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002339 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002340}
2341
2342expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002343Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
2344 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002346 expr_ty p;
2347 if (!id) {
2348 PyErr_SetString(PyExc_ValueError,
2349 "field id is required for Name");
2350 return NULL;
2351 }
2352 if (!ctx) {
2353 PyErr_SetString(PyExc_ValueError,
2354 "field ctx is required for Name");
2355 return NULL;
2356 }
2357 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2358 if (!p)
2359 return NULL;
2360 p->kind = Name_kind;
2361 p->v.Name.id = id;
2362 p->v.Name.ctx = ctx;
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
2370expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002371List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2372 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002374 expr_ty p;
2375 if (!ctx) {
2376 PyErr_SetString(PyExc_ValueError,
2377 "field ctx is required for List");
2378 return NULL;
2379 }
2380 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2381 if (!p)
2382 return NULL;
2383 p->kind = List_kind;
2384 p->v.List.elts = elts;
2385 p->v.List.ctx = ctx;
2386 p->lineno = lineno;
2387 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002388 p->end_lineno = end_lineno;
2389 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002390 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391}
2392
2393expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002394Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2395 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002397 expr_ty p;
2398 if (!ctx) {
2399 PyErr_SetString(PyExc_ValueError,
2400 "field ctx is required for Tuple");
2401 return NULL;
2402 }
2403 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2404 if (!p)
2405 return NULL;
2406 p->kind = Tuple_kind;
2407 p->v.Tuple.elts = elts;
2408 p->v.Tuple.ctx = ctx;
2409 p->lineno = lineno;
2410 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002411 p->end_lineno = end_lineno;
2412 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002413 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414}
2415
2416slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002417Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002419 slice_ty p;
2420 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2421 if (!p)
2422 return NULL;
2423 p->kind = Slice_kind;
2424 p->v.Slice.lower = lower;
2425 p->v.Slice.upper = upper;
2426 p->v.Slice.step = step;
2427 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428}
2429
2430slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002431ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002433 slice_ty p;
2434 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2435 if (!p)
2436 return NULL;
2437 p->kind = ExtSlice_kind;
2438 p->v.ExtSlice.dims = dims;
2439 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440}
2441
2442slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002443Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002445 slice_ty p;
2446 if (!value) {
2447 PyErr_SetString(PyExc_ValueError,
2448 "field value is required for Index");
2449 return NULL;
2450 }
2451 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2452 if (!p)
2453 return NULL;
2454 p->kind = Index_kind;
2455 p->v.Index.value = value;
2456 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457}
2458
2459comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002460comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2461 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002463 comprehension_ty p;
2464 if (!target) {
2465 PyErr_SetString(PyExc_ValueError,
2466 "field target is required for comprehension");
2467 return NULL;
2468 }
2469 if (!iter) {
2470 PyErr_SetString(PyExc_ValueError,
2471 "field iter is required for comprehension");
2472 return NULL;
2473 }
2474 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2475 if (!p)
2476 return NULL;
2477 p->target = target;
2478 p->iter = iter;
2479 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002480 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002481 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482}
2483
2484excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002485ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002486 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002488 excepthandler_ty p;
2489 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2490 if (!p)
2491 return NULL;
2492 p->kind = ExceptHandler_kind;
2493 p->v.ExceptHandler.type = type;
2494 p->v.ExceptHandler.name = name;
2495 p->v.ExceptHandler.body = body;
2496 p->lineno = lineno;
2497 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002498 p->end_lineno = end_lineno;
2499 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002500 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002501}
2502
2503arguments_ty
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002504arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
2505 kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002507 arguments_ty p;
2508 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2509 if (!p)
2510 return NULL;
2511 p->args = args;
2512 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002513 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002514 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002515 p->kwarg = kwarg;
2516 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002517 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518}
2519
Neal Norwitzc1505362006-12-28 06:47:50 +00002520arg_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002521arg(identifier arg, expr_ty annotation, int lineno, int col_offset, int
2522 end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002523{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002524 arg_ty p;
2525 if (!arg) {
2526 PyErr_SetString(PyExc_ValueError,
2527 "field arg is required for arg");
2528 return NULL;
2529 }
2530 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2531 if (!p)
2532 return NULL;
2533 p->arg = arg;
2534 p->annotation = annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01002535 p->lineno = lineno;
2536 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002537 p->end_lineno = end_lineno;
2538 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002539 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002540}
2541
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002543keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002545 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002546 if (!value) {
2547 PyErr_SetString(PyExc_ValueError,
2548 "field value is required for keyword");
2549 return NULL;
2550 }
2551 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2552 if (!p)
2553 return NULL;
2554 p->arg = arg;
2555 p->value = value;
2556 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557}
2558
2559alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002560alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002562 alias_ty p;
2563 if (!name) {
2564 PyErr_SetString(PyExc_ValueError,
2565 "field name is required for alias");
2566 return NULL;
2567 }
2568 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2569 if (!p)
2570 return NULL;
2571 p->name = name;
2572 p->asname = asname;
2573 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574}
2575
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002576withitem_ty
2577withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2578{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002579 withitem_ty p;
2580 if (!context_expr) {
2581 PyErr_SetString(PyExc_ValueError,
2582 "field context_expr is required for withitem");
2583 return NULL;
2584 }
2585 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2586 if (!p)
2587 return NULL;
2588 p->context_expr = context_expr;
2589 p->optional_vars = optional_vars;
2590 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002591}
2592
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002593
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002594PyObject*
2595ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002596{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002597 mod_ty o = (mod_ty)_o;
2598 PyObject *result = NULL, *value = NULL;
2599 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002600 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002601 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002602
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002603 switch (o->kind) {
2604 case Module_kind:
2605 result = PyType_GenericNew(Module_type, NULL, NULL);
2606 if (!result) goto failed;
2607 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2608 if (!value) goto failed;
2609 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2610 goto failed;
2611 Py_DECREF(value);
2612 break;
2613 case Interactive_kind:
2614 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2615 if (!result) goto failed;
2616 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2617 if (!value) goto failed;
2618 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2619 goto failed;
2620 Py_DECREF(value);
2621 break;
2622 case Expression_kind:
2623 result = PyType_GenericNew(Expression_type, NULL, NULL);
2624 if (!result) goto failed;
2625 value = ast2obj_expr(o->v.Expression.body);
2626 if (!value) goto failed;
2627 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2628 goto failed;
2629 Py_DECREF(value);
2630 break;
2631 case Suite_kind:
2632 result = PyType_GenericNew(Suite_type, NULL, NULL);
2633 if (!result) goto failed;
2634 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2635 if (!value) goto failed;
2636 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2637 goto failed;
2638 Py_DECREF(value);
2639 break;
2640 }
2641 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002642failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002643 Py_XDECREF(value);
2644 Py_XDECREF(result);
2645 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646}
2647
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002648PyObject*
2649ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002651 stmt_ty o = (stmt_ty)_o;
2652 PyObject *result = NULL, *value = NULL;
2653 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002654 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002655 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002656
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002657 switch (o->kind) {
2658 case FunctionDef_kind:
2659 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2660 if (!result) goto failed;
2661 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002662 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002663 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2664 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002665 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002666 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002667 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002668 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2669 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002670 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002671 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2672 if (!value) goto failed;
2673 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2674 goto failed;
2675 Py_DECREF(value);
2676 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2677 if (!value) goto failed;
2678 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2679 goto failed;
2680 Py_DECREF(value);
2681 value = ast2obj_expr(o->v.FunctionDef.returns);
2682 if (!value) goto failed;
2683 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2684 goto failed;
2685 Py_DECREF(value);
2686 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002687 case AsyncFunctionDef_kind:
2688 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2689 if (!result) goto failed;
2690 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2691 if (!value) goto failed;
2692 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2693 goto failed;
2694 Py_DECREF(value);
2695 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2696 if (!value) goto failed;
2697 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2698 goto failed;
2699 Py_DECREF(value);
2700 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2701 if (!value) goto failed;
2702 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2703 goto failed;
2704 Py_DECREF(value);
2705 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2706 ast2obj_expr);
2707 if (!value) goto failed;
2708 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2709 goto failed;
2710 Py_DECREF(value);
2711 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2712 if (!value) goto failed;
2713 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2714 goto failed;
2715 Py_DECREF(value);
2716 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002717 case ClassDef_kind:
2718 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2719 if (!result) goto failed;
2720 value = ast2obj_identifier(o->v.ClassDef.name);
2721 if (!value) goto failed;
2722 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2723 goto failed;
2724 Py_DECREF(value);
2725 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2726 if (!value) goto failed;
2727 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2728 goto failed;
2729 Py_DECREF(value);
2730 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2731 if (!value) goto failed;
2732 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2733 goto failed;
2734 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002735 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2736 if (!value) goto failed;
2737 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2738 goto failed;
2739 Py_DECREF(value);
2740 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2741 if (!value) goto failed;
2742 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2743 goto failed;
2744 Py_DECREF(value);
2745 break;
2746 case Return_kind:
2747 result = PyType_GenericNew(Return_type, NULL, NULL);
2748 if (!result) goto failed;
2749 value = ast2obj_expr(o->v.Return.value);
2750 if (!value) goto failed;
2751 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2752 goto failed;
2753 Py_DECREF(value);
2754 break;
2755 case Delete_kind:
2756 result = PyType_GenericNew(Delete_type, NULL, NULL);
2757 if (!result) goto failed;
2758 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2759 if (!value) goto failed;
2760 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2761 goto failed;
2762 Py_DECREF(value);
2763 break;
2764 case Assign_kind:
2765 result = PyType_GenericNew(Assign_type, NULL, NULL);
2766 if (!result) goto failed;
2767 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2768 if (!value) goto failed;
2769 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2770 goto failed;
2771 Py_DECREF(value);
2772 value = ast2obj_expr(o->v.Assign.value);
2773 if (!value) goto failed;
2774 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2775 goto failed;
2776 Py_DECREF(value);
2777 break;
2778 case AugAssign_kind:
2779 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2780 if (!result) goto failed;
2781 value = ast2obj_expr(o->v.AugAssign.target);
2782 if (!value) goto failed;
2783 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2784 goto failed;
2785 Py_DECREF(value);
2786 value = ast2obj_operator(o->v.AugAssign.op);
2787 if (!value) goto failed;
2788 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2789 goto failed;
2790 Py_DECREF(value);
2791 value = ast2obj_expr(o->v.AugAssign.value);
2792 if (!value) goto failed;
2793 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2794 goto failed;
2795 Py_DECREF(value);
2796 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002797 case AnnAssign_kind:
2798 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2799 if (!result) goto failed;
2800 value = ast2obj_expr(o->v.AnnAssign.target);
2801 if (!value) goto failed;
2802 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2803 goto failed;
2804 Py_DECREF(value);
2805 value = ast2obj_expr(o->v.AnnAssign.annotation);
2806 if (!value) goto failed;
2807 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2808 goto failed;
2809 Py_DECREF(value);
2810 value = ast2obj_expr(o->v.AnnAssign.value);
2811 if (!value) goto failed;
2812 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2813 goto failed;
2814 Py_DECREF(value);
2815 value = ast2obj_int(o->v.AnnAssign.simple);
2816 if (!value) goto failed;
2817 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2818 goto failed;
2819 Py_DECREF(value);
2820 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002821 case For_kind:
2822 result = PyType_GenericNew(For_type, NULL, NULL);
2823 if (!result) goto failed;
2824 value = ast2obj_expr(o->v.For.target);
2825 if (!value) goto failed;
2826 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2827 goto failed;
2828 Py_DECREF(value);
2829 value = ast2obj_expr(o->v.For.iter);
2830 if (!value) goto failed;
2831 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2832 goto failed;
2833 Py_DECREF(value);
2834 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2835 if (!value) goto failed;
2836 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2837 goto failed;
2838 Py_DECREF(value);
2839 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2840 if (!value) goto failed;
2841 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2842 goto failed;
2843 Py_DECREF(value);
2844 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002845 case AsyncFor_kind:
2846 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2847 if (!result) goto failed;
2848 value = ast2obj_expr(o->v.AsyncFor.target);
2849 if (!value) goto failed;
2850 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2851 goto failed;
2852 Py_DECREF(value);
2853 value = ast2obj_expr(o->v.AsyncFor.iter);
2854 if (!value) goto failed;
2855 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2856 goto failed;
2857 Py_DECREF(value);
2858 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2859 if (!value) goto failed;
2860 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2861 goto failed;
2862 Py_DECREF(value);
2863 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2864 if (!value) goto failed;
2865 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2866 goto failed;
2867 Py_DECREF(value);
2868 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002869 case While_kind:
2870 result = PyType_GenericNew(While_type, NULL, NULL);
2871 if (!result) goto failed;
2872 value = ast2obj_expr(o->v.While.test);
2873 if (!value) goto failed;
2874 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2875 goto failed;
2876 Py_DECREF(value);
2877 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2878 if (!value) goto failed;
2879 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2880 goto failed;
2881 Py_DECREF(value);
2882 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2883 if (!value) goto failed;
2884 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2885 goto failed;
2886 Py_DECREF(value);
2887 break;
2888 case If_kind:
2889 result = PyType_GenericNew(If_type, NULL, NULL);
2890 if (!result) goto failed;
2891 value = ast2obj_expr(o->v.If.test);
2892 if (!value) goto failed;
2893 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2894 goto failed;
2895 Py_DECREF(value);
2896 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2897 if (!value) goto failed;
2898 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2899 goto failed;
2900 Py_DECREF(value);
2901 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2902 if (!value) goto failed;
2903 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2904 goto failed;
2905 Py_DECREF(value);
2906 break;
2907 case With_kind:
2908 result = PyType_GenericNew(With_type, NULL, NULL);
2909 if (!result) goto failed;
2910 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
2911 if (!value) goto failed;
2912 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2913 goto failed;
2914 Py_DECREF(value);
2915 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2916 if (!value) goto failed;
2917 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2918 goto failed;
2919 Py_DECREF(value);
2920 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002921 case AsyncWith_kind:
2922 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
2923 if (!result) goto failed;
2924 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
2925 if (!value) goto failed;
2926 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2927 goto failed;
2928 Py_DECREF(value);
2929 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
2930 if (!value) goto failed;
2931 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2932 goto failed;
2933 Py_DECREF(value);
2934 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002935 case Raise_kind:
2936 result = PyType_GenericNew(Raise_type, NULL, NULL);
2937 if (!result) goto failed;
2938 value = ast2obj_expr(o->v.Raise.exc);
2939 if (!value) goto failed;
2940 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
2941 goto failed;
2942 Py_DECREF(value);
2943 value = ast2obj_expr(o->v.Raise.cause);
2944 if (!value) goto failed;
2945 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
2946 goto failed;
2947 Py_DECREF(value);
2948 break;
2949 case Try_kind:
2950 result = PyType_GenericNew(Try_type, NULL, NULL);
2951 if (!result) goto failed;
2952 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
2953 if (!value) goto failed;
2954 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2955 goto failed;
2956 Py_DECREF(value);
2957 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
2958 if (!value) goto failed;
2959 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
2960 goto failed;
2961 Py_DECREF(value);
2962 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
2963 if (!value) goto failed;
2964 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2965 goto failed;
2966 Py_DECREF(value);
2967 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
2968 if (!value) goto failed;
2969 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
2970 goto failed;
2971 Py_DECREF(value);
2972 break;
2973 case Assert_kind:
2974 result = PyType_GenericNew(Assert_type, NULL, NULL);
2975 if (!result) goto failed;
2976 value = ast2obj_expr(o->v.Assert.test);
2977 if (!value) goto failed;
2978 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2979 goto failed;
2980 Py_DECREF(value);
2981 value = ast2obj_expr(o->v.Assert.msg);
2982 if (!value) goto failed;
2983 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
2984 goto failed;
2985 Py_DECREF(value);
2986 break;
2987 case Import_kind:
2988 result = PyType_GenericNew(Import_type, NULL, NULL);
2989 if (!result) goto failed;
2990 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2991 if (!value) goto failed;
2992 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2993 goto failed;
2994 Py_DECREF(value);
2995 break;
2996 case ImportFrom_kind:
2997 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
2998 if (!result) goto failed;
2999 value = ast2obj_identifier(o->v.ImportFrom.module);
3000 if (!value) goto failed;
3001 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
3002 goto failed;
3003 Py_DECREF(value);
3004 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
3005 if (!value) goto failed;
3006 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3007 goto failed;
3008 Py_DECREF(value);
3009 value = ast2obj_int(o->v.ImportFrom.level);
3010 if (!value) goto failed;
3011 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
3012 goto failed;
3013 Py_DECREF(value);
3014 break;
3015 case Global_kind:
3016 result = PyType_GenericNew(Global_type, NULL, NULL);
3017 if (!result) goto failed;
3018 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
3019 if (!value) goto failed;
3020 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3021 goto failed;
3022 Py_DECREF(value);
3023 break;
3024 case Nonlocal_kind:
3025 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3026 if (!result) goto failed;
3027 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3028 if (!value) goto failed;
3029 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3030 goto failed;
3031 Py_DECREF(value);
3032 break;
3033 case Expr_kind:
3034 result = PyType_GenericNew(Expr_type, NULL, NULL);
3035 if (!result) goto failed;
3036 value = ast2obj_expr(o->v.Expr.value);
3037 if (!value) goto failed;
3038 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3039 goto failed;
3040 Py_DECREF(value);
3041 break;
3042 case Pass_kind:
3043 result = PyType_GenericNew(Pass_type, NULL, NULL);
3044 if (!result) goto failed;
3045 break;
3046 case Break_kind:
3047 result = PyType_GenericNew(Break_type, NULL, NULL);
3048 if (!result) goto failed;
3049 break;
3050 case Continue_kind:
3051 result = PyType_GenericNew(Continue_type, NULL, NULL);
3052 if (!result) goto failed;
3053 break;
3054 }
3055 value = ast2obj_int(o->lineno);
3056 if (!value) goto failed;
3057 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3058 goto failed;
3059 Py_DECREF(value);
3060 value = ast2obj_int(o->col_offset);
3061 if (!value) goto failed;
3062 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3063 goto failed;
3064 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003065 value = ast2obj_int(o->end_lineno);
3066 if (!value) goto failed;
3067 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3068 goto failed;
3069 Py_DECREF(value);
3070 value = ast2obj_int(o->end_col_offset);
3071 if (!value) goto failed;
3072 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3073 goto failed;
3074 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003075 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003076failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003077 Py_XDECREF(value);
3078 Py_XDECREF(result);
3079 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080}
3081
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003082PyObject*
3083ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003085 expr_ty o = (expr_ty)_o;
3086 PyObject *result = NULL, *value = NULL;
3087 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003088 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003089 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003090
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003091 switch (o->kind) {
3092 case BoolOp_kind:
3093 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3094 if (!result) goto failed;
3095 value = ast2obj_boolop(o->v.BoolOp.op);
3096 if (!value) goto failed;
3097 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3098 goto failed;
3099 Py_DECREF(value);
3100 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3101 if (!value) goto failed;
3102 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3103 goto failed;
3104 Py_DECREF(value);
3105 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003106 case NamedExpr_kind:
3107 result = PyType_GenericNew(NamedExpr_type, NULL, NULL);
3108 if (!result) goto failed;
3109 value = ast2obj_expr(o->v.NamedExpr.target);
3110 if (!value) goto failed;
3111 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3112 goto failed;
3113 Py_DECREF(value);
3114 value = ast2obj_expr(o->v.NamedExpr.value);
3115 if (!value) goto failed;
3116 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3117 goto failed;
3118 Py_DECREF(value);
3119 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003120 case BinOp_kind:
3121 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3122 if (!result) goto failed;
3123 value = ast2obj_expr(o->v.BinOp.left);
3124 if (!value) goto failed;
3125 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3126 goto failed;
3127 Py_DECREF(value);
3128 value = ast2obj_operator(o->v.BinOp.op);
3129 if (!value) goto failed;
3130 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3131 goto failed;
3132 Py_DECREF(value);
3133 value = ast2obj_expr(o->v.BinOp.right);
3134 if (!value) goto failed;
3135 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3136 goto failed;
3137 Py_DECREF(value);
3138 break;
3139 case UnaryOp_kind:
3140 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3141 if (!result) goto failed;
3142 value = ast2obj_unaryop(o->v.UnaryOp.op);
3143 if (!value) goto failed;
3144 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3145 goto failed;
3146 Py_DECREF(value);
3147 value = ast2obj_expr(o->v.UnaryOp.operand);
3148 if (!value) goto failed;
3149 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3150 goto failed;
3151 Py_DECREF(value);
3152 break;
3153 case Lambda_kind:
3154 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3155 if (!result) goto failed;
3156 value = ast2obj_arguments(o->v.Lambda.args);
3157 if (!value) goto failed;
3158 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3159 goto failed;
3160 Py_DECREF(value);
3161 value = ast2obj_expr(o->v.Lambda.body);
3162 if (!value) goto failed;
3163 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3164 goto failed;
3165 Py_DECREF(value);
3166 break;
3167 case IfExp_kind:
3168 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3169 if (!result) goto failed;
3170 value = ast2obj_expr(o->v.IfExp.test);
3171 if (!value) goto failed;
3172 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3173 goto failed;
3174 Py_DECREF(value);
3175 value = ast2obj_expr(o->v.IfExp.body);
3176 if (!value) goto failed;
3177 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3178 goto failed;
3179 Py_DECREF(value);
3180 value = ast2obj_expr(o->v.IfExp.orelse);
3181 if (!value) goto failed;
3182 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3183 goto failed;
3184 Py_DECREF(value);
3185 break;
3186 case Dict_kind:
3187 result = PyType_GenericNew(Dict_type, NULL, NULL);
3188 if (!result) goto failed;
3189 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3190 if (!value) goto failed;
3191 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3192 goto failed;
3193 Py_DECREF(value);
3194 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3195 if (!value) goto failed;
3196 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3197 goto failed;
3198 Py_DECREF(value);
3199 break;
3200 case Set_kind:
3201 result = PyType_GenericNew(Set_type, NULL, NULL);
3202 if (!result) goto failed;
3203 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3204 if (!value) goto failed;
3205 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3206 goto failed;
3207 Py_DECREF(value);
3208 break;
3209 case ListComp_kind:
3210 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3211 if (!result) goto failed;
3212 value = ast2obj_expr(o->v.ListComp.elt);
3213 if (!value) goto failed;
3214 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3215 goto failed;
3216 Py_DECREF(value);
3217 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3218 if (!value) goto failed;
3219 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3220 goto failed;
3221 Py_DECREF(value);
3222 break;
3223 case SetComp_kind:
3224 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3225 if (!result) goto failed;
3226 value = ast2obj_expr(o->v.SetComp.elt);
3227 if (!value) goto failed;
3228 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3229 goto failed;
3230 Py_DECREF(value);
3231 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3232 if (!value) goto failed;
3233 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3234 goto failed;
3235 Py_DECREF(value);
3236 break;
3237 case DictComp_kind:
3238 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3239 if (!result) goto failed;
3240 value = ast2obj_expr(o->v.DictComp.key);
3241 if (!value) goto failed;
3242 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3243 goto failed;
3244 Py_DECREF(value);
3245 value = ast2obj_expr(o->v.DictComp.value);
3246 if (!value) goto failed;
3247 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3248 goto failed;
3249 Py_DECREF(value);
3250 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3251 if (!value) goto failed;
3252 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3253 goto failed;
3254 Py_DECREF(value);
3255 break;
3256 case GeneratorExp_kind:
3257 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3258 if (!result) goto failed;
3259 value = ast2obj_expr(o->v.GeneratorExp.elt);
3260 if (!value) goto failed;
3261 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3262 goto failed;
3263 Py_DECREF(value);
3264 value = ast2obj_list(o->v.GeneratorExp.generators,
3265 ast2obj_comprehension);
3266 if (!value) goto failed;
3267 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3268 goto failed;
3269 Py_DECREF(value);
3270 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003271 case Await_kind:
3272 result = PyType_GenericNew(Await_type, NULL, NULL);
3273 if (!result) goto failed;
3274 value = ast2obj_expr(o->v.Await.value);
3275 if (!value) goto failed;
3276 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3277 goto failed;
3278 Py_DECREF(value);
3279 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003280 case Yield_kind:
3281 result = PyType_GenericNew(Yield_type, NULL, NULL);
3282 if (!result) goto failed;
3283 value = ast2obj_expr(o->v.Yield.value);
3284 if (!value) goto failed;
3285 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3286 goto failed;
3287 Py_DECREF(value);
3288 break;
3289 case YieldFrom_kind:
3290 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3291 if (!result) goto failed;
3292 value = ast2obj_expr(o->v.YieldFrom.value);
3293 if (!value) goto failed;
3294 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3295 goto failed;
3296 Py_DECREF(value);
3297 break;
3298 case Compare_kind:
3299 result = PyType_GenericNew(Compare_type, NULL, NULL);
3300 if (!result) goto failed;
3301 value = ast2obj_expr(o->v.Compare.left);
3302 if (!value) goto failed;
3303 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3304 goto failed;
3305 Py_DECREF(value);
3306 {
3307 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3308 value = PyList_New(n);
3309 if (!value) goto failed;
3310 for(i = 0; i < n; i++)
3311 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003312 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003313 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003314 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3315 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003316 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003317 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003318 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003319 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3320 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003321 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003322 break;
3323 case Call_kind:
3324 result = PyType_GenericNew(Call_type, NULL, NULL);
3325 if (!result) goto failed;
3326 value = ast2obj_expr(o->v.Call.func);
3327 if (!value) goto failed;
3328 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3329 goto failed;
3330 Py_DECREF(value);
3331 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3332 if (!value) goto failed;
3333 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3334 goto failed;
3335 Py_DECREF(value);
3336 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3337 if (!value) goto failed;
3338 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3339 goto failed;
3340 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003341 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003342 case FormattedValue_kind:
3343 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3344 if (!result) goto failed;
3345 value = ast2obj_expr(o->v.FormattedValue.value);
3346 if (!value) goto failed;
3347 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3348 goto failed;
3349 Py_DECREF(value);
3350 value = ast2obj_int(o->v.FormattedValue.conversion);
3351 if (!value) goto failed;
3352 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3353 goto failed;
3354 Py_DECREF(value);
3355 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3356 if (!value) goto failed;
3357 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3358 goto failed;
3359 Py_DECREF(value);
3360 break;
3361 case JoinedStr_kind:
3362 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3363 if (!result) goto failed;
3364 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3365 if (!value) goto failed;
3366 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3367 goto failed;
3368 Py_DECREF(value);
3369 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003370 case Constant_kind:
3371 result = PyType_GenericNew(Constant_type, NULL, NULL);
3372 if (!result) goto failed;
3373 value = ast2obj_constant(o->v.Constant.value);
3374 if (!value) goto failed;
3375 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3376 goto failed;
3377 Py_DECREF(value);
3378 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003379 case Attribute_kind:
3380 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3381 if (!result) goto failed;
3382 value = ast2obj_expr(o->v.Attribute.value);
3383 if (!value) goto failed;
3384 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3385 goto failed;
3386 Py_DECREF(value);
3387 value = ast2obj_identifier(o->v.Attribute.attr);
3388 if (!value) goto failed;
3389 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3390 goto failed;
3391 Py_DECREF(value);
3392 value = ast2obj_expr_context(o->v.Attribute.ctx);
3393 if (!value) goto failed;
3394 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3395 goto failed;
3396 Py_DECREF(value);
3397 break;
3398 case Subscript_kind:
3399 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3400 if (!result) goto failed;
3401 value = ast2obj_expr(o->v.Subscript.value);
3402 if (!value) goto failed;
3403 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3404 goto failed;
3405 Py_DECREF(value);
3406 value = ast2obj_slice(o->v.Subscript.slice);
3407 if (!value) goto failed;
3408 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3409 goto failed;
3410 Py_DECREF(value);
3411 value = ast2obj_expr_context(o->v.Subscript.ctx);
3412 if (!value) goto failed;
3413 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3414 goto failed;
3415 Py_DECREF(value);
3416 break;
3417 case Starred_kind:
3418 result = PyType_GenericNew(Starred_type, NULL, NULL);
3419 if (!result) goto failed;
3420 value = ast2obj_expr(o->v.Starred.value);
3421 if (!value) goto failed;
3422 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3423 goto failed;
3424 Py_DECREF(value);
3425 value = ast2obj_expr_context(o->v.Starred.ctx);
3426 if (!value) goto failed;
3427 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3428 goto failed;
3429 Py_DECREF(value);
3430 break;
3431 case Name_kind:
3432 result = PyType_GenericNew(Name_type, NULL, NULL);
3433 if (!result) goto failed;
3434 value = ast2obj_identifier(o->v.Name.id);
3435 if (!value) goto failed;
3436 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3437 goto failed;
3438 Py_DECREF(value);
3439 value = ast2obj_expr_context(o->v.Name.ctx);
3440 if (!value) goto failed;
3441 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3442 goto failed;
3443 Py_DECREF(value);
3444 break;
3445 case List_kind:
3446 result = PyType_GenericNew(List_type, NULL, NULL);
3447 if (!result) goto failed;
3448 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3449 if (!value) goto failed;
3450 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3451 goto failed;
3452 Py_DECREF(value);
3453 value = ast2obj_expr_context(o->v.List.ctx);
3454 if (!value) goto failed;
3455 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3456 goto failed;
3457 Py_DECREF(value);
3458 break;
3459 case Tuple_kind:
3460 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3461 if (!result) goto failed;
3462 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3463 if (!value) goto failed;
3464 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3465 goto failed;
3466 Py_DECREF(value);
3467 value = ast2obj_expr_context(o->v.Tuple.ctx);
3468 if (!value) goto failed;
3469 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3470 goto failed;
3471 Py_DECREF(value);
3472 break;
3473 }
3474 value = ast2obj_int(o->lineno);
3475 if (!value) goto failed;
3476 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3477 goto failed;
3478 Py_DECREF(value);
3479 value = ast2obj_int(o->col_offset);
3480 if (!value) goto failed;
3481 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3482 goto failed;
3483 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003484 value = ast2obj_int(o->end_lineno);
3485 if (!value) goto failed;
3486 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3487 goto failed;
3488 Py_DECREF(value);
3489 value = ast2obj_int(o->end_col_offset);
3490 if (!value) goto failed;
3491 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3492 goto failed;
3493 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003494 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003495failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003496 Py_XDECREF(value);
3497 Py_XDECREF(result);
3498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003499}
3500
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003501PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003502{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003503 switch(o) {
3504 case Load:
3505 Py_INCREF(Load_singleton);
3506 return Load_singleton;
3507 case Store:
3508 Py_INCREF(Store_singleton);
3509 return Store_singleton;
3510 case Del:
3511 Py_INCREF(Del_singleton);
3512 return Del_singleton;
3513 case AugLoad:
3514 Py_INCREF(AugLoad_singleton);
3515 return AugLoad_singleton;
3516 case AugStore:
3517 Py_INCREF(AugStore_singleton);
3518 return AugStore_singleton;
3519 case Param:
3520 Py_INCREF(Param_singleton);
3521 return Param_singleton;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003522 case NamedStore:
3523 Py_INCREF(NamedStore_singleton);
3524 return NamedStore_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003525 default:
3526 /* should never happen, but just in case ... */
3527 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3528 return NULL;
3529 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003530}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003531PyObject*
3532ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003534 slice_ty o = (slice_ty)_o;
3535 PyObject *result = NULL, *value = NULL;
3536 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003537 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003538 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003539
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003540 switch (o->kind) {
3541 case Slice_kind:
3542 result = PyType_GenericNew(Slice_type, NULL, NULL);
3543 if (!result) goto failed;
3544 value = ast2obj_expr(o->v.Slice.lower);
3545 if (!value) goto failed;
3546 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3547 goto failed;
3548 Py_DECREF(value);
3549 value = ast2obj_expr(o->v.Slice.upper);
3550 if (!value) goto failed;
3551 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3552 goto failed;
3553 Py_DECREF(value);
3554 value = ast2obj_expr(o->v.Slice.step);
3555 if (!value) goto failed;
3556 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3557 goto failed;
3558 Py_DECREF(value);
3559 break;
3560 case ExtSlice_kind:
3561 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3562 if (!result) goto failed;
3563 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3564 if (!value) goto failed;
3565 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3566 goto failed;
3567 Py_DECREF(value);
3568 break;
3569 case Index_kind:
3570 result = PyType_GenericNew(Index_type, NULL, NULL);
3571 if (!result) goto failed;
3572 value = ast2obj_expr(o->v.Index.value);
3573 if (!value) goto failed;
3574 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3575 goto failed;
3576 Py_DECREF(value);
3577 break;
3578 }
3579 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003580failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003581 Py_XDECREF(value);
3582 Py_XDECREF(result);
3583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584}
3585
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003586PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003588 switch(o) {
3589 case And:
3590 Py_INCREF(And_singleton);
3591 return And_singleton;
3592 case Or:
3593 Py_INCREF(Or_singleton);
3594 return Or_singleton;
3595 default:
3596 /* should never happen, but just in case ... */
3597 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3598 return NULL;
3599 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003600}
3601PyObject* ast2obj_operator(operator_ty o)
3602{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003603 switch(o) {
3604 case Add:
3605 Py_INCREF(Add_singleton);
3606 return Add_singleton;
3607 case Sub:
3608 Py_INCREF(Sub_singleton);
3609 return Sub_singleton;
3610 case Mult:
3611 Py_INCREF(Mult_singleton);
3612 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003613 case MatMult:
3614 Py_INCREF(MatMult_singleton);
3615 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003616 case Div:
3617 Py_INCREF(Div_singleton);
3618 return Div_singleton;
3619 case Mod:
3620 Py_INCREF(Mod_singleton);
3621 return Mod_singleton;
3622 case Pow:
3623 Py_INCREF(Pow_singleton);
3624 return Pow_singleton;
3625 case LShift:
3626 Py_INCREF(LShift_singleton);
3627 return LShift_singleton;
3628 case RShift:
3629 Py_INCREF(RShift_singleton);
3630 return RShift_singleton;
3631 case BitOr:
3632 Py_INCREF(BitOr_singleton);
3633 return BitOr_singleton;
3634 case BitXor:
3635 Py_INCREF(BitXor_singleton);
3636 return BitXor_singleton;
3637 case BitAnd:
3638 Py_INCREF(BitAnd_singleton);
3639 return BitAnd_singleton;
3640 case FloorDiv:
3641 Py_INCREF(FloorDiv_singleton);
3642 return FloorDiv_singleton;
3643 default:
3644 /* should never happen, but just in case ... */
3645 PyErr_Format(PyExc_SystemError, "unknown operator found");
3646 return NULL;
3647 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003648}
3649PyObject* ast2obj_unaryop(unaryop_ty o)
3650{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003651 switch(o) {
3652 case Invert:
3653 Py_INCREF(Invert_singleton);
3654 return Invert_singleton;
3655 case Not:
3656 Py_INCREF(Not_singleton);
3657 return Not_singleton;
3658 case UAdd:
3659 Py_INCREF(UAdd_singleton);
3660 return UAdd_singleton;
3661 case USub:
3662 Py_INCREF(USub_singleton);
3663 return USub_singleton;
3664 default:
3665 /* should never happen, but just in case ... */
3666 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3667 return NULL;
3668 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003669}
3670PyObject* ast2obj_cmpop(cmpop_ty o)
3671{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003672 switch(o) {
3673 case Eq:
3674 Py_INCREF(Eq_singleton);
3675 return Eq_singleton;
3676 case NotEq:
3677 Py_INCREF(NotEq_singleton);
3678 return NotEq_singleton;
3679 case Lt:
3680 Py_INCREF(Lt_singleton);
3681 return Lt_singleton;
3682 case LtE:
3683 Py_INCREF(LtE_singleton);
3684 return LtE_singleton;
3685 case Gt:
3686 Py_INCREF(Gt_singleton);
3687 return Gt_singleton;
3688 case GtE:
3689 Py_INCREF(GtE_singleton);
3690 return GtE_singleton;
3691 case Is:
3692 Py_INCREF(Is_singleton);
3693 return Is_singleton;
3694 case IsNot:
3695 Py_INCREF(IsNot_singleton);
3696 return IsNot_singleton;
3697 case In:
3698 Py_INCREF(In_singleton);
3699 return In_singleton;
3700 case NotIn:
3701 Py_INCREF(NotIn_singleton);
3702 return NotIn_singleton;
3703 default:
3704 /* should never happen, but just in case ... */
3705 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3706 return NULL;
3707 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003708}
3709PyObject*
3710ast2obj_comprehension(void* _o)
3711{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003712 comprehension_ty o = (comprehension_ty)_o;
3713 PyObject *result = NULL, *value = NULL;
3714 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003715 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003716 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003717
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003718 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3719 if (!result) return NULL;
3720 value = ast2obj_expr(o->target);
3721 if (!value) goto failed;
3722 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3723 goto failed;
3724 Py_DECREF(value);
3725 value = ast2obj_expr(o->iter);
3726 if (!value) goto failed;
3727 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3728 goto failed;
3729 Py_DECREF(value);
3730 value = ast2obj_list(o->ifs, ast2obj_expr);
3731 if (!value) goto failed;
3732 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3733 goto failed;
3734 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003735 value = ast2obj_int(o->is_async);
3736 if (!value) goto failed;
3737 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3738 goto failed;
3739 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003740 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003741failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003742 Py_XDECREF(value);
3743 Py_XDECREF(result);
3744 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003745}
3746
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003747PyObject*
3748ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003749{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003750 excepthandler_ty o = (excepthandler_ty)_o;
3751 PyObject *result = NULL, *value = NULL;
3752 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003753 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003754 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003755
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003756 switch (o->kind) {
3757 case ExceptHandler_kind:
3758 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3759 if (!result) goto failed;
3760 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003761 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003762 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3763 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003764 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003765 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003766 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003767 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3768 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003769 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003770 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3771 if (!value) goto failed;
3772 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3773 goto failed;
3774 Py_DECREF(value);
3775 break;
3776 }
3777 value = ast2obj_int(o->lineno);
3778 if (!value) goto failed;
3779 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3780 goto failed;
3781 Py_DECREF(value);
3782 value = ast2obj_int(o->col_offset);
3783 if (!value) goto failed;
3784 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3785 goto failed;
3786 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003787 value = ast2obj_int(o->end_lineno);
3788 if (!value) goto failed;
3789 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3790 goto failed;
3791 Py_DECREF(value);
3792 value = ast2obj_int(o->end_col_offset);
3793 if (!value) goto failed;
3794 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3795 goto failed;
3796 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003797 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003798failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003799 Py_XDECREF(value);
3800 Py_XDECREF(result);
3801 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003802}
3803
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003804PyObject*
3805ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003806{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003807 arguments_ty o = (arguments_ty)_o;
3808 PyObject *result = NULL, *value = NULL;
3809 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003810 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003811 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003812
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003813 result = PyType_GenericNew(arguments_type, NULL, NULL);
3814 if (!result) return NULL;
3815 value = ast2obj_list(o->args, ast2obj_arg);
3816 if (!value) goto failed;
3817 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3818 goto failed;
3819 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003820 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003821 if (!value) goto failed;
3822 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3823 goto failed;
3824 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003825 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3826 if (!value) goto failed;
3827 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3828 goto failed;
3829 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003830 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003831 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003832 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003833 goto failed;
3834 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003835 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003836 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003837 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003838 goto failed;
3839 Py_DECREF(value);
3840 value = ast2obj_list(o->defaults, ast2obj_expr);
3841 if (!value) goto failed;
3842 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3843 goto failed;
3844 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003845 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003846failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003847 Py_XDECREF(value);
3848 Py_XDECREF(result);
3849 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003850}
3851
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003852PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003853ast2obj_arg(void* _o)
3854{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003855 arg_ty o = (arg_ty)_o;
3856 PyObject *result = NULL, *value = NULL;
3857 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003858 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003859 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003860
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003861 result = PyType_GenericNew(arg_type, NULL, NULL);
3862 if (!result) return NULL;
3863 value = ast2obj_identifier(o->arg);
3864 if (!value) goto failed;
3865 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3866 goto failed;
3867 Py_DECREF(value);
3868 value = ast2obj_expr(o->annotation);
3869 if (!value) goto failed;
3870 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
3871 goto failed;
3872 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003873 value = ast2obj_int(o->lineno);
3874 if (!value) goto failed;
3875 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3876 goto failed;
3877 Py_DECREF(value);
3878 value = ast2obj_int(o->col_offset);
3879 if (!value) goto failed;
3880 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3881 goto failed;
3882 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003883 value = ast2obj_int(o->end_lineno);
3884 if (!value) goto failed;
3885 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3886 goto failed;
3887 Py_DECREF(value);
3888 value = ast2obj_int(o->end_col_offset);
3889 if (!value) goto failed;
3890 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3891 goto failed;
3892 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003893 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00003894failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003895 Py_XDECREF(value);
3896 Py_XDECREF(result);
3897 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003898}
3899
3900PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003901ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003902{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003903 keyword_ty o = (keyword_ty)_o;
3904 PyObject *result = NULL, *value = NULL;
3905 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003906 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003907 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003908
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003909 result = PyType_GenericNew(keyword_type, NULL, NULL);
3910 if (!result) return NULL;
3911 value = ast2obj_identifier(o->arg);
3912 if (!value) goto failed;
3913 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3914 goto failed;
3915 Py_DECREF(value);
3916 value = ast2obj_expr(o->value);
3917 if (!value) goto failed;
3918 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3919 goto failed;
3920 Py_DECREF(value);
3921 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003922failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003923 Py_XDECREF(value);
3924 Py_XDECREF(result);
3925 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926}
3927
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003928PyObject*
3929ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003930{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003931 alias_ty o = (alias_ty)_o;
3932 PyObject *result = NULL, *value = NULL;
3933 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003934 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003935 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003936
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003937 result = PyType_GenericNew(alias_type, NULL, NULL);
3938 if (!result) return NULL;
3939 value = ast2obj_identifier(o->name);
3940 if (!value) goto failed;
3941 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3942 goto failed;
3943 Py_DECREF(value);
3944 value = ast2obj_identifier(o->asname);
3945 if (!value) goto failed;
3946 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
3947 goto failed;
3948 Py_DECREF(value);
3949 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003950failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003951 Py_XDECREF(value);
3952 Py_XDECREF(result);
3953 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003954}
3955
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003956PyObject*
3957ast2obj_withitem(void* _o)
3958{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003959 withitem_ty o = (withitem_ty)_o;
3960 PyObject *result = NULL, *value = NULL;
3961 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003962 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003963 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003964
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003965 result = PyType_GenericNew(withitem_type, NULL, NULL);
3966 if (!result) return NULL;
3967 value = ast2obj_expr(o->context_expr);
3968 if (!value) goto failed;
3969 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
3970 goto failed;
3971 Py_DECREF(value);
3972 value = ast2obj_expr(o->optional_vars);
3973 if (!value) goto failed;
3974 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
3975 goto failed;
3976 Py_DECREF(value);
3977 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003978failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003979 Py_XDECREF(value);
3980 Py_XDECREF(result);
3981 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003982}
3983
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003984
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003985int
3986obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3987{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003988 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003989
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003990 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003991
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003992 if (obj == Py_None) {
3993 *out = NULL;
3994 return 0;
3995 }
3996 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3997 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003998 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003999 }
4000 if (isinstance) {
4001 asdl_seq* body;
4002
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004003 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4004 return 1;
4005 }
4006 if (tmp == NULL) {
4007 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4008 return 1;
4009 }
4010 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004011 int res;
4012 Py_ssize_t len;
4013 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004014 if (!PyList_Check(tmp)) {
4015 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4016 goto failed;
4017 }
4018 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004019 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004020 if (body == NULL) goto failed;
4021 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004022 stmt_ty val;
4023 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004024 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004025 if (len != PyList_GET_SIZE(tmp)) {
4026 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
4027 goto failed;
4028 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004029 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004030 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004031 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004032 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004033 *out = Module(body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004034 if (*out == NULL) goto failed;
4035 return 0;
4036 }
4037 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
4038 if (isinstance == -1) {
4039 return 1;
4040 }
4041 if (isinstance) {
4042 asdl_seq* body;
4043
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004044 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4045 return 1;
4046 }
4047 if (tmp == NULL) {
4048 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4049 return 1;
4050 }
4051 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004052 int res;
4053 Py_ssize_t len;
4054 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004055 if (!PyList_Check(tmp)) {
4056 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4057 goto failed;
4058 }
4059 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004060 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004061 if (body == NULL) goto failed;
4062 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004063 stmt_ty val;
4064 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004065 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004066 if (len != PyList_GET_SIZE(tmp)) {
4067 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4068 goto failed;
4069 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004070 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004071 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004072 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004073 }
4074 *out = Interactive(body, arena);
4075 if (*out == NULL) goto failed;
4076 return 0;
4077 }
4078 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4079 if (isinstance == -1) {
4080 return 1;
4081 }
4082 if (isinstance) {
4083 expr_ty body;
4084
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004085 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4086 return 1;
4087 }
4088 if (tmp == NULL) {
4089 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4090 return 1;
4091 }
4092 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004093 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004094 res = obj2ast_expr(tmp, &body, arena);
4095 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004096 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004097 }
4098 *out = Expression(body, arena);
4099 if (*out == NULL) goto failed;
4100 return 0;
4101 }
4102 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4103 if (isinstance == -1) {
4104 return 1;
4105 }
4106 if (isinstance) {
4107 asdl_seq* body;
4108
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004109 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4110 return 1;
4111 }
4112 if (tmp == NULL) {
4113 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4114 return 1;
4115 }
4116 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004117 int res;
4118 Py_ssize_t len;
4119 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004120 if (!PyList_Check(tmp)) {
4121 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4122 goto failed;
4123 }
4124 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004125 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004126 if (body == NULL) goto failed;
4127 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004128 stmt_ty val;
4129 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004130 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004131 if (len != PyList_GET_SIZE(tmp)) {
4132 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4133 goto failed;
4134 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004135 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004136 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004137 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004138 }
4139 *out = Suite(body, arena);
4140 if (*out == NULL) goto failed;
4141 return 0;
4142 }
4143
4144 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4145 failed:
4146 Py_XDECREF(tmp);
4147 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004148}
4149
4150int
4151obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4152{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004153 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004154
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004155 PyObject *tmp = NULL;
4156 int lineno;
4157 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004158 int end_lineno;
4159 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004160
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004161 if (obj == Py_None) {
4162 *out = NULL;
4163 return 0;
4164 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004165 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4166 return 1;
4167 }
4168 if (tmp == NULL) {
4169 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4170 return 1;
4171 }
4172 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004173 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004174 res = obj2ast_int(tmp, &lineno, arena);
4175 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004176 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004177 }
4178 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004179 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004180 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004181 if (tmp == NULL) {
4182 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4183 return 1;
4184 }
4185 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004186 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004187 res = obj2ast_int(tmp, &col_offset, arena);
4188 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004189 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004190 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004191 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
4192 return 1;
4193 }
4194 if (tmp == NULL || tmp == Py_None) {
4195 Py_CLEAR(tmp);
4196 end_lineno = 0;
4197 }
4198 else {
4199 int res;
4200 res = obj2ast_int(tmp, &end_lineno, arena);
4201 if (res != 0) goto failed;
4202 Py_CLEAR(tmp);
4203 }
4204 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
4205 return 1;
4206 }
4207 if (tmp == NULL || tmp == Py_None) {
4208 Py_CLEAR(tmp);
4209 end_col_offset = 0;
4210 }
4211 else {
4212 int res;
4213 res = obj2ast_int(tmp, &end_col_offset, arena);
4214 if (res != 0) goto failed;
4215 Py_CLEAR(tmp);
4216 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004217 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4218 if (isinstance == -1) {
4219 return 1;
4220 }
4221 if (isinstance) {
4222 identifier name;
4223 arguments_ty args;
4224 asdl_seq* body;
4225 asdl_seq* decorator_list;
4226 expr_ty returns;
4227
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004228 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4229 return 1;
4230 }
4231 if (tmp == NULL) {
4232 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4233 return 1;
4234 }
4235 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004236 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004237 res = obj2ast_identifier(tmp, &name, arena);
4238 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004239 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004240 }
4241 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004242 return 1;
4243 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004244 if (tmp == NULL) {
4245 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4246 return 1;
4247 }
4248 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004249 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004250 res = obj2ast_arguments(tmp, &args, arena);
4251 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004252 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004253 }
4254 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004255 return 1;
4256 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004257 if (tmp == NULL) {
4258 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4259 return 1;
4260 }
4261 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004262 int res;
4263 Py_ssize_t len;
4264 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004265 if (!PyList_Check(tmp)) {
4266 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4267 goto failed;
4268 }
4269 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004270 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004271 if (body == NULL) goto failed;
4272 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004273 stmt_ty val;
4274 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004275 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004276 if (len != PyList_GET_SIZE(tmp)) {
4277 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4278 goto failed;
4279 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004280 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004281 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004282 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004283 }
4284 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004285 return 1;
4286 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004287 if (tmp == NULL) {
4288 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4289 return 1;
4290 }
4291 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004292 int res;
4293 Py_ssize_t len;
4294 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004295 if (!PyList_Check(tmp)) {
4296 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4297 goto failed;
4298 }
4299 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004300 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004301 if (decorator_list == NULL) goto failed;
4302 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004303 expr_ty val;
4304 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004305 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004306 if (len != PyList_GET_SIZE(tmp)) {
4307 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4308 goto failed;
4309 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004310 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004311 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004312 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004313 }
4314 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004315 return 1;
4316 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004317 if (tmp == NULL || tmp == Py_None) {
4318 Py_CLEAR(tmp);
4319 returns = NULL;
4320 }
4321 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004322 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004323 res = obj2ast_expr(tmp, &returns, arena);
4324 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004325 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004326 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004327 *out = FunctionDef(name, args, body, decorator_list, returns, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004328 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004329 if (*out == NULL) goto failed;
4330 return 0;
4331 }
Yury Selivanov75445082015-05-11 22:57:16 -04004332 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4333 if (isinstance == -1) {
4334 return 1;
4335 }
4336 if (isinstance) {
4337 identifier name;
4338 arguments_ty args;
4339 asdl_seq* body;
4340 asdl_seq* decorator_list;
4341 expr_ty returns;
4342
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004343 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4344 return 1;
4345 }
4346 if (tmp == NULL) {
4347 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4348 return 1;
4349 }
4350 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004351 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004352 res = obj2ast_identifier(tmp, &name, arena);
4353 if (res != 0) goto failed;
4354 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004355 }
4356 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004357 return 1;
4358 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004359 if (tmp == NULL) {
4360 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4361 return 1;
4362 }
4363 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004364 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004365 res = obj2ast_arguments(tmp, &args, arena);
4366 if (res != 0) goto failed;
4367 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004368 }
4369 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004370 return 1;
4371 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004372 if (tmp == NULL) {
4373 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4374 return 1;
4375 }
4376 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004377 int res;
4378 Py_ssize_t len;
4379 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004380 if (!PyList_Check(tmp)) {
4381 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4382 goto failed;
4383 }
4384 len = PyList_GET_SIZE(tmp);
4385 body = _Py_asdl_seq_new(len, arena);
4386 if (body == NULL) goto failed;
4387 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004388 stmt_ty val;
4389 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004390 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004391 if (len != PyList_GET_SIZE(tmp)) {
4392 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4393 goto failed;
4394 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004395 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004396 }
4397 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004398 }
4399 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004400 return 1;
4401 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004402 if (tmp == NULL) {
4403 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4404 return 1;
4405 }
4406 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004407 int res;
4408 Py_ssize_t len;
4409 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004410 if (!PyList_Check(tmp)) {
4411 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4412 goto failed;
4413 }
4414 len = PyList_GET_SIZE(tmp);
4415 decorator_list = _Py_asdl_seq_new(len, arena);
4416 if (decorator_list == NULL) goto failed;
4417 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004418 expr_ty val;
4419 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004420 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004421 if (len != PyList_GET_SIZE(tmp)) {
4422 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4423 goto failed;
4424 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004425 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004426 }
4427 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004428 }
4429 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004430 return 1;
4431 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004432 if (tmp == NULL || tmp == Py_None) {
4433 Py_CLEAR(tmp);
4434 returns = NULL;
4435 }
4436 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004437 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004438 res = obj2ast_expr(tmp, &returns, arena);
4439 if (res != 0) goto failed;
4440 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004441 }
4442 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004443 lineno, col_offset, end_lineno, end_col_offset,
4444 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004445 if (*out == NULL) goto failed;
4446 return 0;
4447 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004448 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4449 if (isinstance == -1) {
4450 return 1;
4451 }
4452 if (isinstance) {
4453 identifier name;
4454 asdl_seq* bases;
4455 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004456 asdl_seq* body;
4457 asdl_seq* decorator_list;
4458
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004459 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4460 return 1;
4461 }
4462 if (tmp == NULL) {
4463 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4464 return 1;
4465 }
4466 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004467 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004468 res = obj2ast_identifier(tmp, &name, arena);
4469 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004470 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004471 }
4472 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004473 return 1;
4474 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004475 if (tmp == NULL) {
4476 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4477 return 1;
4478 }
4479 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004480 int res;
4481 Py_ssize_t len;
4482 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004483 if (!PyList_Check(tmp)) {
4484 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4485 goto failed;
4486 }
4487 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004488 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004489 if (bases == NULL) goto failed;
4490 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004491 expr_ty val;
4492 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004493 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004494 if (len != PyList_GET_SIZE(tmp)) {
4495 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4496 goto failed;
4497 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004498 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004499 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004500 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004501 }
4502 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004503 return 1;
4504 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004505 if (tmp == NULL) {
4506 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4507 return 1;
4508 }
4509 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004510 int res;
4511 Py_ssize_t len;
4512 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004513 if (!PyList_Check(tmp)) {
4514 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4515 goto failed;
4516 }
4517 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004518 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004519 if (keywords == NULL) goto failed;
4520 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004521 keyword_ty val;
4522 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004523 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004524 if (len != PyList_GET_SIZE(tmp)) {
4525 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4526 goto failed;
4527 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004528 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004529 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004530 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004531 }
4532 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004533 return 1;
4534 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004535 if (tmp == NULL) {
4536 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4537 return 1;
4538 }
4539 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004540 int res;
4541 Py_ssize_t len;
4542 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004543 if (!PyList_Check(tmp)) {
4544 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4545 goto failed;
4546 }
4547 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004548 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004549 if (body == NULL) goto failed;
4550 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004551 stmt_ty val;
4552 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004553 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004554 if (len != PyList_GET_SIZE(tmp)) {
4555 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4556 goto failed;
4557 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004558 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004559 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004560 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004561 }
4562 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004563 return 1;
4564 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004565 if (tmp == NULL) {
4566 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4567 return 1;
4568 }
4569 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004570 int res;
4571 Py_ssize_t len;
4572 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004573 if (!PyList_Check(tmp)) {
4574 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4575 goto failed;
4576 }
4577 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004578 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004579 if (decorator_list == NULL) goto failed;
4580 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004581 expr_ty val;
4582 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004583 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004584 if (len != PyList_GET_SIZE(tmp)) {
4585 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4586 goto failed;
4587 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004588 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004589 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004590 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004591 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004592 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004593 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004594 if (*out == NULL) goto failed;
4595 return 0;
4596 }
4597 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4598 if (isinstance == -1) {
4599 return 1;
4600 }
4601 if (isinstance) {
4602 expr_ty value;
4603
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004604 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4605 return 1;
4606 }
4607 if (tmp == NULL || tmp == Py_None) {
4608 Py_CLEAR(tmp);
4609 value = NULL;
4610 }
4611 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004612 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004613 res = obj2ast_expr(tmp, &value, arena);
4614 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004615 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004616 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004617 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
4618 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004619 if (*out == NULL) goto failed;
4620 return 0;
4621 }
4622 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4623 if (isinstance == -1) {
4624 return 1;
4625 }
4626 if (isinstance) {
4627 asdl_seq* targets;
4628
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004629 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4630 return 1;
4631 }
4632 if (tmp == NULL) {
4633 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4634 return 1;
4635 }
4636 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004637 int res;
4638 Py_ssize_t len;
4639 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004640 if (!PyList_Check(tmp)) {
4641 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4642 goto failed;
4643 }
4644 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004645 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004646 if (targets == NULL) goto failed;
4647 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004648 expr_ty val;
4649 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004650 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004651 if (len != PyList_GET_SIZE(tmp)) {
4652 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4653 goto failed;
4654 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004655 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004656 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004657 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004658 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004659 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
4660 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004661 if (*out == NULL) goto failed;
4662 return 0;
4663 }
4664 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4665 if (isinstance == -1) {
4666 return 1;
4667 }
4668 if (isinstance) {
4669 asdl_seq* targets;
4670 expr_ty value;
4671
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004672 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4673 return 1;
4674 }
4675 if (tmp == NULL) {
4676 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4677 return 1;
4678 }
4679 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004680 int res;
4681 Py_ssize_t len;
4682 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004683 if (!PyList_Check(tmp)) {
4684 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4685 goto failed;
4686 }
4687 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004688 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004689 if (targets == NULL) goto failed;
4690 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004691 expr_ty val;
4692 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004693 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004694 if (len != PyList_GET_SIZE(tmp)) {
4695 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4696 goto failed;
4697 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004698 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004699 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004700 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004701 }
4702 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004703 return 1;
4704 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004705 if (tmp == NULL) {
4706 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4707 return 1;
4708 }
4709 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004710 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004711 res = obj2ast_expr(tmp, &value, arena);
4712 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004713 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004714 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004715 *out = Assign(targets, value, lineno, col_offset, end_lineno,
4716 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004717 if (*out == NULL) goto failed;
4718 return 0;
4719 }
4720 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
4721 if (isinstance == -1) {
4722 return 1;
4723 }
4724 if (isinstance) {
4725 expr_ty target;
4726 operator_ty op;
4727 expr_ty value;
4728
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004729 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4730 return 1;
4731 }
4732 if (tmp == NULL) {
4733 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
4734 return 1;
4735 }
4736 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004737 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004738 res = obj2ast_expr(tmp, &target, arena);
4739 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004740 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004741 }
4742 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004743 return 1;
4744 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004745 if (tmp == NULL) {
4746 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
4747 return 1;
4748 }
4749 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004750 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004751 res = obj2ast_operator(tmp, &op, arena);
4752 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004753 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004754 }
4755 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004756 return 1;
4757 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004758 if (tmp == NULL) {
4759 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
4760 return 1;
4761 }
4762 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004763 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004764 res = obj2ast_expr(tmp, &value, arena);
4765 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004766 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004767 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004768 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
4769 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004770 if (*out == NULL) goto failed;
4771 return 0;
4772 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004773 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
4774 if (isinstance == -1) {
4775 return 1;
4776 }
4777 if (isinstance) {
4778 expr_ty target;
4779 expr_ty annotation;
4780 expr_ty value;
4781 int simple;
4782
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004783 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4784 return 1;
4785 }
4786 if (tmp == NULL) {
4787 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
4788 return 1;
4789 }
4790 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004791 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004792 res = obj2ast_expr(tmp, &target, arena);
4793 if (res != 0) goto failed;
4794 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004795 }
4796 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004797 return 1;
4798 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004799 if (tmp == NULL) {
4800 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
4801 return 1;
4802 }
4803 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004804 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004805 res = obj2ast_expr(tmp, &annotation, arena);
4806 if (res != 0) goto failed;
4807 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004808 }
4809 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004810 return 1;
4811 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004812 if (tmp == NULL || tmp == Py_None) {
4813 Py_CLEAR(tmp);
4814 value = NULL;
4815 }
4816 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004817 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004818 res = obj2ast_expr(tmp, &value, arena);
4819 if (res != 0) goto failed;
4820 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004821 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004822 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
4823 return 1;
4824 }
4825 if (tmp == NULL) {
4826 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
4827 return 1;
4828 }
4829 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004830 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004831 res = obj2ast_int(tmp, &simple, arena);
4832 if (res != 0) goto failed;
4833 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004834 }
4835 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004836 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004837 if (*out == NULL) goto failed;
4838 return 0;
4839 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004840 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
4841 if (isinstance == -1) {
4842 return 1;
4843 }
4844 if (isinstance) {
4845 expr_ty target;
4846 expr_ty iter;
4847 asdl_seq* body;
4848 asdl_seq* orelse;
4849
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004850 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4851 return 1;
4852 }
4853 if (tmp == NULL) {
4854 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4855 return 1;
4856 }
4857 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004858 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004859 res = obj2ast_expr(tmp, &target, arena);
4860 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004861 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004862 }
4863 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004864 return 1;
4865 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004866 if (tmp == NULL) {
4867 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4868 return 1;
4869 }
4870 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004871 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004872 res = obj2ast_expr(tmp, &iter, arena);
4873 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004874 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004875 }
4876 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004877 return 1;
4878 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004879 if (tmp == NULL) {
4880 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4881 return 1;
4882 }
4883 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004884 int res;
4885 Py_ssize_t len;
4886 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004887 if (!PyList_Check(tmp)) {
4888 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4889 goto failed;
4890 }
4891 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004892 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004893 if (body == NULL) goto failed;
4894 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004895 stmt_ty val;
4896 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004897 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004898 if (len != PyList_GET_SIZE(tmp)) {
4899 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
4900 goto failed;
4901 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004902 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004903 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004904 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004905 }
4906 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004907 return 1;
4908 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004909 if (tmp == NULL) {
4910 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4911 return 1;
4912 }
4913 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004914 int res;
4915 Py_ssize_t len;
4916 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004917 if (!PyList_Check(tmp)) {
4918 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4919 goto failed;
4920 }
4921 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004922 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004923 if (orelse == NULL) goto failed;
4924 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004925 stmt_ty val;
4926 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004927 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004928 if (len != PyList_GET_SIZE(tmp)) {
4929 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
4930 goto failed;
4931 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004932 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004933 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004934 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004935 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004936 *out = For(target, iter, body, orelse, lineno, col_offset, end_lineno,
4937 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004938 if (*out == NULL) goto failed;
4939 return 0;
4940 }
Yury Selivanov75445082015-05-11 22:57:16 -04004941 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
4942 if (isinstance == -1) {
4943 return 1;
4944 }
4945 if (isinstance) {
4946 expr_ty target;
4947 expr_ty iter;
4948 asdl_seq* body;
4949 asdl_seq* orelse;
4950
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004951 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4952 return 1;
4953 }
4954 if (tmp == NULL) {
4955 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
4956 return 1;
4957 }
4958 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004959 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004960 res = obj2ast_expr(tmp, &target, arena);
4961 if (res != 0) goto failed;
4962 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004963 }
4964 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004965 return 1;
4966 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004967 if (tmp == NULL) {
4968 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
4969 return 1;
4970 }
4971 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004972 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004973 res = obj2ast_expr(tmp, &iter, arena);
4974 if (res != 0) goto failed;
4975 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004976 }
4977 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004978 return 1;
4979 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004980 if (tmp == NULL) {
4981 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
4982 return 1;
4983 }
4984 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004985 int res;
4986 Py_ssize_t len;
4987 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004988 if (!PyList_Check(tmp)) {
4989 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4990 goto failed;
4991 }
4992 len = PyList_GET_SIZE(tmp);
4993 body = _Py_asdl_seq_new(len, arena);
4994 if (body == NULL) goto failed;
4995 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004996 stmt_ty val;
4997 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004998 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004999 if (len != PyList_GET_SIZE(tmp)) {
5000 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
5001 goto failed;
5002 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005003 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005004 }
5005 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005006 }
5007 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005008 return 1;
5009 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005010 if (tmp == NULL) {
5011 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
5012 return 1;
5013 }
5014 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005015 int res;
5016 Py_ssize_t len;
5017 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005018 if (!PyList_Check(tmp)) {
5019 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5020 goto failed;
5021 }
5022 len = PyList_GET_SIZE(tmp);
5023 orelse = _Py_asdl_seq_new(len, arena);
5024 if (orelse == NULL) goto failed;
5025 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005026 stmt_ty val;
5027 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005028 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005029 if (len != PyList_GET_SIZE(tmp)) {
5030 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
5031 goto failed;
5032 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005033 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005034 }
5035 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005036 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005037 *out = AsyncFor(target, iter, body, orelse, lineno, col_offset,
5038 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005039 if (*out == NULL) goto failed;
5040 return 0;
5041 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005042 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
5043 if (isinstance == -1) {
5044 return 1;
5045 }
5046 if (isinstance) {
5047 expr_ty test;
5048 asdl_seq* body;
5049 asdl_seq* orelse;
5050
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005051 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5052 return 1;
5053 }
5054 if (tmp == NULL) {
5055 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
5056 return 1;
5057 }
5058 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005059 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005060 res = obj2ast_expr(tmp, &test, arena);
5061 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005062 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005063 }
5064 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005065 return 1;
5066 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005067 if (tmp == NULL) {
5068 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
5069 return 1;
5070 }
5071 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005072 int res;
5073 Py_ssize_t len;
5074 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005075 if (!PyList_Check(tmp)) {
5076 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5077 goto failed;
5078 }
5079 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005080 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005081 if (body == NULL) goto failed;
5082 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005083 stmt_ty val;
5084 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005085 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005086 if (len != PyList_GET_SIZE(tmp)) {
5087 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5088 goto failed;
5089 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005090 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005091 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005092 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005093 }
5094 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005095 return 1;
5096 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005097 if (tmp == NULL) {
5098 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5099 return 1;
5100 }
5101 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005102 int res;
5103 Py_ssize_t len;
5104 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005105 if (!PyList_Check(tmp)) {
5106 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5107 goto failed;
5108 }
5109 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005110 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005111 if (orelse == NULL) goto failed;
5112 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005113 stmt_ty val;
5114 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005115 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005116 if (len != PyList_GET_SIZE(tmp)) {
5117 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5118 goto failed;
5119 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005120 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005121 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005122 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005123 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005124 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
5125 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005126 if (*out == NULL) goto failed;
5127 return 0;
5128 }
5129 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5130 if (isinstance == -1) {
5131 return 1;
5132 }
5133 if (isinstance) {
5134 expr_ty test;
5135 asdl_seq* body;
5136 asdl_seq* orelse;
5137
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005138 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5139 return 1;
5140 }
5141 if (tmp == NULL) {
5142 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5143 return 1;
5144 }
5145 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005146 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005147 res = obj2ast_expr(tmp, &test, arena);
5148 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005149 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005150 }
5151 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005152 return 1;
5153 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005154 if (tmp == NULL) {
5155 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5156 return 1;
5157 }
5158 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005159 int res;
5160 Py_ssize_t len;
5161 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005162 if (!PyList_Check(tmp)) {
5163 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5164 goto failed;
5165 }
5166 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005167 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005168 if (body == NULL) goto failed;
5169 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005170 stmt_ty val;
5171 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005172 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005173 if (len != PyList_GET_SIZE(tmp)) {
5174 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5175 goto failed;
5176 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005177 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005178 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005179 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005180 }
5181 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005182 return 1;
5183 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005184 if (tmp == NULL) {
5185 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5186 return 1;
5187 }
5188 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005189 int res;
5190 Py_ssize_t len;
5191 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005192 if (!PyList_Check(tmp)) {
5193 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5194 goto failed;
5195 }
5196 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005197 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005198 if (orelse == NULL) goto failed;
5199 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005200 stmt_ty val;
5201 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005202 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005203 if (len != PyList_GET_SIZE(tmp)) {
5204 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5205 goto failed;
5206 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005207 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005208 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005209 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005210 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005211 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
5212 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005213 if (*out == NULL) goto failed;
5214 return 0;
5215 }
5216 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5217 if (isinstance == -1) {
5218 return 1;
5219 }
5220 if (isinstance) {
5221 asdl_seq* items;
5222 asdl_seq* body;
5223
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005224 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5225 return 1;
5226 }
5227 if (tmp == NULL) {
5228 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5229 return 1;
5230 }
5231 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005232 int res;
5233 Py_ssize_t len;
5234 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005235 if (!PyList_Check(tmp)) {
5236 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5237 goto failed;
5238 }
5239 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005240 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005241 if (items == NULL) goto failed;
5242 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005243 withitem_ty val;
5244 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005245 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005246 if (len != PyList_GET_SIZE(tmp)) {
5247 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5248 goto failed;
5249 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005250 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005251 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005252 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005253 }
5254 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005255 return 1;
5256 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005257 if (tmp == NULL) {
5258 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5259 return 1;
5260 }
5261 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005262 int res;
5263 Py_ssize_t len;
5264 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005265 if (!PyList_Check(tmp)) {
5266 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5267 goto failed;
5268 }
5269 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005270 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005271 if (body == NULL) goto failed;
5272 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005273 stmt_ty val;
5274 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005275 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005276 if (len != PyList_GET_SIZE(tmp)) {
5277 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5278 goto failed;
5279 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005280 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005281 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005282 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005283 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005284 *out = With(items, body, lineno, col_offset, end_lineno,
5285 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005286 if (*out == NULL) goto failed;
5287 return 0;
5288 }
Yury Selivanov75445082015-05-11 22:57:16 -04005289 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5290 if (isinstance == -1) {
5291 return 1;
5292 }
5293 if (isinstance) {
5294 asdl_seq* items;
5295 asdl_seq* body;
5296
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005297 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5298 return 1;
5299 }
5300 if (tmp == NULL) {
5301 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5302 return 1;
5303 }
5304 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005305 int res;
5306 Py_ssize_t len;
5307 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005308 if (!PyList_Check(tmp)) {
5309 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5310 goto failed;
5311 }
5312 len = PyList_GET_SIZE(tmp);
5313 items = _Py_asdl_seq_new(len, arena);
5314 if (items == NULL) goto failed;
5315 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005316 withitem_ty val;
5317 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005318 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005319 if (len != PyList_GET_SIZE(tmp)) {
5320 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5321 goto failed;
5322 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005323 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005324 }
5325 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005326 }
5327 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005328 return 1;
5329 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005330 if (tmp == NULL) {
5331 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5332 return 1;
5333 }
5334 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005335 int res;
5336 Py_ssize_t len;
5337 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005338 if (!PyList_Check(tmp)) {
5339 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5340 goto failed;
5341 }
5342 len = PyList_GET_SIZE(tmp);
5343 body = _Py_asdl_seq_new(len, arena);
5344 if (body == NULL) goto failed;
5345 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005346 stmt_ty val;
5347 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005348 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005349 if (len != PyList_GET_SIZE(tmp)) {
5350 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5351 goto failed;
5352 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005353 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005354 }
5355 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005356 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005357 *out = AsyncWith(items, body, lineno, col_offset, end_lineno,
5358 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005359 if (*out == NULL) goto failed;
5360 return 0;
5361 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005362 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5363 if (isinstance == -1) {
5364 return 1;
5365 }
5366 if (isinstance) {
5367 expr_ty exc;
5368 expr_ty cause;
5369
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005370 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5371 return 1;
5372 }
5373 if (tmp == NULL || tmp == Py_None) {
5374 Py_CLEAR(tmp);
5375 exc = NULL;
5376 }
5377 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005378 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005379 res = obj2ast_expr(tmp, &exc, arena);
5380 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005381 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005382 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005383 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5384 return 1;
5385 }
5386 if (tmp == NULL || tmp == Py_None) {
5387 Py_CLEAR(tmp);
5388 cause = NULL;
5389 }
5390 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005391 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005392 res = obj2ast_expr(tmp, &cause, arena);
5393 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005394 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005395 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005396 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
5397 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005398 if (*out == NULL) goto failed;
5399 return 0;
5400 }
5401 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5402 if (isinstance == -1) {
5403 return 1;
5404 }
5405 if (isinstance) {
5406 asdl_seq* body;
5407 asdl_seq* handlers;
5408 asdl_seq* orelse;
5409 asdl_seq* finalbody;
5410
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005411 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5412 return 1;
5413 }
5414 if (tmp == NULL) {
5415 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5416 return 1;
5417 }
5418 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005419 int res;
5420 Py_ssize_t len;
5421 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005422 if (!PyList_Check(tmp)) {
5423 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5424 goto failed;
5425 }
5426 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005427 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005428 if (body == NULL) goto failed;
5429 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005430 stmt_ty val;
5431 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005432 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005433 if (len != PyList_GET_SIZE(tmp)) {
5434 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5435 goto failed;
5436 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005437 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005438 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005439 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005440 }
5441 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005442 return 1;
5443 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005444 if (tmp == NULL) {
5445 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5446 return 1;
5447 }
5448 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005449 int res;
5450 Py_ssize_t len;
5451 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005452 if (!PyList_Check(tmp)) {
5453 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5454 goto failed;
5455 }
5456 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005457 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005458 if (handlers == NULL) goto failed;
5459 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005460 excepthandler_ty val;
5461 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005462 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005463 if (len != PyList_GET_SIZE(tmp)) {
5464 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5465 goto failed;
5466 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005467 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005468 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005469 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005470 }
5471 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005472 return 1;
5473 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005474 if (tmp == NULL) {
5475 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5476 return 1;
5477 }
5478 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005479 int res;
5480 Py_ssize_t len;
5481 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005482 if (!PyList_Check(tmp)) {
5483 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5484 goto failed;
5485 }
5486 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005487 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005488 if (orelse == NULL) goto failed;
5489 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005490 stmt_ty val;
5491 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005492 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005493 if (len != PyList_GET_SIZE(tmp)) {
5494 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5495 goto failed;
5496 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005497 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005498 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005499 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005500 }
5501 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005502 return 1;
5503 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005504 if (tmp == NULL) {
5505 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5506 return 1;
5507 }
5508 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005509 int res;
5510 Py_ssize_t len;
5511 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005512 if (!PyList_Check(tmp)) {
5513 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5514 goto failed;
5515 }
5516 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005517 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005518 if (finalbody == NULL) goto failed;
5519 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005520 stmt_ty val;
5521 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005522 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005523 if (len != PyList_GET_SIZE(tmp)) {
5524 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5525 goto failed;
5526 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005527 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005528 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005529 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005530 }
5531 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005532 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005533 if (*out == NULL) goto failed;
5534 return 0;
5535 }
5536 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5537 if (isinstance == -1) {
5538 return 1;
5539 }
5540 if (isinstance) {
5541 expr_ty test;
5542 expr_ty msg;
5543
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005544 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5545 return 1;
5546 }
5547 if (tmp == NULL) {
5548 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5549 return 1;
5550 }
5551 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005552 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005553 res = obj2ast_expr(tmp, &test, arena);
5554 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005555 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005556 }
5557 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005558 return 1;
5559 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005560 if (tmp == NULL || tmp == Py_None) {
5561 Py_CLEAR(tmp);
5562 msg = NULL;
5563 }
5564 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005565 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005566 res = obj2ast_expr(tmp, &msg, arena);
5567 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005568 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005569 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005570 *out = Assert(test, msg, lineno, col_offset, end_lineno,
5571 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005572 if (*out == NULL) goto failed;
5573 return 0;
5574 }
5575 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5576 if (isinstance == -1) {
5577 return 1;
5578 }
5579 if (isinstance) {
5580 asdl_seq* names;
5581
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005582 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5583 return 1;
5584 }
5585 if (tmp == NULL) {
5586 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5587 return 1;
5588 }
5589 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005590 int res;
5591 Py_ssize_t len;
5592 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005593 if (!PyList_Check(tmp)) {
5594 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5595 goto failed;
5596 }
5597 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005598 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005599 if (names == NULL) goto failed;
5600 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005601 alias_ty val;
5602 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005603 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005604 if (len != PyList_GET_SIZE(tmp)) {
5605 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5606 goto failed;
5607 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005608 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005609 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005610 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005611 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005612 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
5613 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005614 if (*out == NULL) goto failed;
5615 return 0;
5616 }
5617 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5618 if (isinstance == -1) {
5619 return 1;
5620 }
5621 if (isinstance) {
5622 identifier module;
5623 asdl_seq* names;
5624 int level;
5625
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005626 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5627 return 1;
5628 }
5629 if (tmp == NULL || tmp == Py_None) {
5630 Py_CLEAR(tmp);
5631 module = NULL;
5632 }
5633 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005634 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005635 res = obj2ast_identifier(tmp, &module, arena);
5636 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005637 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005638 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005639 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5640 return 1;
5641 }
5642 if (tmp == NULL) {
5643 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
5644 return 1;
5645 }
5646 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005647 int res;
5648 Py_ssize_t len;
5649 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005650 if (!PyList_Check(tmp)) {
5651 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5652 goto failed;
5653 }
5654 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005655 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005656 if (names == NULL) goto failed;
5657 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005658 alias_ty val;
5659 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005660 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005661 if (len != PyList_GET_SIZE(tmp)) {
5662 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
5663 goto failed;
5664 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005665 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005666 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005667 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005668 }
5669 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005670 return 1;
5671 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005672 if (tmp == NULL || tmp == Py_None) {
5673 Py_CLEAR(tmp);
5674 level = 0;
5675 }
5676 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005677 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005678 res = obj2ast_int(tmp, &level, arena);
5679 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005680 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005681 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005682 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
5683 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005684 if (*out == NULL) goto failed;
5685 return 0;
5686 }
5687 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
5688 if (isinstance == -1) {
5689 return 1;
5690 }
5691 if (isinstance) {
5692 asdl_seq* names;
5693
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005694 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5695 return 1;
5696 }
5697 if (tmp == NULL) {
5698 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
5699 return 1;
5700 }
5701 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005702 int res;
5703 Py_ssize_t len;
5704 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005705 if (!PyList_Check(tmp)) {
5706 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5707 goto failed;
5708 }
5709 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005710 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005711 if (names == NULL) goto failed;
5712 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005713 identifier val;
5714 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005715 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005716 if (len != PyList_GET_SIZE(tmp)) {
5717 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
5718 goto failed;
5719 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005720 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005721 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005722 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005723 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005724 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
5725 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005726 if (*out == NULL) goto failed;
5727 return 0;
5728 }
5729 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
5730 if (isinstance == -1) {
5731 return 1;
5732 }
5733 if (isinstance) {
5734 asdl_seq* names;
5735
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005736 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5737 return 1;
5738 }
5739 if (tmp == NULL) {
5740 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
5741 return 1;
5742 }
5743 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005744 int res;
5745 Py_ssize_t len;
5746 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005747 if (!PyList_Check(tmp)) {
5748 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5749 goto failed;
5750 }
5751 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005752 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005753 if (names == NULL) goto failed;
5754 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005755 identifier val;
5756 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005757 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005758 if (len != PyList_GET_SIZE(tmp)) {
5759 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
5760 goto failed;
5761 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005762 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005763 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005764 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005765 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005766 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
5767 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005768 if (*out == NULL) goto failed;
5769 return 0;
5770 }
5771 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
5772 if (isinstance == -1) {
5773 return 1;
5774 }
5775 if (isinstance) {
5776 expr_ty value;
5777
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005778 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
5779 return 1;
5780 }
5781 if (tmp == NULL) {
5782 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
5783 return 1;
5784 }
5785 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005786 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005787 res = obj2ast_expr(tmp, &value, arena);
5788 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005789 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005790 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005791 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
5792 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005793 if (*out == NULL) goto failed;
5794 return 0;
5795 }
5796 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
5797 if (isinstance == -1) {
5798 return 1;
5799 }
5800 if (isinstance) {
5801
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005802 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005803 if (*out == NULL) goto failed;
5804 return 0;
5805 }
5806 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
5807 if (isinstance == -1) {
5808 return 1;
5809 }
5810 if (isinstance) {
5811
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005812 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005813 if (*out == NULL) goto failed;
5814 return 0;
5815 }
5816 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
5817 if (isinstance == -1) {
5818 return 1;
5819 }
5820 if (isinstance) {
5821
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005822 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005823 if (*out == NULL) goto failed;
5824 return 0;
5825 }
5826
5827 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
5828 failed:
5829 Py_XDECREF(tmp);
5830 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005831}
5832
5833int
5834obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
5835{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005836 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005837
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005838 PyObject *tmp = NULL;
5839 int lineno;
5840 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005841 int end_lineno;
5842 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005843
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005844 if (obj == Py_None) {
5845 *out = NULL;
5846 return 0;
5847 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005848 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
5849 return 1;
5850 }
5851 if (tmp == NULL) {
5852 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
5853 return 1;
5854 }
5855 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005856 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005857 res = obj2ast_int(tmp, &lineno, arena);
5858 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005859 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005860 }
5861 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005862 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005863 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005864 if (tmp == NULL) {
5865 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
5866 return 1;
5867 }
5868 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005869 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005870 res = obj2ast_int(tmp, &col_offset, arena);
5871 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005872 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005873 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005874 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
5875 return 1;
5876 }
5877 if (tmp == NULL || tmp == Py_None) {
5878 Py_CLEAR(tmp);
5879 end_lineno = 0;
5880 }
5881 else {
5882 int res;
5883 res = obj2ast_int(tmp, &end_lineno, arena);
5884 if (res != 0) goto failed;
5885 Py_CLEAR(tmp);
5886 }
5887 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
5888 return 1;
5889 }
5890 if (tmp == NULL || tmp == Py_None) {
5891 Py_CLEAR(tmp);
5892 end_col_offset = 0;
5893 }
5894 else {
5895 int res;
5896 res = obj2ast_int(tmp, &end_col_offset, arena);
5897 if (res != 0) goto failed;
5898 Py_CLEAR(tmp);
5899 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005900 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
5901 if (isinstance == -1) {
5902 return 1;
5903 }
5904 if (isinstance) {
5905 boolop_ty op;
5906 asdl_seq* values;
5907
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005908 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5909 return 1;
5910 }
5911 if (tmp == NULL) {
5912 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
5913 return 1;
5914 }
5915 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005916 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005917 res = obj2ast_boolop(tmp, &op, arena);
5918 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005919 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005920 }
5921 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005922 return 1;
5923 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005924 if (tmp == NULL) {
5925 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
5926 return 1;
5927 }
5928 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005929 int res;
5930 Py_ssize_t len;
5931 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005932 if (!PyList_Check(tmp)) {
5933 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5934 goto failed;
5935 }
5936 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005937 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005938 if (values == NULL) goto failed;
5939 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005940 expr_ty val;
5941 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005942 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005943 if (len != PyList_GET_SIZE(tmp)) {
5944 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
5945 goto failed;
5946 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005947 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005948 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005949 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005950 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005951 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
5952 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005953 if (*out == NULL) goto failed;
5954 return 0;
5955 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07005956 isinstance = PyObject_IsInstance(obj, (PyObject*)NamedExpr_type);
5957 if (isinstance == -1) {
5958 return 1;
5959 }
5960 if (isinstance) {
5961 expr_ty target;
5962 expr_ty value;
5963
5964 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5965 return 1;
5966 }
5967 if (tmp == NULL) {
5968 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
5969 return 1;
5970 }
5971 else {
5972 int res;
5973 res = obj2ast_expr(tmp, &target, arena);
5974 if (res != 0) goto failed;
5975 Py_CLEAR(tmp);
5976 }
5977 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
5978 return 1;
5979 }
5980 if (tmp == NULL) {
5981 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
5982 return 1;
5983 }
5984 else {
5985 int res;
5986 res = obj2ast_expr(tmp, &value, arena);
5987 if (res != 0) goto failed;
5988 Py_CLEAR(tmp);
5989 }
5990 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
5991 end_col_offset, arena);
5992 if (*out == NULL) goto failed;
5993 return 0;
5994 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005995 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
5996 if (isinstance == -1) {
5997 return 1;
5998 }
5999 if (isinstance) {
6000 expr_ty left;
6001 operator_ty op;
6002 expr_ty right;
6003
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006004 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6005 return 1;
6006 }
6007 if (tmp == NULL) {
6008 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
6009 return 1;
6010 }
6011 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006012 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006013 res = obj2ast_expr(tmp, &left, arena);
6014 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006015 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006016 }
6017 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006018 return 1;
6019 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006020 if (tmp == NULL) {
6021 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
6022 return 1;
6023 }
6024 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006025 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006026 res = obj2ast_operator(tmp, &op, arena);
6027 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006028 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006029 }
6030 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006031 return 1;
6032 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006033 if (tmp == NULL) {
6034 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
6035 return 1;
6036 }
6037 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006038 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006039 res = obj2ast_expr(tmp, &right, arena);
6040 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006041 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006042 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006043 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
6044 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006045 if (*out == NULL) goto failed;
6046 return 0;
6047 }
6048 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
6049 if (isinstance == -1) {
6050 return 1;
6051 }
6052 if (isinstance) {
6053 unaryop_ty op;
6054 expr_ty operand;
6055
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006056 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6057 return 1;
6058 }
6059 if (tmp == NULL) {
6060 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
6061 return 1;
6062 }
6063 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006064 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006065 res = obj2ast_unaryop(tmp, &op, arena);
6066 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006067 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006068 }
6069 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006070 return 1;
6071 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006072 if (tmp == NULL) {
6073 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
6074 return 1;
6075 }
6076 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006077 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006078 res = obj2ast_expr(tmp, &operand, arena);
6079 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006080 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006081 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006082 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
6083 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006084 if (*out == NULL) goto failed;
6085 return 0;
6086 }
6087 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
6088 if (isinstance == -1) {
6089 return 1;
6090 }
6091 if (isinstance) {
6092 arguments_ty args;
6093 expr_ty body;
6094
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006095 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
6096 return 1;
6097 }
6098 if (tmp == NULL) {
6099 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
6100 return 1;
6101 }
6102 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006103 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006104 res = obj2ast_arguments(tmp, &args, arena);
6105 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006106 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006107 }
6108 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006109 return 1;
6110 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006111 if (tmp == NULL) {
6112 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
6113 return 1;
6114 }
6115 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006116 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006117 res = obj2ast_expr(tmp, &body, arena);
6118 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006119 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006120 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006121 *out = Lambda(args, body, lineno, col_offset, end_lineno,
6122 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006123 if (*out == NULL) goto failed;
6124 return 0;
6125 }
6126 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
6127 if (isinstance == -1) {
6128 return 1;
6129 }
6130 if (isinstance) {
6131 expr_ty test;
6132 expr_ty body;
6133 expr_ty orelse;
6134
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006135 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
6136 return 1;
6137 }
6138 if (tmp == NULL) {
6139 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
6140 return 1;
6141 }
6142 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006143 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006144 res = obj2ast_expr(tmp, &test, arena);
6145 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006146 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006147 }
6148 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006149 return 1;
6150 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006151 if (tmp == NULL) {
6152 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
6153 return 1;
6154 }
6155 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006156 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006157 res = obj2ast_expr(tmp, &body, arena);
6158 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006159 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006160 }
6161 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006162 return 1;
6163 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006164 if (tmp == NULL) {
6165 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6166 return 1;
6167 }
6168 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006169 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006170 res = obj2ast_expr(tmp, &orelse, arena);
6171 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006172 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006173 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006174 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
6175 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006176 if (*out == NULL) goto failed;
6177 return 0;
6178 }
6179 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6180 if (isinstance == -1) {
6181 return 1;
6182 }
6183 if (isinstance) {
6184 asdl_seq* keys;
6185 asdl_seq* values;
6186
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006187 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6188 return 1;
6189 }
6190 if (tmp == NULL) {
6191 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6192 return 1;
6193 }
6194 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006195 int res;
6196 Py_ssize_t len;
6197 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006198 if (!PyList_Check(tmp)) {
6199 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6200 goto failed;
6201 }
6202 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006203 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006204 if (keys == NULL) goto failed;
6205 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006206 expr_ty val;
6207 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006208 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006209 if (len != PyList_GET_SIZE(tmp)) {
6210 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6211 goto failed;
6212 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006213 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006214 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006215 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006216 }
6217 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006218 return 1;
6219 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006220 if (tmp == NULL) {
6221 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6222 return 1;
6223 }
6224 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006225 int res;
6226 Py_ssize_t len;
6227 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006228 if (!PyList_Check(tmp)) {
6229 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6230 goto failed;
6231 }
6232 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006233 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006234 if (values == NULL) goto failed;
6235 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006236 expr_ty val;
6237 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006238 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006239 if (len != PyList_GET_SIZE(tmp)) {
6240 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6241 goto failed;
6242 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006243 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006244 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006245 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006246 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006247 *out = Dict(keys, values, lineno, col_offset, end_lineno,
6248 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006249 if (*out == NULL) goto failed;
6250 return 0;
6251 }
6252 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6253 if (isinstance == -1) {
6254 return 1;
6255 }
6256 if (isinstance) {
6257 asdl_seq* elts;
6258
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006259 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6260 return 1;
6261 }
6262 if (tmp == NULL) {
6263 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6264 return 1;
6265 }
6266 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006267 int res;
6268 Py_ssize_t len;
6269 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006270 if (!PyList_Check(tmp)) {
6271 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6272 goto failed;
6273 }
6274 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006275 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006276 if (elts == NULL) goto failed;
6277 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006278 expr_ty val;
6279 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006280 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006281 if (len != PyList_GET_SIZE(tmp)) {
6282 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6283 goto failed;
6284 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006285 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006286 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006287 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006288 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006289 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006290 if (*out == NULL) goto failed;
6291 return 0;
6292 }
6293 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6294 if (isinstance == -1) {
6295 return 1;
6296 }
6297 if (isinstance) {
6298 expr_ty elt;
6299 asdl_seq* generators;
6300
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006301 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6302 return 1;
6303 }
6304 if (tmp == NULL) {
6305 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6306 return 1;
6307 }
6308 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006309 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006310 res = obj2ast_expr(tmp, &elt, arena);
6311 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006312 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006313 }
6314 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006315 return 1;
6316 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006317 if (tmp == NULL) {
6318 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6319 return 1;
6320 }
6321 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006322 int res;
6323 Py_ssize_t len;
6324 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006325 if (!PyList_Check(tmp)) {
6326 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6327 goto failed;
6328 }
6329 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006330 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006331 if (generators == NULL) goto failed;
6332 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006333 comprehension_ty val;
6334 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006335 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006336 if (len != PyList_GET_SIZE(tmp)) {
6337 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6338 goto failed;
6339 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006340 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006341 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006342 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006343 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006344 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
6345 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006346 if (*out == NULL) goto failed;
6347 return 0;
6348 }
6349 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6350 if (isinstance == -1) {
6351 return 1;
6352 }
6353 if (isinstance) {
6354 expr_ty elt;
6355 asdl_seq* generators;
6356
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006357 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6358 return 1;
6359 }
6360 if (tmp == NULL) {
6361 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6362 return 1;
6363 }
6364 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006365 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006366 res = obj2ast_expr(tmp, &elt, arena);
6367 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006368 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006369 }
6370 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006371 return 1;
6372 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006373 if (tmp == NULL) {
6374 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6375 return 1;
6376 }
6377 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006378 int res;
6379 Py_ssize_t len;
6380 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006381 if (!PyList_Check(tmp)) {
6382 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6383 goto failed;
6384 }
6385 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006386 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006387 if (generators == NULL) goto failed;
6388 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006389 comprehension_ty val;
6390 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006391 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006392 if (len != PyList_GET_SIZE(tmp)) {
6393 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6394 goto failed;
6395 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006396 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006397 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006398 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006399 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006400 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
6401 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006402 if (*out == NULL) goto failed;
6403 return 0;
6404 }
6405 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6406 if (isinstance == -1) {
6407 return 1;
6408 }
6409 if (isinstance) {
6410 expr_ty key;
6411 expr_ty value;
6412 asdl_seq* generators;
6413
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006414 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6415 return 1;
6416 }
6417 if (tmp == NULL) {
6418 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6419 return 1;
6420 }
6421 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006422 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006423 res = obj2ast_expr(tmp, &key, arena);
6424 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006425 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006426 }
6427 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006428 return 1;
6429 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006430 if (tmp == NULL) {
6431 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6432 return 1;
6433 }
6434 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006435 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006436 res = obj2ast_expr(tmp, &value, arena);
6437 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006438 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006439 }
6440 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006441 return 1;
6442 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006443 if (tmp == NULL) {
6444 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6445 return 1;
6446 }
6447 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006448 int res;
6449 Py_ssize_t len;
6450 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006451 if (!PyList_Check(tmp)) {
6452 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6453 goto failed;
6454 }
6455 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006456 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006457 if (generators == NULL) goto failed;
6458 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006459 comprehension_ty val;
6460 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006461 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006462 if (len != PyList_GET_SIZE(tmp)) {
6463 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6464 goto failed;
6465 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006466 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006467 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006468 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006469 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006470 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
6471 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006472 if (*out == NULL) goto failed;
6473 return 0;
6474 }
6475 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6476 if (isinstance == -1) {
6477 return 1;
6478 }
6479 if (isinstance) {
6480 expr_ty elt;
6481 asdl_seq* generators;
6482
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006483 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6484 return 1;
6485 }
6486 if (tmp == NULL) {
6487 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6488 return 1;
6489 }
6490 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006491 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006492 res = obj2ast_expr(tmp, &elt, arena);
6493 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006494 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006495 }
6496 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006497 return 1;
6498 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006499 if (tmp == NULL) {
6500 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6501 return 1;
6502 }
6503 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006504 int res;
6505 Py_ssize_t len;
6506 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006507 if (!PyList_Check(tmp)) {
6508 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6509 goto failed;
6510 }
6511 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006512 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006513 if (generators == NULL) goto failed;
6514 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006515 comprehension_ty val;
6516 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006517 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006518 if (len != PyList_GET_SIZE(tmp)) {
6519 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6520 goto failed;
6521 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006522 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006523 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006524 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006525 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006526 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
6527 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006528 if (*out == NULL) goto failed;
6529 return 0;
6530 }
Yury Selivanov75445082015-05-11 22:57:16 -04006531 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6532 if (isinstance == -1) {
6533 return 1;
6534 }
6535 if (isinstance) {
6536 expr_ty value;
6537
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006538 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6539 return 1;
6540 }
6541 if (tmp == NULL) {
6542 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6543 return 1;
6544 }
6545 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006546 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006547 res = obj2ast_expr(tmp, &value, arena);
6548 if (res != 0) goto failed;
6549 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006550 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006551 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
6552 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006553 if (*out == NULL) goto failed;
6554 return 0;
6555 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006556 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6557 if (isinstance == -1) {
6558 return 1;
6559 }
6560 if (isinstance) {
6561 expr_ty value;
6562
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006563 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6564 return 1;
6565 }
6566 if (tmp == NULL || tmp == Py_None) {
6567 Py_CLEAR(tmp);
6568 value = NULL;
6569 }
6570 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006571 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006572 res = obj2ast_expr(tmp, &value, arena);
6573 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006574 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006575 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006576 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
6577 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006578 if (*out == NULL) goto failed;
6579 return 0;
6580 }
6581 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6582 if (isinstance == -1) {
6583 return 1;
6584 }
6585 if (isinstance) {
6586 expr_ty value;
6587
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006588 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6589 return 1;
6590 }
6591 if (tmp == NULL) {
6592 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6593 return 1;
6594 }
6595 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006596 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006597 res = obj2ast_expr(tmp, &value, arena);
6598 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006599 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006600 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006601 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
6602 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006603 if (*out == NULL) goto failed;
6604 return 0;
6605 }
6606 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6607 if (isinstance == -1) {
6608 return 1;
6609 }
6610 if (isinstance) {
6611 expr_ty left;
6612 asdl_int_seq* ops;
6613 asdl_seq* comparators;
6614
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006615 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6616 return 1;
6617 }
6618 if (tmp == NULL) {
6619 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6620 return 1;
6621 }
6622 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006623 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006624 res = obj2ast_expr(tmp, &left, arena);
6625 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006626 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006627 }
6628 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006629 return 1;
6630 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006631 if (tmp == NULL) {
6632 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6633 return 1;
6634 }
6635 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006636 int res;
6637 Py_ssize_t len;
6638 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006639 if (!PyList_Check(tmp)) {
6640 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6641 goto failed;
6642 }
6643 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006644 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006645 if (ops == NULL) goto failed;
6646 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006647 cmpop_ty val;
6648 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006649 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006650 if (len != PyList_GET_SIZE(tmp)) {
6651 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
6652 goto failed;
6653 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006654 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006655 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006656 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006657 }
6658 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006659 return 1;
6660 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006661 if (tmp == NULL) {
6662 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
6663 return 1;
6664 }
6665 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006666 int res;
6667 Py_ssize_t len;
6668 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006669 if (!PyList_Check(tmp)) {
6670 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6671 goto failed;
6672 }
6673 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006674 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006675 if (comparators == NULL) goto failed;
6676 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006677 expr_ty val;
6678 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006679 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006680 if (len != PyList_GET_SIZE(tmp)) {
6681 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
6682 goto failed;
6683 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006684 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006685 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006686 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006687 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006688 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
6689 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006690 if (*out == NULL) goto failed;
6691 return 0;
6692 }
6693 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
6694 if (isinstance == -1) {
6695 return 1;
6696 }
6697 if (isinstance) {
6698 expr_ty func;
6699 asdl_seq* args;
6700 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006701
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006702 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
6703 return 1;
6704 }
6705 if (tmp == NULL) {
6706 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
6707 return 1;
6708 }
6709 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006710 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006711 res = obj2ast_expr(tmp, &func, arena);
6712 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006713 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006714 }
6715 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006716 return 1;
6717 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006718 if (tmp == NULL) {
6719 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
6720 return 1;
6721 }
6722 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006723 int res;
6724 Py_ssize_t len;
6725 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006726 if (!PyList_Check(tmp)) {
6727 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6728 goto failed;
6729 }
6730 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006731 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006732 if (args == NULL) goto failed;
6733 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006734 expr_ty val;
6735 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006736 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006737 if (len != PyList_GET_SIZE(tmp)) {
6738 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
6739 goto failed;
6740 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006741 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006742 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006743 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006744 }
6745 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006746 return 1;
6747 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006748 if (tmp == NULL) {
6749 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
6750 return 1;
6751 }
6752 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006753 int res;
6754 Py_ssize_t len;
6755 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006756 if (!PyList_Check(tmp)) {
6757 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6758 goto failed;
6759 }
6760 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006761 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006762 if (keywords == NULL) goto failed;
6763 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006764 keyword_ty val;
6765 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006766 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006767 if (len != PyList_GET_SIZE(tmp)) {
6768 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
6769 goto failed;
6770 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006771 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006772 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006773 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006774 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006775 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
6776 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006777 if (*out == NULL) goto failed;
6778 return 0;
6779 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006780 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
6781 if (isinstance == -1) {
6782 return 1;
6783 }
6784 if (isinstance) {
6785 expr_ty value;
6786 int conversion;
6787 expr_ty format_spec;
6788
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006789 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6790 return 1;
6791 }
6792 if (tmp == NULL) {
6793 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
6794 return 1;
6795 }
6796 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006797 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006798 res = obj2ast_expr(tmp, &value, arena);
6799 if (res != 0) goto failed;
6800 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006801 }
6802 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006803 return 1;
6804 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006805 if (tmp == NULL || tmp == Py_None) {
6806 Py_CLEAR(tmp);
6807 conversion = 0;
6808 }
6809 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006810 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006811 res = obj2ast_int(tmp, &conversion, arena);
6812 if (res != 0) goto failed;
6813 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006814 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006815 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
6816 return 1;
6817 }
6818 if (tmp == NULL || tmp == Py_None) {
6819 Py_CLEAR(tmp);
6820 format_spec = NULL;
6821 }
6822 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006823 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006824 res = obj2ast_expr(tmp, &format_spec, arena);
6825 if (res != 0) goto failed;
6826 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006827 }
6828 *out = FormattedValue(value, conversion, format_spec, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006829 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006830 if (*out == NULL) goto failed;
6831 return 0;
6832 }
6833 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
6834 if (isinstance == -1) {
6835 return 1;
6836 }
6837 if (isinstance) {
6838 asdl_seq* values;
6839
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006840 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
6841 return 1;
6842 }
6843 if (tmp == NULL) {
6844 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
6845 return 1;
6846 }
6847 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006848 int res;
6849 Py_ssize_t len;
6850 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006851 if (!PyList_Check(tmp)) {
6852 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6853 goto failed;
6854 }
6855 len = PyList_GET_SIZE(tmp);
6856 values = _Py_asdl_seq_new(len, arena);
6857 if (values == NULL) goto failed;
6858 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006859 expr_ty val;
6860 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006861 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03006862 if (len != PyList_GET_SIZE(tmp)) {
6863 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
6864 goto failed;
6865 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006866 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006867 }
6868 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006869 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006870 *out = JoinedStr(values, lineno, col_offset, end_lineno,
6871 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006872 if (*out == NULL) goto failed;
6873 return 0;
6874 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006875 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
6876 if (isinstance == -1) {
6877 return 1;
6878 }
6879 if (isinstance) {
6880 constant value;
6881
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006882 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6883 return 1;
6884 }
6885 if (tmp == NULL) {
6886 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
6887 return 1;
6888 }
6889 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006890 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006891 res = obj2ast_constant(tmp, &value, arena);
6892 if (res != 0) goto failed;
6893 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006894 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006895 *out = Constant(value, lineno, col_offset, end_lineno, end_col_offset,
6896 arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006897 if (*out == NULL) goto failed;
6898 return 0;
6899 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006900 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
6901 if (isinstance == -1) {
6902 return 1;
6903 }
6904 if (isinstance) {
6905 expr_ty value;
6906 identifier attr;
6907 expr_context_ty ctx;
6908
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006909 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6910 return 1;
6911 }
6912 if (tmp == NULL) {
6913 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
6914 return 1;
6915 }
6916 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006917 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006918 res = obj2ast_expr(tmp, &value, arena);
6919 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006920 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006921 }
6922 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006923 return 1;
6924 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006925 if (tmp == NULL) {
6926 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
6927 return 1;
6928 }
6929 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006930 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006931 res = obj2ast_identifier(tmp, &attr, arena);
6932 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006933 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006934 }
6935 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006936 return 1;
6937 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006938 if (tmp == NULL) {
6939 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
6940 return 1;
6941 }
6942 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006943 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006944 res = obj2ast_expr_context(tmp, &ctx, arena);
6945 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006946 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006947 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006948 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
6949 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006950 if (*out == NULL) goto failed;
6951 return 0;
6952 }
6953 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
6954 if (isinstance == -1) {
6955 return 1;
6956 }
6957 if (isinstance) {
6958 expr_ty value;
6959 slice_ty slice;
6960 expr_context_ty ctx;
6961
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006962 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6963 return 1;
6964 }
6965 if (tmp == NULL) {
6966 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
6967 return 1;
6968 }
6969 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006970 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006971 res = obj2ast_expr(tmp, &value, arena);
6972 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006973 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006974 }
6975 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006976 return 1;
6977 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006978 if (tmp == NULL) {
6979 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
6980 return 1;
6981 }
6982 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006983 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006984 res = obj2ast_slice(tmp, &slice, arena);
6985 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006986 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006987 }
6988 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006989 return 1;
6990 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006991 if (tmp == NULL) {
6992 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
6993 return 1;
6994 }
6995 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006996 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006997 res = obj2ast_expr_context(tmp, &ctx, arena);
6998 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006999 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007000 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007001 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
7002 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007003 if (*out == NULL) goto failed;
7004 return 0;
7005 }
7006 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
7007 if (isinstance == -1) {
7008 return 1;
7009 }
7010 if (isinstance) {
7011 expr_ty value;
7012 expr_context_ty ctx;
7013
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007014 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7015 return 1;
7016 }
7017 if (tmp == NULL) {
7018 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
7019 return 1;
7020 }
7021 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007022 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007023 res = obj2ast_expr(tmp, &value, arena);
7024 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007025 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007026 }
7027 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007028 return 1;
7029 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007030 if (tmp == NULL) {
7031 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
7032 return 1;
7033 }
7034 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007035 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007036 res = obj2ast_expr_context(tmp, &ctx, arena);
7037 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007038 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007039 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007040 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
7041 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007042 if (*out == NULL) goto failed;
7043 return 0;
7044 }
7045 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
7046 if (isinstance == -1) {
7047 return 1;
7048 }
7049 if (isinstance) {
7050 identifier id;
7051 expr_context_ty ctx;
7052
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007053 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
7054 return 1;
7055 }
7056 if (tmp == NULL) {
7057 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
7058 return 1;
7059 }
7060 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007061 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007062 res = obj2ast_identifier(tmp, &id, arena);
7063 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007064 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007065 }
7066 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007067 return 1;
7068 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007069 if (tmp == NULL) {
7070 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
7071 return 1;
7072 }
7073 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007074 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007075 res = obj2ast_expr_context(tmp, &ctx, arena);
7076 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007077 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007078 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007079 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
7080 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007081 if (*out == NULL) goto failed;
7082 return 0;
7083 }
7084 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7085 if (isinstance == -1) {
7086 return 1;
7087 }
7088 if (isinstance) {
7089 asdl_seq* elts;
7090 expr_context_ty ctx;
7091
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007092 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7093 return 1;
7094 }
7095 if (tmp == NULL) {
7096 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7097 return 1;
7098 }
7099 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007100 int res;
7101 Py_ssize_t len;
7102 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007103 if (!PyList_Check(tmp)) {
7104 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7105 goto failed;
7106 }
7107 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007108 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007109 if (elts == NULL) goto failed;
7110 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007111 expr_ty val;
7112 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007113 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007114 if (len != PyList_GET_SIZE(tmp)) {
7115 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7116 goto failed;
7117 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007118 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007119 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007120 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007121 }
7122 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007123 return 1;
7124 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007125 if (tmp == NULL) {
7126 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7127 return 1;
7128 }
7129 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007130 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007131 res = obj2ast_expr_context(tmp, &ctx, arena);
7132 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007133 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007134 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007135 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7136 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007137 if (*out == NULL) goto failed;
7138 return 0;
7139 }
7140 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7141 if (isinstance == -1) {
7142 return 1;
7143 }
7144 if (isinstance) {
7145 asdl_seq* elts;
7146 expr_context_ty ctx;
7147
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007148 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7149 return 1;
7150 }
7151 if (tmp == NULL) {
7152 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7153 return 1;
7154 }
7155 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007156 int res;
7157 Py_ssize_t len;
7158 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007159 if (!PyList_Check(tmp)) {
7160 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7161 goto failed;
7162 }
7163 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007164 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007165 if (elts == NULL) goto failed;
7166 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007167 expr_ty val;
7168 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007169 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007170 if (len != PyList_GET_SIZE(tmp)) {
7171 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7172 goto failed;
7173 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007174 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007175 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007176 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007177 }
7178 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007179 return 1;
7180 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007181 if (tmp == NULL) {
7182 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7183 return 1;
7184 }
7185 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007186 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007187 res = obj2ast_expr_context(tmp, &ctx, arena);
7188 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007189 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007190 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007191 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7192 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007193 if (*out == NULL) goto failed;
7194 return 0;
7195 }
7196
7197 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7198 failed:
7199 Py_XDECREF(tmp);
7200 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007201}
7202
7203int
7204obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7205{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007206 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007207
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007208 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7209 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007210 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007211 }
7212 if (isinstance) {
7213 *out = Load;
7214 return 0;
7215 }
7216 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7217 if (isinstance == -1) {
7218 return 1;
7219 }
7220 if (isinstance) {
7221 *out = Store;
7222 return 0;
7223 }
7224 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7225 if (isinstance == -1) {
7226 return 1;
7227 }
7228 if (isinstance) {
7229 *out = Del;
7230 return 0;
7231 }
7232 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7233 if (isinstance == -1) {
7234 return 1;
7235 }
7236 if (isinstance) {
7237 *out = AugLoad;
7238 return 0;
7239 }
7240 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7241 if (isinstance == -1) {
7242 return 1;
7243 }
7244 if (isinstance) {
7245 *out = AugStore;
7246 return 0;
7247 }
7248 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7249 if (isinstance == -1) {
7250 return 1;
7251 }
7252 if (isinstance) {
7253 *out = Param;
7254 return 0;
7255 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007256 isinstance = PyObject_IsInstance(obj, (PyObject *)NamedStore_type);
7257 if (isinstance == -1) {
7258 return 1;
7259 }
7260 if (isinstance) {
7261 *out = NamedStore;
7262 return 0;
7263 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007264
7265 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7266 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007267}
7268
7269int
7270obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7271{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007272 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007273
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007274 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007275
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007276 if (obj == Py_None) {
7277 *out = NULL;
7278 return 0;
7279 }
7280 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7281 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007282 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007283 }
7284 if (isinstance) {
7285 expr_ty lower;
7286 expr_ty upper;
7287 expr_ty step;
7288
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007289 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7290 return 1;
7291 }
7292 if (tmp == NULL || tmp == Py_None) {
7293 Py_CLEAR(tmp);
7294 lower = NULL;
7295 }
7296 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007297 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007298 res = obj2ast_expr(tmp, &lower, arena);
7299 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007300 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007301 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007302 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7303 return 1;
7304 }
7305 if (tmp == NULL || tmp == Py_None) {
7306 Py_CLEAR(tmp);
7307 upper = NULL;
7308 }
7309 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007310 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007311 res = obj2ast_expr(tmp, &upper, arena);
7312 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007313 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007314 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007315 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
7316 return 1;
7317 }
7318 if (tmp == NULL || tmp == Py_None) {
7319 Py_CLEAR(tmp);
7320 step = NULL;
7321 }
7322 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007323 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007324 res = obj2ast_expr(tmp, &step, arena);
7325 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007326 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007327 }
7328 *out = Slice(lower, upper, step, arena);
7329 if (*out == NULL) goto failed;
7330 return 0;
7331 }
7332 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7333 if (isinstance == -1) {
7334 return 1;
7335 }
7336 if (isinstance) {
7337 asdl_seq* dims;
7338
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007339 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7340 return 1;
7341 }
7342 if (tmp == NULL) {
7343 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7344 return 1;
7345 }
7346 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007347 int res;
7348 Py_ssize_t len;
7349 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007350 if (!PyList_Check(tmp)) {
7351 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7352 goto failed;
7353 }
7354 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007355 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007356 if (dims == NULL) goto failed;
7357 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007358 slice_ty val;
7359 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007360 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007361 if (len != PyList_GET_SIZE(tmp)) {
7362 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7363 goto failed;
7364 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007365 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007366 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007367 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007368 }
7369 *out = ExtSlice(dims, arena);
7370 if (*out == NULL) goto failed;
7371 return 0;
7372 }
7373 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7374 if (isinstance == -1) {
7375 return 1;
7376 }
7377 if (isinstance) {
7378 expr_ty value;
7379
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007380 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7381 return 1;
7382 }
7383 if (tmp == NULL) {
7384 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7385 return 1;
7386 }
7387 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007388 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007389 res = obj2ast_expr(tmp, &value, arena);
7390 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007391 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007392 }
7393 *out = Index(value, arena);
7394 if (*out == NULL) goto failed;
7395 return 0;
7396 }
7397
7398 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7399 failed:
7400 Py_XDECREF(tmp);
7401 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007402}
7403
7404int
7405obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7406{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007407 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007408
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007409 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7410 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007411 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007412 }
7413 if (isinstance) {
7414 *out = And;
7415 return 0;
7416 }
7417 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7418 if (isinstance == -1) {
7419 return 1;
7420 }
7421 if (isinstance) {
7422 *out = Or;
7423 return 0;
7424 }
7425
7426 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7427 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007428}
7429
7430int
7431obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7432{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007433 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007434
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007435 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7436 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007437 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007438 }
7439 if (isinstance) {
7440 *out = Add;
7441 return 0;
7442 }
7443 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7444 if (isinstance == -1) {
7445 return 1;
7446 }
7447 if (isinstance) {
7448 *out = Sub;
7449 return 0;
7450 }
7451 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7452 if (isinstance == -1) {
7453 return 1;
7454 }
7455 if (isinstance) {
7456 *out = Mult;
7457 return 0;
7458 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007459 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7460 if (isinstance == -1) {
7461 return 1;
7462 }
7463 if (isinstance) {
7464 *out = MatMult;
7465 return 0;
7466 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007467 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7468 if (isinstance == -1) {
7469 return 1;
7470 }
7471 if (isinstance) {
7472 *out = Div;
7473 return 0;
7474 }
7475 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7476 if (isinstance == -1) {
7477 return 1;
7478 }
7479 if (isinstance) {
7480 *out = Mod;
7481 return 0;
7482 }
7483 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7484 if (isinstance == -1) {
7485 return 1;
7486 }
7487 if (isinstance) {
7488 *out = Pow;
7489 return 0;
7490 }
7491 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7492 if (isinstance == -1) {
7493 return 1;
7494 }
7495 if (isinstance) {
7496 *out = LShift;
7497 return 0;
7498 }
7499 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7500 if (isinstance == -1) {
7501 return 1;
7502 }
7503 if (isinstance) {
7504 *out = RShift;
7505 return 0;
7506 }
7507 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7508 if (isinstance == -1) {
7509 return 1;
7510 }
7511 if (isinstance) {
7512 *out = BitOr;
7513 return 0;
7514 }
7515 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7516 if (isinstance == -1) {
7517 return 1;
7518 }
7519 if (isinstance) {
7520 *out = BitXor;
7521 return 0;
7522 }
7523 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7524 if (isinstance == -1) {
7525 return 1;
7526 }
7527 if (isinstance) {
7528 *out = BitAnd;
7529 return 0;
7530 }
7531 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7532 if (isinstance == -1) {
7533 return 1;
7534 }
7535 if (isinstance) {
7536 *out = FloorDiv;
7537 return 0;
7538 }
7539
7540 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7541 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007542}
7543
7544int
7545obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7546{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007547 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007548
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007549 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7550 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007551 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007552 }
7553 if (isinstance) {
7554 *out = Invert;
7555 return 0;
7556 }
7557 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7558 if (isinstance == -1) {
7559 return 1;
7560 }
7561 if (isinstance) {
7562 *out = Not;
7563 return 0;
7564 }
7565 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7566 if (isinstance == -1) {
7567 return 1;
7568 }
7569 if (isinstance) {
7570 *out = UAdd;
7571 return 0;
7572 }
7573 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7574 if (isinstance == -1) {
7575 return 1;
7576 }
7577 if (isinstance) {
7578 *out = USub;
7579 return 0;
7580 }
7581
7582 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7583 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007584}
7585
7586int
7587obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7588{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007589 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007590
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007591 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7592 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007593 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007594 }
7595 if (isinstance) {
7596 *out = Eq;
7597 return 0;
7598 }
7599 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7600 if (isinstance == -1) {
7601 return 1;
7602 }
7603 if (isinstance) {
7604 *out = NotEq;
7605 return 0;
7606 }
7607 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7608 if (isinstance == -1) {
7609 return 1;
7610 }
7611 if (isinstance) {
7612 *out = Lt;
7613 return 0;
7614 }
7615 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7616 if (isinstance == -1) {
7617 return 1;
7618 }
7619 if (isinstance) {
7620 *out = LtE;
7621 return 0;
7622 }
7623 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7624 if (isinstance == -1) {
7625 return 1;
7626 }
7627 if (isinstance) {
7628 *out = Gt;
7629 return 0;
7630 }
7631 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
7632 if (isinstance == -1) {
7633 return 1;
7634 }
7635 if (isinstance) {
7636 *out = GtE;
7637 return 0;
7638 }
7639 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
7640 if (isinstance == -1) {
7641 return 1;
7642 }
7643 if (isinstance) {
7644 *out = Is;
7645 return 0;
7646 }
7647 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
7648 if (isinstance == -1) {
7649 return 1;
7650 }
7651 if (isinstance) {
7652 *out = IsNot;
7653 return 0;
7654 }
7655 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
7656 if (isinstance == -1) {
7657 return 1;
7658 }
7659 if (isinstance) {
7660 *out = In;
7661 return 0;
7662 }
7663 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
7664 if (isinstance == -1) {
7665 return 1;
7666 }
7667 if (isinstance) {
7668 *out = NotIn;
7669 return 0;
7670 }
7671
7672 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
7673 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007674}
7675
7676int
7677obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
7678{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007679 PyObject* tmp = NULL;
7680 expr_ty target;
7681 expr_ty iter;
7682 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007683 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007684
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007685 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
7686 return 1;
7687 }
7688 if (tmp == NULL) {
7689 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
7690 return 1;
7691 }
7692 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007693 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007694 res = obj2ast_expr(tmp, &target, arena);
7695 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007696 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007697 }
7698 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007699 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007700 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007701 if (tmp == NULL) {
7702 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
7703 return 1;
7704 }
7705 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007706 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007707 res = obj2ast_expr(tmp, &iter, arena);
7708 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007709 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007710 }
7711 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007712 return 1;
7713 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007714 if (tmp == NULL) {
7715 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
7716 return 1;
7717 }
7718 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007719 int res;
7720 Py_ssize_t len;
7721 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007722 if (!PyList_Check(tmp)) {
7723 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7724 goto failed;
7725 }
7726 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007727 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007728 if (ifs == NULL) goto failed;
7729 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007730 expr_ty val;
7731 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007732 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007733 if (len != PyList_GET_SIZE(tmp)) {
7734 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
7735 goto failed;
7736 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007737 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007738 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007739 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007740 }
7741 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007742 return 1;
7743 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007744 if (tmp == NULL) {
7745 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
7746 return 1;
7747 }
7748 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007749 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007750 res = obj2ast_int(tmp, &is_async, arena);
7751 if (res != 0) goto failed;
7752 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007753 }
7754 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007755 return 0;
7756failed:
7757 Py_XDECREF(tmp);
7758 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007759}
7760
7761int
7762obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
7763{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007764 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00007765
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007766 PyObject *tmp = NULL;
7767 int lineno;
7768 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007769 int end_lineno;
7770 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007771
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007772 if (obj == Py_None) {
7773 *out = NULL;
7774 return 0;
7775 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007776 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7777 return 1;
7778 }
7779 if (tmp == NULL) {
7780 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
7781 return 1;
7782 }
7783 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007784 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007785 res = obj2ast_int(tmp, &lineno, arena);
7786 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007787 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007788 }
7789 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007790 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007791 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007792 if (tmp == NULL) {
7793 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
7794 return 1;
7795 }
7796 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007797 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007798 res = obj2ast_int(tmp, &col_offset, arena);
7799 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007800 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007801 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007802 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
7803 return 1;
7804 }
7805 if (tmp == NULL || tmp == Py_None) {
7806 Py_CLEAR(tmp);
7807 end_lineno = 0;
7808 }
7809 else {
7810 int res;
7811 res = obj2ast_int(tmp, &end_lineno, arena);
7812 if (res != 0) goto failed;
7813 Py_CLEAR(tmp);
7814 }
7815 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
7816 return 1;
7817 }
7818 if (tmp == NULL || tmp == Py_None) {
7819 Py_CLEAR(tmp);
7820 end_col_offset = 0;
7821 }
7822 else {
7823 int res;
7824 res = obj2ast_int(tmp, &end_col_offset, arena);
7825 if (res != 0) goto failed;
7826 Py_CLEAR(tmp);
7827 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007828 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
7829 if (isinstance == -1) {
7830 return 1;
7831 }
7832 if (isinstance) {
7833 expr_ty type;
7834 identifier name;
7835 asdl_seq* body;
7836
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007837 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
7838 return 1;
7839 }
7840 if (tmp == NULL || tmp == Py_None) {
7841 Py_CLEAR(tmp);
7842 type = NULL;
7843 }
7844 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007845 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007846 res = obj2ast_expr(tmp, &type, arena);
7847 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007848 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007849 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007850 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
7851 return 1;
7852 }
7853 if (tmp == NULL || tmp == Py_None) {
7854 Py_CLEAR(tmp);
7855 name = NULL;
7856 }
7857 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007858 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007859 res = obj2ast_identifier(tmp, &name, arena);
7860 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007861 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007862 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007863 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
7864 return 1;
7865 }
7866 if (tmp == NULL) {
7867 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
7868 return 1;
7869 }
7870 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007871 int res;
7872 Py_ssize_t len;
7873 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007874 if (!PyList_Check(tmp)) {
7875 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7876 goto failed;
7877 }
7878 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007879 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007880 if (body == NULL) goto failed;
7881 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007882 stmt_ty val;
7883 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007884 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007885 if (len != PyList_GET_SIZE(tmp)) {
7886 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
7887 goto failed;
7888 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007889 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007890 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007891 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007892 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007893 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
7894 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007895 if (*out == NULL) goto failed;
7896 return 0;
7897 }
7898
7899 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
7900 failed:
7901 Py_XDECREF(tmp);
7902 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007903}
7904
7905int
7906obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
7907{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007908 PyObject* tmp = NULL;
7909 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007910 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007911 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007912 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007913 arg_ty kwarg;
7914 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007915
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007916 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
7917 return 1;
7918 }
7919 if (tmp == NULL) {
7920 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
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)) {
7928 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7929 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007930 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007931 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007932 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007933 if (args == NULL) goto failed;
7934 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007935 arg_ty val;
7936 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007937 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007938 if (len != PyList_GET_SIZE(tmp)) {
7939 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
7940 goto failed;
7941 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007942 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007943 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007944 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007945 }
7946 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007947 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007948 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007949 if (tmp == NULL || tmp == Py_None) {
7950 Py_CLEAR(tmp);
7951 vararg = NULL;
7952 }
7953 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007954 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007955 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007956 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007957 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007958 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007959 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
7960 return 1;
7961 }
7962 if (tmp == NULL) {
7963 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
7964 return 1;
7965 }
7966 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007967 int res;
7968 Py_ssize_t len;
7969 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007970 if (!PyList_Check(tmp)) {
7971 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7972 goto failed;
7973 }
7974 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007975 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007976 if (kwonlyargs == NULL) goto failed;
7977 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007978 arg_ty val;
7979 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007980 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007981 if (len != PyList_GET_SIZE(tmp)) {
7982 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
7983 goto failed;
7984 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007985 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007986 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007987 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007988 }
7989 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007990 return 1;
7991 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007992 if (tmp == NULL) {
7993 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
7994 return 1;
7995 }
7996 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007997 int res;
7998 Py_ssize_t len;
7999 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008000 if (!PyList_Check(tmp)) {
8001 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8002 goto failed;
8003 }
8004 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008005 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008006 if (kw_defaults == NULL) goto failed;
8007 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008008 expr_ty val;
8009 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008010 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008011 if (len != PyList_GET_SIZE(tmp)) {
8012 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
8013 goto failed;
8014 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008015 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008016 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008017 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008018 }
8019 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008020 return 1;
8021 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008022 if (tmp == NULL || tmp == Py_None) {
8023 Py_CLEAR(tmp);
8024 kwarg = NULL;
8025 }
8026 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008027 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008028 res = obj2ast_arg(tmp, &kwarg, arena);
8029 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02008030 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008031 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008032 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
8033 return 1;
8034 }
8035 if (tmp == NULL) {
8036 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
8037 return 1;
8038 }
8039 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008040 int res;
8041 Py_ssize_t len;
8042 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008043 if (!PyList_Check(tmp)) {
8044 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8045 goto failed;
8046 }
8047 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008048 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008049 if (defaults == NULL) goto failed;
8050 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008051 expr_ty val;
8052 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008053 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008054 if (len != PyList_GET_SIZE(tmp)) {
8055 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
8056 goto failed;
8057 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008058 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008059 }
Victor Stinnerb3189902013-07-27 00:04:42 +02008060 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008061 }
8062 *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults,
8063 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008064 return 0;
8065failed:
8066 Py_XDECREF(tmp);
8067 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008068}
8069
8070int
8071obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
8072{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008073 PyObject* tmp = NULL;
8074 identifier arg;
8075 expr_ty annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01008076 int lineno;
8077 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008078 int end_lineno;
8079 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008080
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008081 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8082 return 1;
8083 }
8084 if (tmp == NULL) {
8085 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
8086 return 1;
8087 }
8088 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008089 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008090 res = obj2ast_identifier(tmp, &arg, arena);
8091 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008092 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008093 }
8094 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008095 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008096 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008097 if (tmp == NULL || tmp == Py_None) {
8098 Py_CLEAR(tmp);
8099 annotation = NULL;
8100 }
8101 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008102 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008103 res = obj2ast_expr(tmp, &annotation, arena);
8104 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008105 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008106 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008107 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8108 return 1;
8109 }
8110 if (tmp == NULL) {
8111 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
8112 return 1;
8113 }
8114 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008115 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008116 res = obj2ast_int(tmp, &lineno, arena);
8117 if (res != 0) goto failed;
8118 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008119 }
8120 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008121 return 1;
8122 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008123 if (tmp == NULL) {
8124 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
8125 return 1;
8126 }
8127 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008128 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008129 res = obj2ast_int(tmp, &col_offset, arena);
8130 if (res != 0) goto failed;
8131 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008132 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008133 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8134 return 1;
8135 }
8136 if (tmp == NULL || tmp == Py_None) {
8137 Py_CLEAR(tmp);
8138 end_lineno = 0;
8139 }
8140 else {
8141 int res;
8142 res = obj2ast_int(tmp, &end_lineno, arena);
8143 if (res != 0) goto failed;
8144 Py_CLEAR(tmp);
8145 }
8146 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8147 return 1;
8148 }
8149 if (tmp == NULL || tmp == Py_None) {
8150 Py_CLEAR(tmp);
8151 end_col_offset = 0;
8152 }
8153 else {
8154 int res;
8155 res = obj2ast_int(tmp, &end_col_offset, arena);
8156 if (res != 0) goto failed;
8157 Py_CLEAR(tmp);
8158 }
8159 *out = arg(arg, annotation, lineno, col_offset, end_lineno, end_col_offset,
8160 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008161 return 0;
8162failed:
8163 Py_XDECREF(tmp);
8164 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008165}
8166
8167int
8168obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8169{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008170 PyObject* tmp = NULL;
8171 identifier arg;
8172 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008173
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008174 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8175 return 1;
8176 }
8177 if (tmp == NULL || tmp == Py_None) {
8178 Py_CLEAR(tmp);
8179 arg = NULL;
8180 }
8181 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008182 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008183 res = obj2ast_identifier(tmp, &arg, arena);
8184 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008185 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008186 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008187 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8188 return 1;
8189 }
8190 if (tmp == NULL) {
8191 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8192 return 1;
8193 }
8194 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008195 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008196 res = obj2ast_expr(tmp, &value, arena);
8197 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008198 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008199 }
8200 *out = keyword(arg, value, arena);
8201 return 0;
8202failed:
8203 Py_XDECREF(tmp);
8204 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008205}
8206
8207int
8208obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8209{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008210 PyObject* tmp = NULL;
8211 identifier name;
8212 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008213
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008214 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8215 return 1;
8216 }
8217 if (tmp == NULL) {
8218 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8219 return 1;
8220 }
8221 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008222 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008223 res = obj2ast_identifier(tmp, &name, arena);
8224 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008225 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008226 }
8227 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008228 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008229 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008230 if (tmp == NULL || tmp == Py_None) {
8231 Py_CLEAR(tmp);
8232 asname = NULL;
8233 }
8234 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008235 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008236 res = obj2ast_identifier(tmp, &asname, arena);
8237 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008238 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008239 }
8240 *out = alias(name, asname, arena);
8241 return 0;
8242failed:
8243 Py_XDECREF(tmp);
8244 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008245}
8246
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008247int
8248obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8249{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008250 PyObject* tmp = NULL;
8251 expr_ty context_expr;
8252 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008253
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008254 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8255 return 1;
8256 }
8257 if (tmp == NULL) {
8258 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8259 return 1;
8260 }
8261 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008262 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008263 res = obj2ast_expr(tmp, &context_expr, arena);
8264 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008265 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008266 }
8267 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008268 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008269 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008270 if (tmp == NULL || tmp == Py_None) {
8271 Py_CLEAR(tmp);
8272 optional_vars = NULL;
8273 }
8274 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008275 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008276 res = obj2ast_expr(tmp, &optional_vars, arena);
8277 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008278 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008279 }
8280 *out = withitem(context_expr, optional_vars, arena);
8281 return 0;
8282failed:
8283 Py_XDECREF(tmp);
8284 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008285}
8286
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008287
Martin v. Löwis1a214512008-06-11 05:26:20 +00008288static struct PyModuleDef _astmodule = {
8289 PyModuleDef_HEAD_INIT, "_ast"
8290};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008291PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008292PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008293{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008294 PyObject *m, *d;
8295 if (!init_types()) return NULL;
8296 m = PyModule_Create(&_astmodule);
8297 if (!m) return NULL;
8298 d = PyModule_GetDict(m);
8299 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008300 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008301 return NULL;
8302 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8303 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8304 NULL;
8305 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8306 0) return NULL;
8307 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8308 return NULL;
8309 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8310 NULL;
8311 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8312 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8313 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008314 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8315 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008316 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8317 return NULL;
8318 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8319 NULL;
8320 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8321 NULL;
8322 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8323 NULL;
8324 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8325 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008326 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8327 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008328 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008329 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8330 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008331 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8332 NULL;
8333 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8334 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008335 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8336 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008337 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8338 NULL;
8339 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8340 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8341 NULL;
8342 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8343 NULL;
8344 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8345 return NULL;
8346 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8347 NULL;
8348 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8349 return NULL;
8350 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8351 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8352 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8353 NULL;
8354 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8355 return NULL;
8356 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8357 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8358 NULL;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07008359 if (PyDict_SetItemString(d, "NamedExpr", (PyObject*)NamedExpr_type) < 0)
8360 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008361 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8362 NULL;
8363 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8364 NULL;
8365 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8366 NULL;
8367 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8368 NULL;
8369 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8370 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8371 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8372 return NULL;
8373 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8374 NULL;
8375 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8376 return NULL;
8377 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8378 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008379 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8380 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008381 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8382 NULL;
8383 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8384 return NULL;
8385 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8386 NULL;
8387 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008388 if (PyDict_SetItemString(d, "FormattedValue",
8389 (PyObject*)FormattedValue_type) < 0) return NULL;
8390 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8391 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008392 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8393 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008394 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8395 return NULL;
8396 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8397 return NULL;
8398 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8399 NULL;
8400 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8401 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8402 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8403 NULL;
8404 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8405 0) return NULL;
8406 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8407 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8408 NULL;
8409 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8410 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8411 NULL;
8412 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8413 return NULL;
8414 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8415 NULL;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07008416 if (PyDict_SetItemString(d, "NamedStore", (PyObject*)NamedStore_type) < 0)
8417 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008418 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8419 NULL;
8420 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8421 NULL;
8422 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8423 return NULL;
8424 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8425 NULL;
8426 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8427 NULL;
8428 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8429 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8430 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8431 return NULL;
8432 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8433 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8434 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008435 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8436 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008437 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8438 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8439 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8440 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8441 NULL;
8442 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8443 NULL;
8444 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8445 NULL;
8446 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8447 NULL;
8448 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8449 NULL;
8450 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8451 return NULL;
8452 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8453 NULL;
8454 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8455 NULL;
8456 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8457 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8458 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8459 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8460 NULL;
8461 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8462 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8463 NULL;
8464 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8465 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8466 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8467 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8468 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8469 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8470 NULL;
8471 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8472 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8473 NULL;
8474 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8475 < 0) return NULL;
8476 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8477 < 0) return NULL;
8478 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8479 < 0) return NULL;
8480 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8481 return NULL;
8482 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8483 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8484 NULL;
8485 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8486 NULL;
8487 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8488 return NULL;
8489 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008490}
8491
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008492
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008493PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008494{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008495 if (!init_types())
8496 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008497 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008498}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008499
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008500/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8501mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008502{
8503 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008504 PyObject *req_type[3];
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008505 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008506 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008507
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008508 req_type[0] = (PyObject*)Module_type;
8509 req_type[1] = (PyObject*)Expression_type;
8510 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008511
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008512 assert(0 <= mode && mode <= 2);
8513
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008514 if (!init_types())
8515 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008516
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008517 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8518 if (isinstance == -1)
8519 return NULL;
8520 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008521 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8522 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008523 return NULL;
8524 }
8525 if (obj2ast_mod(ast, &res, arena) != 0)
8526 return NULL;
8527 else
8528 return res;
8529}
8530
8531int PyAST_Check(PyObject* obj)
8532{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008533 if (!init_types())
8534 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00008535 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008536}
8537
Martin v. Löwis5b222132007-06-10 09:51:05 +00008538