blob: 38b9292577f247f97ad371cbb08b90ba4c39c07f [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);
Neal Norwitz53d960c2006-02-28 22:47:29 +000031static char *stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +020032 "lineno",
33 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +000034};
Martin v. Löwisbd260da2006-02-26 19:42:26 +000035static PyObject* ast2obj_stmt(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000036static PyTypeObject *FunctionDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020037_Py_IDENTIFIER(name);
38_Py_IDENTIFIER(args);
39_Py_IDENTIFIER(decorator_list);
40_Py_IDENTIFIER(returns);
Neal Norwitz53d960c2006-02-28 22:47:29 +000041static char *FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020042 "name",
43 "args",
44 "body",
45 "decorator_list",
46 "returns",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000047};
Yury Selivanov75445082015-05-11 22:57:16 -040048static PyTypeObject *AsyncFunctionDef_type;
49static char *AsyncFunctionDef_fields[]={
50 "name",
51 "args",
52 "body",
53 "decorator_list",
54 "returns",
55};
Neal Norwitz53d960c2006-02-28 22:47:29 +000056static PyTypeObject *ClassDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020057_Py_IDENTIFIER(bases);
58_Py_IDENTIFIER(keywords);
Neal Norwitz53d960c2006-02-28 22:47:29 +000059static char *ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020060 "name",
61 "bases",
62 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +020063 "body",
64 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000065};
Neal Norwitz53d960c2006-02-28 22:47:29 +000066static PyTypeObject *Return_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020067_Py_IDENTIFIER(value);
Neal Norwitz53d960c2006-02-28 22:47:29 +000068static char *Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020069 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000070};
Neal Norwitz53d960c2006-02-28 22:47:29 +000071static PyTypeObject *Delete_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020072_Py_IDENTIFIER(targets);
Neal Norwitz53d960c2006-02-28 22:47:29 +000073static char *Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020074 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000075};
Neal Norwitz53d960c2006-02-28 22:47:29 +000076static PyTypeObject *Assign_type;
77static char *Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020078 "targets",
79 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000080};
Neal Norwitz53d960c2006-02-28 22:47:29 +000081static PyTypeObject *AugAssign_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020082_Py_IDENTIFIER(target);
83_Py_IDENTIFIER(op);
Neal Norwitz53d960c2006-02-28 22:47:29 +000084static char *AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020085 "target",
86 "op",
87 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000088};
Yury Selivanovf8cb8a12016-09-08 20:50:03 -070089static PyTypeObject *AnnAssign_type;
90_Py_IDENTIFIER(annotation);
91_Py_IDENTIFIER(simple);
92static char *AnnAssign_fields[]={
93 "target",
94 "annotation",
95 "value",
96 "simple",
97};
Neal Norwitz53d960c2006-02-28 22:47:29 +000098static PyTypeObject *For_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020099_Py_IDENTIFIER(iter);
100_Py_IDENTIFIER(orelse);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000101static char *For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200102 "target",
103 "iter",
104 "body",
105 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000106};
Yury Selivanov75445082015-05-11 22:57:16 -0400107static PyTypeObject *AsyncFor_type;
108static char *AsyncFor_fields[]={
109 "target",
110 "iter",
111 "body",
112 "orelse",
113};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000114static PyTypeObject *While_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200115_Py_IDENTIFIER(test);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000116static char *While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200117 "test",
118 "body",
119 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000120};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000121static PyTypeObject *If_type;
122static char *If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200123 "test",
124 "body",
125 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000126};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000127static PyTypeObject *With_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200128_Py_IDENTIFIER(items);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000129static char *With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200130 "items",
131 "body",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000132};
Yury Selivanov75445082015-05-11 22:57:16 -0400133static PyTypeObject *AsyncWith_type;
134static char *AsyncWith_fields[]={
135 "items",
136 "body",
137};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000138static PyTypeObject *Raise_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200139_Py_IDENTIFIER(exc);
140_Py_IDENTIFIER(cause);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000141static char *Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200142 "exc",
143 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000144};
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500145static PyTypeObject *Try_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200146_Py_IDENTIFIER(handlers);
147_Py_IDENTIFIER(finalbody);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500148static char *Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200149 "body",
150 "handlers",
151 "orelse",
152 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000153};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000154static PyTypeObject *Assert_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200155_Py_IDENTIFIER(msg);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000156static char *Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200157 "test",
158 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000159};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000160static PyTypeObject *Import_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200161_Py_IDENTIFIER(names);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000162static char *Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200163 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000164};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000165static PyTypeObject *ImportFrom_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200166_Py_IDENTIFIER(module);
167_Py_IDENTIFIER(level);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000168static char *ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200169 "module",
170 "names",
171 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000172};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000173static PyTypeObject *Global_type;
174static char *Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200175 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000176};
Jeremy Hylton81e95022007-02-27 06:50:52 +0000177static PyTypeObject *Nonlocal_type;
178static char *Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200179 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000180};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000181static PyTypeObject *Expr_type;
182static char *Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200183 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000184};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000185static PyTypeObject *Pass_type;
186static PyTypeObject *Break_type;
187static PyTypeObject *Continue_type;
188static PyTypeObject *expr_type;
189static char *expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200190 "lineno",
191 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000192};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000193static PyObject* ast2obj_expr(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000194static PyTypeObject *BoolOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200195_Py_IDENTIFIER(values);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000196static char *BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200197 "op",
198 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000199};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000200static PyTypeObject *BinOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200201_Py_IDENTIFIER(left);
202_Py_IDENTIFIER(right);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000203static char *BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200204 "left",
205 "op",
206 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000207};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000208static PyTypeObject *UnaryOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200209_Py_IDENTIFIER(operand);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000210static char *UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200211 "op",
212 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000213};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000214static PyTypeObject *Lambda_type;
215static char *Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200216 "args",
217 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000218};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000219static PyTypeObject *IfExp_type;
220static char *IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200221 "test",
222 "body",
223 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000224};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000225static PyTypeObject *Dict_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200226_Py_IDENTIFIER(keys);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000227static char *Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200228 "keys",
229 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000230};
Guido van Rossum86e58e22006-08-28 15:27:34 +0000231static PyTypeObject *Set_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200232_Py_IDENTIFIER(elts);
Guido van Rossum86e58e22006-08-28 15:27:34 +0000233static char *Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200234 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000235};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000236static PyTypeObject *ListComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200237_Py_IDENTIFIER(elt);
238_Py_IDENTIFIER(generators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000239static char *ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200240 "elt",
241 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000242};
Nick Coghlan650f0d02007-04-15 12:05:43 +0000243static PyTypeObject *SetComp_type;
244static char *SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200245 "elt",
246 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000247};
Guido van Rossum992d4a32007-07-11 13:09:30 +0000248static PyTypeObject *DictComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200249_Py_IDENTIFIER(key);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000250static char *DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200251 "key",
252 "value",
253 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000254};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000255static PyTypeObject *GeneratorExp_type;
256static char *GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200257 "elt",
258 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000259};
Yury Selivanov75445082015-05-11 22:57:16 -0400260static PyTypeObject *Await_type;
261static char *Await_fields[]={
262 "value",
263};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000264static PyTypeObject *Yield_type;
265static char *Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200266 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500267};
268static PyTypeObject *YieldFrom_type;
269static char *YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200270 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000271};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000272static PyTypeObject *Compare_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200273_Py_IDENTIFIER(ops);
274_Py_IDENTIFIER(comparators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000275static char *Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200276 "left",
277 "ops",
278 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000279};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000280static PyTypeObject *Call_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200281_Py_IDENTIFIER(func);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000282static char *Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200283 "func",
284 "args",
285 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000286};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000287static PyTypeObject *Num_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200288_Py_IDENTIFIER(n);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000289static char *Num_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200290 "n",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000291};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000292static PyTypeObject *Str_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200293_Py_IDENTIFIER(s);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000294static char *Str_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200295 "s",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000296};
Eric V. Smith235a6f02015-09-19 14:51:32 -0400297static PyTypeObject *FormattedValue_type;
298_Py_IDENTIFIER(conversion);
299_Py_IDENTIFIER(format_spec);
300static char *FormattedValue_fields[]={
301 "value",
302 "conversion",
303 "format_spec",
304};
305static PyTypeObject *JoinedStr_type;
306static char *JoinedStr_fields[]={
307 "values",
308};
Thomas Wouters00e41de2007-02-23 19:56:57 +0000309static PyTypeObject *Bytes_type;
310static char *Bytes_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200311 "s",
Thomas Wouters00e41de2007-02-23 19:56:57 +0000312};
Benjamin Peterson442f2092012-12-06 17:41:04 -0500313static PyTypeObject *NameConstant_type;
314static char *NameConstant_fields[]={
Victor Stinneree4b59c2013-07-27 00:01:35 +0200315 "value",
Benjamin Peterson442f2092012-12-06 17:41:04 -0500316};
Georg Brandl52318d62006-09-06 07:06:08 +0000317static PyTypeObject *Ellipsis_type;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100318static PyTypeObject *Constant_type;
319static char *Constant_fields[]={
320 "value",
321};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000322static PyTypeObject *Attribute_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200323_Py_IDENTIFIER(attr);
324_Py_IDENTIFIER(ctx);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000325static char *Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200326 "value",
327 "attr",
328 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000329};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000330static PyTypeObject *Subscript_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200331_Py_IDENTIFIER(slice);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000332static char *Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200333 "value",
334 "slice",
335 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000336};
Guido van Rossum0368b722007-05-11 16:50:42 +0000337static PyTypeObject *Starred_type;
338static char *Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200339 "value",
340 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000341};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000342static PyTypeObject *Name_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200343_Py_IDENTIFIER(id);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000344static char *Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200345 "id",
346 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000347};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000348static PyTypeObject *List_type;
349static char *List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200350 "elts",
351 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000352};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000353static PyTypeObject *Tuple_type;
354static char *Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200355 "elts",
356 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000357};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000358static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000359static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
360*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
361static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000362static PyTypeObject *Load_type;
363static PyTypeObject *Store_type;
364static PyTypeObject *Del_type;
365static PyTypeObject *AugLoad_type;
366static PyTypeObject *AugStore_type;
367static PyTypeObject *Param_type;
368static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000369static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000370static PyTypeObject *Slice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200371_Py_IDENTIFIER(lower);
372_Py_IDENTIFIER(upper);
373_Py_IDENTIFIER(step);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000374static char *Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200375 "lower",
376 "upper",
377 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000378};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000379static PyTypeObject *ExtSlice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200380_Py_IDENTIFIER(dims);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000381static char *ExtSlice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200382 "dims",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000383};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000384static PyTypeObject *Index_type;
385static char *Index_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200386 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000387};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000388static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000389static PyObject *And_singleton, *Or_singleton;
390static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000391static PyTypeObject *And_type;
392static PyTypeObject *Or_type;
393static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000394static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
Benjamin Petersond51374e2014-04-09 23:55:56 -0400395*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton,
396*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton,
397*BitAnd_singleton, *FloorDiv_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000398static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000399static PyTypeObject *Add_type;
400static PyTypeObject *Sub_type;
401static PyTypeObject *Mult_type;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400402static PyTypeObject *MatMult_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000403static PyTypeObject *Div_type;
404static PyTypeObject *Mod_type;
405static PyTypeObject *Pow_type;
406static PyTypeObject *LShift_type;
407static PyTypeObject *RShift_type;
408static PyTypeObject *BitOr_type;
409static PyTypeObject *BitXor_type;
410static PyTypeObject *BitAnd_type;
411static PyTypeObject *FloorDiv_type;
412static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000413static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
414*USub_singleton;
415static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000416static PyTypeObject *Invert_type;
417static PyTypeObject *Not_type;
418static PyTypeObject *UAdd_type;
419static PyTypeObject *USub_type;
420static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000421static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
422*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
423*NotIn_singleton;
424static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000425static PyTypeObject *Eq_type;
426static PyTypeObject *NotEq_type;
427static PyTypeObject *Lt_type;
428static PyTypeObject *LtE_type;
429static PyTypeObject *Gt_type;
430static PyTypeObject *GtE_type;
431static PyTypeObject *Is_type;
432static PyTypeObject *IsNot_type;
433static PyTypeObject *In_type;
434static PyTypeObject *NotIn_type;
435static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000436static PyObject* ast2obj_comprehension(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200437_Py_IDENTIFIER(ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700438_Py_IDENTIFIER(is_async);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000439static char *comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200440 "target",
441 "iter",
442 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700443 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000444};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000445static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000446static char *excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200447 "lineno",
448 "col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000449};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000450static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000451static PyTypeObject *ExceptHandler_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200452_Py_IDENTIFIER(type);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000453static char *ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200454 "type",
455 "name",
456 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000457};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000458static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000459static PyObject* ast2obj_arguments(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200460_Py_IDENTIFIER(vararg);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200461_Py_IDENTIFIER(kwonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200462_Py_IDENTIFIER(kw_defaults);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700463_Py_IDENTIFIER(kwarg);
464_Py_IDENTIFIER(defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000465static char *arguments_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200466 "args",
467 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200468 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200469 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200470 "kwarg",
471 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000472};
Neal Norwitzc1505362006-12-28 06:47:50 +0000473static PyTypeObject *arg_type;
474static PyObject* ast2obj_arg(void*);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700475static char *arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200476 "lineno",
477 "col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700478};
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200479_Py_IDENTIFIER(arg);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000480static char *arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200481 "arg",
482 "annotation",
Neal Norwitzc1505362006-12-28 06:47:50 +0000483};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000484static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000485static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000486static char *keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200487 "arg",
488 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000489};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000490static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000491static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200492_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000493static char *alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200494 "name",
495 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000496};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500497static PyTypeObject *withitem_type;
498static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200499_Py_IDENTIFIER(context_expr);
500_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500501static char *withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200502 "context_expr",
503 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500504};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000505
506
INADA Naokifc489082017-01-25 22:33:43 +0900507_Py_IDENTIFIER(_fields);
508_Py_IDENTIFIER(_attributes);
509
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700510typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100511 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700512 PyObject *dict;
513} AST_object;
514
Benjamin Peterson1767e022012-03-14 21:50:29 -0500515static void
516ast_dealloc(AST_object *self)
517{
INADA Naokia6296d32017-08-24 14:55:17 +0900518 /* bpo-31095: UnTrack is needed before calling any callbacks */
519 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500520 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200521 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500522}
523
Neal Norwitz207c9f32008-03-31 04:42:11 +0000524static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700525ast_traverse(AST_object *self, visitproc visit, void *arg)
526{
527 Py_VISIT(self->dict);
528 return 0;
529}
530
531static void
532ast_clear(AST_object *self)
533{
534 Py_CLEAR(self->dict);
535}
536
537static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000538ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
539{
540 Py_ssize_t i, numfields = 0;
541 int res = -1;
542 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200543 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
544 goto cleanup;
545 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000546 if (fields) {
547 numfields = PySequence_Size(fields);
548 if (numfields == -1)
549 goto cleanup;
550 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900551
Neal Norwitz207c9f32008-03-31 04:42:11 +0000552 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900553 if (numfields < PyTuple_GET_SIZE(args)) {
554 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
555 "%zd positional argument%s",
556 Py_TYPE(self)->tp_name,
557 numfields, numfields == 1 ? "" : "s");
558 res = -1;
559 goto cleanup;
560 }
561 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
562 /* cannot be reached when fields is NULL */
563 PyObject *name = PySequence_GetItem(fields, i);
564 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000565 res = -1;
566 goto cleanup;
567 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900568 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
569 Py_DECREF(name);
570 if (res < 0)
571 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000572 }
573 if (kw) {
574 i = 0; /* needed by PyDict_Next */
575 while (PyDict_Next(kw, &i, &key, &value)) {
576 res = PyObject_SetAttr(self, key, value);
577 if (res < 0)
578 goto cleanup;
579 }
580 }
581 cleanup:
582 Py_XDECREF(fields);
583 return res;
584}
585
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000586/* Pickling support */
587static PyObject *
588ast_type_reduce(PyObject *self, PyObject *unused)
589{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200590 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200591 PyObject *dict;
592 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
593 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000594 }
595 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200596 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000597 }
598 return Py_BuildValue("O()", Py_TYPE(self));
599}
600
601static PyMethodDef ast_type_methods[] = {
602 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
603 {NULL}
604};
605
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700606static PyGetSetDef ast_type_getsets[] = {
607 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
608 {NULL}
609};
610
Neal Norwitz207c9f32008-03-31 04:42:11 +0000611static PyTypeObject AST_type = {
612 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000613 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700614 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000615 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500616 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000617 0, /* tp_print */
618 0, /* tp_getattr */
619 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000620 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000621 0, /* tp_repr */
622 0, /* tp_as_number */
623 0, /* tp_as_sequence */
624 0, /* tp_as_mapping */
625 0, /* tp_hash */
626 0, /* tp_call */
627 0, /* tp_str */
628 PyObject_GenericGetAttr, /* tp_getattro */
629 PyObject_GenericSetAttr, /* tp_setattro */
630 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700631 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000632 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700633 (traverseproc)ast_traverse, /* tp_traverse */
634 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000635 0, /* tp_richcompare */
636 0, /* tp_weaklistoffset */
637 0, /* tp_iter */
638 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000639 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000640 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700641 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000642 0, /* tp_base */
643 0, /* tp_dict */
644 0, /* tp_descr_get */
645 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700646 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000647 (initproc)ast_type_init, /* tp_init */
648 PyType_GenericAlloc, /* tp_alloc */
649 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700650 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000651};
652
653
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000654static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
655{
INADA Naokifc489082017-01-25 22:33:43 +0900656 _Py_IDENTIFIER(__module__);
657 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000658 PyObject *fnames, *result;
659 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000660 fnames = PyTuple_New(num_fields);
661 if (!fnames) return NULL;
662 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000663 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000664 if (!field) {
665 Py_DECREF(fnames);
666 return NULL;
667 }
668 PyTuple_SET_ITEM(fnames, i, field);
669 }
INADA Naokifc489082017-01-25 22:33:43 +0900670 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
671 type, base,
672 _PyUnicode_FromId(&PyId__fields), fnames,
673 _PyUnicode_FromId(&PyId___module__),
674 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000675 Py_DECREF(fnames);
676 return (PyTypeObject*)result;
677}
678
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000679static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
680{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000681 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000682 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000683 if (!l)
684 return 0;
685 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000686 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000687 if (!s) {
688 Py_DECREF(l);
689 return 0;
690 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000691 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000692 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200693 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000694 Py_DECREF(l);
695 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000696}
697
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000698/* Conversion AST -> Python */
699
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000700static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
701{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700702 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000703 PyObject *result = PyList_New(n);
704 PyObject *value;
705 if (!result)
706 return NULL;
707 for (i = 0; i < n; i++) {
708 value = func(asdl_seq_GET(seq, i));
709 if (!value) {
710 Py_DECREF(result);
711 return NULL;
712 }
713 PyList_SET_ITEM(result, i, value);
714 }
715 return result;
716}
717
718static PyObject* ast2obj_object(void *o)
719{
720 if (!o)
721 o = Py_None;
722 Py_INCREF((PyObject*)o);
723 return (PyObject*)o;
724}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500725#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100726#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000727#define ast2obj_identifier ast2obj_object
728#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500729#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000730
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000731static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000732{
Christian Heimes217cfd12007-12-02 14:31:20 +0000733 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000734}
735
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000736/* Conversion Python -> AST */
737
Benjamin Peterson442f2092012-12-06 17:41:04 -0500738static int obj2ast_singleton(PyObject *obj, PyObject** out, PyArena* arena)
739{
740 if (obj != Py_None && obj != Py_True && obj != Py_False) {
741 PyErr_SetString(PyExc_ValueError,
742 "AST singleton must be True, False, or None");
743 return 1;
744 }
745 *out = obj;
746 return 0;
747}
748
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000749static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
750{
751 if (obj == Py_None)
752 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200753 if (obj) {
754 if (PyArena_AddPyObject(arena, obj) < 0) {
755 *out = NULL;
756 return -1;
757 }
758 Py_INCREF(obj);
759 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000760 *out = obj;
761 return 0;
762}
763
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100764static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
765{
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100766 if (obj) {
767 if (PyArena_AddPyObject(arena, obj) < 0) {
768 *out = NULL;
769 return -1;
770 }
771 Py_INCREF(obj);
772 }
773 *out = obj;
774 return 0;
775}
776
Benjamin Peterson180e6352011-07-22 11:09:07 -0500777static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500778{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500779 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
780 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500781 return 1;
782 }
783 return obj2ast_object(obj, out, arena);
784}
785
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500786static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
787{
Benjamin Peterson0224d4e2011-08-31 22:13:03 -0400788 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
Benjamin Peterson180e6352011-07-22 11:09:07 -0500789 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
790 return 1;
791 }
792 return obj2ast_object(obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500793}
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000794
Benjamin Petersone2498412011-08-09 16:08:39 -0500795static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
796{
797 if (!PyBytes_CheckExact(obj)) {
798 PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
799 return 1;
800 }
801 return obj2ast_object(obj, out, arena);
802}
803
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000804static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
805{
806 int i;
807 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100808 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000809 return 1;
810 }
811
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300812 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000813 if (i == -1 && PyErr_Occurred())
814 return 1;
815 *out = i;
816 return 0;
817}
818
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000819static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000820{
821 PyObject *empty_tuple, *d;
822 if (PyType_Ready(&AST_type) < 0)
823 return -1;
824 d = AST_type.tp_dict;
825 empty_tuple = PyTuple_New(0);
826 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900827 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
828 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000829 Py_XDECREF(empty_tuple);
830 return -1;
831 }
832 Py_DECREF(empty_tuple);
833 return 0;
834}
835
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000836
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000837static int init_types(void)
838{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200839 static int initialized;
840 if (initialized) return 1;
841 if (add_ast_fields() < 0) return 0;
842 mod_type = make_type("mod", &AST_type, NULL, 0);
843 if (!mod_type) return 0;
844 if (!add_attributes(mod_type, NULL, 0)) return 0;
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300845 Module_type = make_type("Module", mod_type, Module_fields, 1);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200846 if (!Module_type) return 0;
847 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
848 1);
849 if (!Interactive_type) return 0;
850 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
851 if (!Expression_type) return 0;
852 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
853 if (!Suite_type) return 0;
854 stmt_type = make_type("stmt", &AST_type, NULL, 0);
855 if (!stmt_type) return 0;
856 if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
857 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300858 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200859 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400860 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300861 AsyncFunctionDef_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400862 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300863 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200864 if (!ClassDef_type) return 0;
865 Return_type = make_type("Return", stmt_type, Return_fields, 1);
866 if (!Return_type) return 0;
867 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
868 if (!Delete_type) return 0;
869 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
870 if (!Assign_type) return 0;
871 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
872 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700873 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
874 if (!AnnAssign_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200875 For_type = make_type("For", stmt_type, For_fields, 4);
876 if (!For_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400877 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4);
878 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200879 While_type = make_type("While", stmt_type, While_fields, 3);
880 if (!While_type) return 0;
881 If_type = make_type("If", stmt_type, If_fields, 3);
882 if (!If_type) return 0;
883 With_type = make_type("With", stmt_type, With_fields, 2);
884 if (!With_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400885 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 2);
886 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200887 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
888 if (!Raise_type) return 0;
889 Try_type = make_type("Try", stmt_type, Try_fields, 4);
890 if (!Try_type) return 0;
891 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
892 if (!Assert_type) return 0;
893 Import_type = make_type("Import", stmt_type, Import_fields, 1);
894 if (!Import_type) return 0;
895 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
896 if (!ImportFrom_type) return 0;
897 Global_type = make_type("Global", stmt_type, Global_fields, 1);
898 if (!Global_type) return 0;
899 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
900 if (!Nonlocal_type) return 0;
901 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
902 if (!Expr_type) return 0;
903 Pass_type = make_type("Pass", stmt_type, NULL, 0);
904 if (!Pass_type) return 0;
905 Break_type = make_type("Break", stmt_type, NULL, 0);
906 if (!Break_type) return 0;
907 Continue_type = make_type("Continue", stmt_type, NULL, 0);
908 if (!Continue_type) return 0;
909 expr_type = make_type("expr", &AST_type, NULL, 0);
910 if (!expr_type) return 0;
911 if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
912 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
913 if (!BoolOp_type) return 0;
914 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
915 if (!BinOp_type) return 0;
916 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
917 if (!UnaryOp_type) return 0;
918 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
919 if (!Lambda_type) return 0;
920 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
921 if (!IfExp_type) return 0;
922 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
923 if (!Dict_type) return 0;
924 Set_type = make_type("Set", expr_type, Set_fields, 1);
925 if (!Set_type) return 0;
926 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
927 if (!ListComp_type) return 0;
928 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
929 if (!SetComp_type) return 0;
930 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
931 if (!DictComp_type) return 0;
932 GeneratorExp_type = make_type("GeneratorExp", expr_type,
933 GeneratorExp_fields, 2);
934 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400935 Await_type = make_type("Await", expr_type, Await_fields, 1);
936 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200937 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
938 if (!Yield_type) return 0;
939 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
940 if (!YieldFrom_type) return 0;
941 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
942 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400943 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200944 if (!Call_type) return 0;
945 Num_type = make_type("Num", expr_type, Num_fields, 1);
946 if (!Num_type) return 0;
947 Str_type = make_type("Str", expr_type, Str_fields, 1);
948 if (!Str_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400949 FormattedValue_type = make_type("FormattedValue", expr_type,
950 FormattedValue_fields, 3);
951 if (!FormattedValue_type) return 0;
952 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
953 if (!JoinedStr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200954 Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);
955 if (!Bytes_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +0200956 NameConstant_type = make_type("NameConstant", expr_type,
957 NameConstant_fields, 1);
958 if (!NameConstant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200959 Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);
960 if (!Ellipsis_type) return 0;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100961 Constant_type = make_type("Constant", expr_type, Constant_fields, 1);
962 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200963 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
964 if (!Attribute_type) return 0;
965 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
966 if (!Subscript_type) return 0;
967 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
968 if (!Starred_type) return 0;
969 Name_type = make_type("Name", expr_type, Name_fields, 2);
970 if (!Name_type) return 0;
971 List_type = make_type("List", expr_type, List_fields, 2);
972 if (!List_type) return 0;
973 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
974 if (!Tuple_type) return 0;
975 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
976 if (!expr_context_type) return 0;
977 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
978 Load_type = make_type("Load", expr_context_type, NULL, 0);
979 if (!Load_type) return 0;
980 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
981 if (!Load_singleton) return 0;
982 Store_type = make_type("Store", expr_context_type, NULL, 0);
983 if (!Store_type) return 0;
984 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
985 if (!Store_singleton) return 0;
986 Del_type = make_type("Del", expr_context_type, NULL, 0);
987 if (!Del_type) return 0;
988 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
989 if (!Del_singleton) return 0;
990 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
991 if (!AugLoad_type) return 0;
992 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
993 if (!AugLoad_singleton) return 0;
994 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
995 if (!AugStore_type) return 0;
996 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
997 if (!AugStore_singleton) return 0;
998 Param_type = make_type("Param", expr_context_type, NULL, 0);
999 if (!Param_type) return 0;
1000 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
1001 if (!Param_singleton) return 0;
1002 slice_type = make_type("slice", &AST_type, NULL, 0);
1003 if (!slice_type) return 0;
1004 if (!add_attributes(slice_type, NULL, 0)) return 0;
1005 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1006 if (!Slice_type) return 0;
1007 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1008 if (!ExtSlice_type) return 0;
1009 Index_type = make_type("Index", slice_type, Index_fields, 1);
1010 if (!Index_type) return 0;
1011 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1012 if (!boolop_type) return 0;
1013 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1014 And_type = make_type("And", boolop_type, NULL, 0);
1015 if (!And_type) return 0;
1016 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1017 if (!And_singleton) return 0;
1018 Or_type = make_type("Or", boolop_type, NULL, 0);
1019 if (!Or_type) return 0;
1020 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1021 if (!Or_singleton) return 0;
1022 operator_type = make_type("operator", &AST_type, NULL, 0);
1023 if (!operator_type) return 0;
1024 if (!add_attributes(operator_type, NULL, 0)) return 0;
1025 Add_type = make_type("Add", operator_type, NULL, 0);
1026 if (!Add_type) return 0;
1027 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1028 if (!Add_singleton) return 0;
1029 Sub_type = make_type("Sub", operator_type, NULL, 0);
1030 if (!Sub_type) return 0;
1031 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1032 if (!Sub_singleton) return 0;
1033 Mult_type = make_type("Mult", operator_type, NULL, 0);
1034 if (!Mult_type) return 0;
1035 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1036 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001037 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1038 if (!MatMult_type) return 0;
1039 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1040 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001041 Div_type = make_type("Div", operator_type, NULL, 0);
1042 if (!Div_type) return 0;
1043 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1044 if (!Div_singleton) return 0;
1045 Mod_type = make_type("Mod", operator_type, NULL, 0);
1046 if (!Mod_type) return 0;
1047 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1048 if (!Mod_singleton) return 0;
1049 Pow_type = make_type("Pow", operator_type, NULL, 0);
1050 if (!Pow_type) return 0;
1051 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1052 if (!Pow_singleton) return 0;
1053 LShift_type = make_type("LShift", operator_type, NULL, 0);
1054 if (!LShift_type) return 0;
1055 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1056 if (!LShift_singleton) return 0;
1057 RShift_type = make_type("RShift", operator_type, NULL, 0);
1058 if (!RShift_type) return 0;
1059 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1060 if (!RShift_singleton) return 0;
1061 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1062 if (!BitOr_type) return 0;
1063 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1064 if (!BitOr_singleton) return 0;
1065 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1066 if (!BitXor_type) return 0;
1067 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1068 if (!BitXor_singleton) return 0;
1069 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1070 if (!BitAnd_type) return 0;
1071 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1072 if (!BitAnd_singleton) return 0;
1073 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1074 if (!FloorDiv_type) return 0;
1075 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1076 if (!FloorDiv_singleton) return 0;
1077 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1078 if (!unaryop_type) return 0;
1079 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1080 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1081 if (!Invert_type) return 0;
1082 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1083 if (!Invert_singleton) return 0;
1084 Not_type = make_type("Not", unaryop_type, NULL, 0);
1085 if (!Not_type) return 0;
1086 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1087 if (!Not_singleton) return 0;
1088 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1089 if (!UAdd_type) return 0;
1090 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1091 if (!UAdd_singleton) return 0;
1092 USub_type = make_type("USub", unaryop_type, NULL, 0);
1093 if (!USub_type) return 0;
1094 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1095 if (!USub_singleton) return 0;
1096 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1097 if (!cmpop_type) return 0;
1098 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1099 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1100 if (!Eq_type) return 0;
1101 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1102 if (!Eq_singleton) return 0;
1103 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1104 if (!NotEq_type) return 0;
1105 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1106 if (!NotEq_singleton) return 0;
1107 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1108 if (!Lt_type) return 0;
1109 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1110 if (!Lt_singleton) return 0;
1111 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1112 if (!LtE_type) return 0;
1113 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1114 if (!LtE_singleton) return 0;
1115 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1116 if (!Gt_type) return 0;
1117 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1118 if (!Gt_singleton) return 0;
1119 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1120 if (!GtE_type) return 0;
1121 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1122 if (!GtE_singleton) return 0;
1123 Is_type = make_type("Is", cmpop_type, NULL, 0);
1124 if (!Is_type) return 0;
1125 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1126 if (!Is_singleton) return 0;
1127 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1128 if (!IsNot_type) return 0;
1129 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1130 if (!IsNot_singleton) return 0;
1131 In_type = make_type("In", cmpop_type, NULL, 0);
1132 if (!In_type) return 0;
1133 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1134 if (!In_singleton) return 0;
1135 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1136 if (!NotIn_type) return 0;
1137 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1138 if (!NotIn_singleton) return 0;
1139 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001140 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001141 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001142 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001143 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1144 if (!excepthandler_type) return 0;
1145 if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
1146 return 0;
1147 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1148 ExceptHandler_fields, 3);
1149 if (!ExceptHandler_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001150 arguments_type = make_type("arguments", &AST_type, arguments_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001151 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001152 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001153 arg_type = make_type("arg", &AST_type, arg_fields, 2);
1154 if (!arg_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001155 if (!add_attributes(arg_type, arg_attributes, 2)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001156 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1157 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001158 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001159 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1160 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001161 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001162 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1163 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001164 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001165 initialized = 1;
1166 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001167}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001168
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001169static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1170static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1171static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1172static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1173 arena);
1174static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1175static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1176static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1177static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1178static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1179static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1180 arena);
1181static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1182 arena);
1183static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1184static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1185static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1186static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001187static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001188
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189mod_ty
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001190Module(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001192 mod_ty p;
1193 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1194 if (!p)
1195 return NULL;
1196 p->kind = Module_kind;
1197 p->v.Module.body = body;
1198 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199}
1200
1201mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001204 mod_ty p;
1205 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1206 if (!p)
1207 return NULL;
1208 p->kind = Interactive_kind;
1209 p->v.Interactive.body = body;
1210 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211}
1212
1213mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001214Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001216 mod_ty p;
1217 if (!body) {
1218 PyErr_SetString(PyExc_ValueError,
1219 "field body is required for Expression");
1220 return NULL;
1221 }
1222 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1223 if (!p)
1224 return NULL;
1225 p->kind = Expression_kind;
1226 p->v.Expression.body = body;
1227 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228}
1229
1230mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001231Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001233 mod_ty p;
1234 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1235 if (!p)
1236 return NULL;
1237 p->kind = Suite_kind;
1238 p->v.Suite.body = body;
1239 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240}
1241
1242stmt_ty
1243FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001244 decorator_list, expr_ty returns, int lineno, int col_offset,
1245 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001247 stmt_ty p;
1248 if (!name) {
1249 PyErr_SetString(PyExc_ValueError,
1250 "field name is required for FunctionDef");
1251 return NULL;
1252 }
1253 if (!args) {
1254 PyErr_SetString(PyExc_ValueError,
1255 "field args is required for FunctionDef");
1256 return NULL;
1257 }
1258 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1259 if (!p)
1260 return NULL;
1261 p->kind = FunctionDef_kind;
1262 p->v.FunctionDef.name = name;
1263 p->v.FunctionDef.args = args;
1264 p->v.FunctionDef.body = body;
1265 p->v.FunctionDef.decorator_list = decorator_list;
1266 p->v.FunctionDef.returns = returns;
1267 p->lineno = lineno;
1268 p->col_offset = col_offset;
1269 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001270}
1271
1272stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001273AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001274 * decorator_list, expr_ty returns, int lineno, int col_offset,
1275 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001276{
1277 stmt_ty p;
1278 if (!name) {
1279 PyErr_SetString(PyExc_ValueError,
1280 "field name is required for AsyncFunctionDef");
1281 return NULL;
1282 }
1283 if (!args) {
1284 PyErr_SetString(PyExc_ValueError,
1285 "field args is required for AsyncFunctionDef");
1286 return NULL;
1287 }
1288 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1289 if (!p)
1290 return NULL;
1291 p->kind = AsyncFunctionDef_kind;
1292 p->v.AsyncFunctionDef.name = name;
1293 p->v.AsyncFunctionDef.args = args;
1294 p->v.AsyncFunctionDef.body = body;
1295 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1296 p->v.AsyncFunctionDef.returns = returns;
1297 p->lineno = lineno;
1298 p->col_offset = col_offset;
1299 return p;
1300}
1301
1302stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001303ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001304 body, asdl_seq * decorator_list, int lineno, int col_offset, PyArena
1305 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001307 stmt_ty p;
1308 if (!name) {
1309 PyErr_SetString(PyExc_ValueError,
1310 "field name is required for ClassDef");
1311 return NULL;
1312 }
1313 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1314 if (!p)
1315 return NULL;
1316 p->kind = ClassDef_kind;
1317 p->v.ClassDef.name = name;
1318 p->v.ClassDef.bases = bases;
1319 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001320 p->v.ClassDef.body = body;
1321 p->v.ClassDef.decorator_list = decorator_list;
1322 p->lineno = lineno;
1323 p->col_offset = col_offset;
1324 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001325}
1326
1327stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001328Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001330 stmt_ty p;
1331 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1332 if (!p)
1333 return NULL;
1334 p->kind = Return_kind;
1335 p->v.Return.value = value;
1336 p->lineno = lineno;
1337 p->col_offset = col_offset;
1338 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001339}
1340
1341stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001342Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001344 stmt_ty p;
1345 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1346 if (!p)
1347 return NULL;
1348 p->kind = Delete_kind;
1349 p->v.Delete.targets = targets;
1350 p->lineno = lineno;
1351 p->col_offset = col_offset;
1352 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001353}
1354
1355stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001356Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1357 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001359 stmt_ty p;
1360 if (!value) {
1361 PyErr_SetString(PyExc_ValueError,
1362 "field value is required for Assign");
1363 return NULL;
1364 }
1365 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1366 if (!p)
1367 return NULL;
1368 p->kind = Assign_kind;
1369 p->v.Assign.targets = targets;
1370 p->v.Assign.value = value;
1371 p->lineno = lineno;
1372 p->col_offset = col_offset;
1373 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374}
1375
1376stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001377AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1378 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001380 stmt_ty p;
1381 if (!target) {
1382 PyErr_SetString(PyExc_ValueError,
1383 "field target is required for AugAssign");
1384 return NULL;
1385 }
1386 if (!op) {
1387 PyErr_SetString(PyExc_ValueError,
1388 "field op is required for AugAssign");
1389 return NULL;
1390 }
1391 if (!value) {
1392 PyErr_SetString(PyExc_ValueError,
1393 "field value is required for AugAssign");
1394 return NULL;
1395 }
1396 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1397 if (!p)
1398 return NULL;
1399 p->kind = AugAssign_kind;
1400 p->v.AugAssign.target = target;
1401 p->v.AugAssign.op = op;
1402 p->v.AugAssign.value = value;
1403 p->lineno = lineno;
1404 p->col_offset = col_offset;
1405 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406}
1407
1408stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001409AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
1410 lineno, int col_offset, PyArena *arena)
1411{
1412 stmt_ty p;
1413 if (!target) {
1414 PyErr_SetString(PyExc_ValueError,
1415 "field target is required for AnnAssign");
1416 return NULL;
1417 }
1418 if (!annotation) {
1419 PyErr_SetString(PyExc_ValueError,
1420 "field annotation is required for AnnAssign");
1421 return NULL;
1422 }
1423 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1424 if (!p)
1425 return NULL;
1426 p->kind = AnnAssign_kind;
1427 p->v.AnnAssign.target = target;
1428 p->v.AnnAssign.annotation = annotation;
1429 p->v.AnnAssign.value = value;
1430 p->v.AnnAssign.simple = simple;
1431 p->lineno = lineno;
1432 p->col_offset = col_offset;
1433 return p;
1434}
1435
1436stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001438 lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001440 stmt_ty p;
1441 if (!target) {
1442 PyErr_SetString(PyExc_ValueError,
1443 "field target is required for For");
1444 return NULL;
1445 }
1446 if (!iter) {
1447 PyErr_SetString(PyExc_ValueError,
1448 "field iter is required for For");
1449 return NULL;
1450 }
1451 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1452 if (!p)
1453 return NULL;
1454 p->kind = For_kind;
1455 p->v.For.target = target;
1456 p->v.For.iter = iter;
1457 p->v.For.body = body;
1458 p->v.For.orelse = orelse;
1459 p->lineno = lineno;
1460 p->col_offset = col_offset;
1461 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462}
1463
1464stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001465AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
1466 lineno, int col_offset, PyArena *arena)
1467{
1468 stmt_ty p;
1469 if (!target) {
1470 PyErr_SetString(PyExc_ValueError,
1471 "field target is required for AsyncFor");
1472 return NULL;
1473 }
1474 if (!iter) {
1475 PyErr_SetString(PyExc_ValueError,
1476 "field iter is required for AsyncFor");
1477 return NULL;
1478 }
1479 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1480 if (!p)
1481 return NULL;
1482 p->kind = AsyncFor_kind;
1483 p->v.AsyncFor.target = target;
1484 p->v.AsyncFor.iter = iter;
1485 p->v.AsyncFor.body = body;
1486 p->v.AsyncFor.orelse = orelse;
1487 p->lineno = lineno;
1488 p->col_offset = col_offset;
1489 return p;
1490}
1491
1492stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001493While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1494 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001496 stmt_ty p;
1497 if (!test) {
1498 PyErr_SetString(PyExc_ValueError,
1499 "field test is required for While");
1500 return NULL;
1501 }
1502 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1503 if (!p)
1504 return NULL;
1505 p->kind = While_kind;
1506 p->v.While.test = test;
1507 p->v.While.body = body;
1508 p->v.While.orelse = orelse;
1509 p->lineno = lineno;
1510 p->col_offset = col_offset;
1511 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512}
1513
1514stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001515If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1516 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001518 stmt_ty p;
1519 if (!test) {
1520 PyErr_SetString(PyExc_ValueError,
1521 "field test is required for If");
1522 return NULL;
1523 }
1524 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1525 if (!p)
1526 return NULL;
1527 p->kind = If_kind;
1528 p->v.If.test = test;
1529 p->v.If.body = body;
1530 p->v.If.orelse = orelse;
1531 p->lineno = lineno;
1532 p->col_offset = col_offset;
1533 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534}
1535
1536stmt_ty
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001537With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
1538 *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001539{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001540 stmt_ty p;
1541 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1542 if (!p)
1543 return NULL;
1544 p->kind = With_kind;
1545 p->v.With.items = items;
1546 p->v.With.body = body;
1547 p->lineno = lineno;
1548 p->col_offset = col_offset;
1549 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001550}
1551
1552stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001553AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset,
1554 PyArena *arena)
1555{
1556 stmt_ty p;
1557 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1558 if (!p)
1559 return NULL;
1560 p->kind = AsyncWith_kind;
1561 p->v.AsyncWith.items = items;
1562 p->v.AsyncWith.body = body;
1563 p->lineno = lineno;
1564 p->col_offset = col_offset;
1565 return p;
1566}
1567
1568stmt_ty
Collin Winter828f04a2007-08-31 00:04:24 +00001569Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001571 stmt_ty p;
1572 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1573 if (!p)
1574 return NULL;
1575 p->kind = Raise_kind;
1576 p->v.Raise.exc = exc;
1577 p->v.Raise.cause = cause;
1578 p->lineno = lineno;
1579 p->col_offset = col_offset;
1580 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001581}
1582
1583stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001584Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
1585 finalbody, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001587 stmt_ty p;
1588 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1589 if (!p)
1590 return NULL;
1591 p->kind = Try_kind;
1592 p->v.Try.body = body;
1593 p->v.Try.handlers = handlers;
1594 p->v.Try.orelse = orelse;
1595 p->v.Try.finalbody = finalbody;
1596 p->lineno = lineno;
1597 p->col_offset = col_offset;
1598 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599}
1600
1601stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001602Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001603{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001604 stmt_ty p;
1605 if (!test) {
1606 PyErr_SetString(PyExc_ValueError,
1607 "field test is required for Assert");
1608 return NULL;
1609 }
1610 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1611 if (!p)
1612 return NULL;
1613 p->kind = Assert_kind;
1614 p->v.Assert.test = test;
1615 p->v.Assert.msg = msg;
1616 p->lineno = lineno;
1617 p->col_offset = col_offset;
1618 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619}
1620
1621stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001622Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001623{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001624 stmt_ty p;
1625 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1626 if (!p)
1627 return NULL;
1628 p->kind = Import_kind;
1629 p->v.Import.names = names;
1630 p->lineno = lineno;
1631 p->col_offset = col_offset;
1632 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001633}
1634
1635stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001636ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1637 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001639 stmt_ty p;
1640 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1641 if (!p)
1642 return NULL;
1643 p->kind = ImportFrom_kind;
1644 p->v.ImportFrom.module = module;
1645 p->v.ImportFrom.names = names;
1646 p->v.ImportFrom.level = level;
1647 p->lineno = lineno;
1648 p->col_offset = col_offset;
1649 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650}
1651
1652stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001653Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001655 stmt_ty p;
1656 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1657 if (!p)
1658 return NULL;
1659 p->kind = Global_kind;
1660 p->v.Global.names = names;
1661 p->lineno = lineno;
1662 p->col_offset = col_offset;
1663 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664}
1665
1666stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00001667Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1668{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001669 stmt_ty p;
1670 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1671 if (!p)
1672 return NULL;
1673 p->kind = Nonlocal_kind;
1674 p->v.Nonlocal.names = names;
1675 p->lineno = lineno;
1676 p->col_offset = col_offset;
1677 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001678}
1679
1680stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001681Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001683 stmt_ty p;
1684 if (!value) {
1685 PyErr_SetString(PyExc_ValueError,
1686 "field value is required for Expr");
1687 return NULL;
1688 }
1689 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1690 if (!p)
1691 return NULL;
1692 p->kind = Expr_kind;
1693 p->v.Expr.value = value;
1694 p->lineno = lineno;
1695 p->col_offset = col_offset;
1696 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697}
1698
1699stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001700Pass(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001702 stmt_ty p;
1703 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1704 if (!p)
1705 return NULL;
1706 p->kind = Pass_kind;
1707 p->lineno = lineno;
1708 p->col_offset = col_offset;
1709 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710}
1711
1712stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001713Break(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001715 stmt_ty p;
1716 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1717 if (!p)
1718 return NULL;
1719 p->kind = Break_kind;
1720 p->lineno = lineno;
1721 p->col_offset = col_offset;
1722 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723}
1724
1725stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001726Continue(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001728 stmt_ty p;
1729 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1730 if (!p)
1731 return NULL;
1732 p->kind = Continue_kind;
1733 p->lineno = lineno;
1734 p->col_offset = col_offset;
1735 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736}
1737
1738expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001739BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1740 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001742 expr_ty p;
1743 if (!op) {
1744 PyErr_SetString(PyExc_ValueError,
1745 "field op is required for BoolOp");
1746 return NULL;
1747 }
1748 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1749 if (!p)
1750 return NULL;
1751 p->kind = BoolOp_kind;
1752 p->v.BoolOp.op = op;
1753 p->v.BoolOp.values = values;
1754 p->lineno = lineno;
1755 p->col_offset = col_offset;
1756 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757}
1758
1759expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001760BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1761 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001763 expr_ty p;
1764 if (!left) {
1765 PyErr_SetString(PyExc_ValueError,
1766 "field left is required for BinOp");
1767 return NULL;
1768 }
1769 if (!op) {
1770 PyErr_SetString(PyExc_ValueError,
1771 "field op is required for BinOp");
1772 return NULL;
1773 }
1774 if (!right) {
1775 PyErr_SetString(PyExc_ValueError,
1776 "field right is required for BinOp");
1777 return NULL;
1778 }
1779 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1780 if (!p)
1781 return NULL;
1782 p->kind = BinOp_kind;
1783 p->v.BinOp.left = left;
1784 p->v.BinOp.op = op;
1785 p->v.BinOp.right = right;
1786 p->lineno = lineno;
1787 p->col_offset = col_offset;
1788 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001789}
1790
1791expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001792UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1793 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001795 expr_ty p;
1796 if (!op) {
1797 PyErr_SetString(PyExc_ValueError,
1798 "field op is required for UnaryOp");
1799 return NULL;
1800 }
1801 if (!operand) {
1802 PyErr_SetString(PyExc_ValueError,
1803 "field operand is required for UnaryOp");
1804 return NULL;
1805 }
1806 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1807 if (!p)
1808 return NULL;
1809 p->kind = UnaryOp_kind;
1810 p->v.UnaryOp.op = op;
1811 p->v.UnaryOp.operand = operand;
1812 p->lineno = lineno;
1813 p->col_offset = col_offset;
1814 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001815}
1816
1817expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001818Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
1819 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001821 expr_ty p;
1822 if (!args) {
1823 PyErr_SetString(PyExc_ValueError,
1824 "field args is required for Lambda");
1825 return NULL;
1826 }
1827 if (!body) {
1828 PyErr_SetString(PyExc_ValueError,
1829 "field body is required for Lambda");
1830 return NULL;
1831 }
1832 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1833 if (!p)
1834 return NULL;
1835 p->kind = Lambda_kind;
1836 p->v.Lambda.args = args;
1837 p->v.Lambda.body = body;
1838 p->lineno = lineno;
1839 p->col_offset = col_offset;
1840 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841}
1842
1843expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001844IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1845 PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001846{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001847 expr_ty p;
1848 if (!test) {
1849 PyErr_SetString(PyExc_ValueError,
1850 "field test is required for IfExp");
1851 return NULL;
1852 }
1853 if (!body) {
1854 PyErr_SetString(PyExc_ValueError,
1855 "field body is required for IfExp");
1856 return NULL;
1857 }
1858 if (!orelse) {
1859 PyErr_SetString(PyExc_ValueError,
1860 "field orelse is required for IfExp");
1861 return NULL;
1862 }
1863 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1864 if (!p)
1865 return NULL;
1866 p->kind = IfExp_kind;
1867 p->v.IfExp.test = test;
1868 p->v.IfExp.body = body;
1869 p->v.IfExp.orelse = orelse;
1870 p->lineno = lineno;
1871 p->col_offset = col_offset;
1872 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001873}
1874
1875expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001876Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1877 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001879 expr_ty p;
1880 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1881 if (!p)
1882 return NULL;
1883 p->kind = Dict_kind;
1884 p->v.Dict.keys = keys;
1885 p->v.Dict.values = values;
1886 p->lineno = lineno;
1887 p->col_offset = col_offset;
1888 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889}
1890
1891expr_ty
Guido van Rossum86e58e22006-08-28 15:27:34 +00001892Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1893{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001894 expr_ty p;
1895 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1896 if (!p)
1897 return NULL;
1898 p->kind = Set_kind;
1899 p->v.Set.elts = elts;
1900 p->lineno = lineno;
1901 p->col_offset = col_offset;
1902 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001903}
1904
1905expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001906ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1907 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001909 expr_ty p;
1910 if (!elt) {
1911 PyErr_SetString(PyExc_ValueError,
1912 "field elt is required for ListComp");
1913 return NULL;
1914 }
1915 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1916 if (!p)
1917 return NULL;
1918 p->kind = ListComp_kind;
1919 p->v.ListComp.elt = elt;
1920 p->v.ListComp.generators = generators;
1921 p->lineno = lineno;
1922 p->col_offset = col_offset;
1923 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924}
1925
1926expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001927SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1928 *arena)
1929{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001930 expr_ty p;
1931 if (!elt) {
1932 PyErr_SetString(PyExc_ValueError,
1933 "field elt is required for SetComp");
1934 return NULL;
1935 }
1936 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1937 if (!p)
1938 return NULL;
1939 p->kind = SetComp_kind;
1940 p->v.SetComp.elt = elt;
1941 p->v.SetComp.generators = generators;
1942 p->lineno = lineno;
1943 p->col_offset = col_offset;
1944 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001945}
1946
1947expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001948DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1949 col_offset, PyArena *arena)
1950{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001951 expr_ty p;
1952 if (!key) {
1953 PyErr_SetString(PyExc_ValueError,
1954 "field key is required for DictComp");
1955 return NULL;
1956 }
1957 if (!value) {
1958 PyErr_SetString(PyExc_ValueError,
1959 "field value is required for DictComp");
1960 return NULL;
1961 }
1962 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1963 if (!p)
1964 return NULL;
1965 p->kind = DictComp_kind;
1966 p->v.DictComp.key = key;
1967 p->v.DictComp.value = value;
1968 p->v.DictComp.generators = generators;
1969 p->lineno = lineno;
1970 p->col_offset = col_offset;
1971 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001972}
1973
1974expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001975GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1976 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001978 expr_ty p;
1979 if (!elt) {
1980 PyErr_SetString(PyExc_ValueError,
1981 "field elt is required for GeneratorExp");
1982 return NULL;
1983 }
1984 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1985 if (!p)
1986 return NULL;
1987 p->kind = GeneratorExp_kind;
1988 p->v.GeneratorExp.elt = elt;
1989 p->v.GeneratorExp.generators = generators;
1990 p->lineno = lineno;
1991 p->col_offset = col_offset;
1992 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993}
1994
1995expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001996Await(expr_ty value, int lineno, int col_offset, PyArena *arena)
1997{
1998 expr_ty p;
1999 if (!value) {
2000 PyErr_SetString(PyExc_ValueError,
2001 "field value is required for Await");
2002 return NULL;
2003 }
2004 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2005 if (!p)
2006 return NULL;
2007 p->kind = Await_kind;
2008 p->v.Await.value = value;
2009 p->lineno = lineno;
2010 p->col_offset = col_offset;
2011 return p;
2012}
2013
2014expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002015Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002017 expr_ty p;
2018 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2019 if (!p)
2020 return NULL;
2021 p->kind = Yield_kind;
2022 p->v.Yield.value = value;
2023 p->lineno = lineno;
2024 p->col_offset = col_offset;
2025 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026}
2027
2028expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002029YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena)
2030{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002031 expr_ty p;
2032 if (!value) {
2033 PyErr_SetString(PyExc_ValueError,
2034 "field value is required for YieldFrom");
2035 return NULL;
2036 }
2037 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2038 if (!p)
2039 return NULL;
2040 p->kind = YieldFrom_kind;
2041 p->v.YieldFrom.value = value;
2042 p->lineno = lineno;
2043 p->col_offset = col_offset;
2044 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002045}
2046
2047expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002048Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
2049 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002051 expr_ty p;
2052 if (!left) {
2053 PyErr_SetString(PyExc_ValueError,
2054 "field left is required for Compare");
2055 return NULL;
2056 }
2057 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2058 if (!p)
2059 return NULL;
2060 p->kind = Compare_kind;
2061 p->v.Compare.left = left;
2062 p->v.Compare.ops = ops;
2063 p->v.Compare.comparators = comparators;
2064 p->lineno = lineno;
2065 p->col_offset = col_offset;
2066 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067}
2068
2069expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002070Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
2071 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002073 expr_ty p;
2074 if (!func) {
2075 PyErr_SetString(PyExc_ValueError,
2076 "field func is required for Call");
2077 return NULL;
2078 }
2079 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2080 if (!p)
2081 return NULL;
2082 p->kind = Call_kind;
2083 p->v.Call.func = func;
2084 p->v.Call.args = args;
2085 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002086 p->lineno = lineno;
2087 p->col_offset = col_offset;
2088 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089}
2090
2091expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002092Num(object n, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002094 expr_ty p;
2095 if (!n) {
2096 PyErr_SetString(PyExc_ValueError,
2097 "field n is required for Num");
2098 return NULL;
2099 }
2100 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2101 if (!p)
2102 return NULL;
2103 p->kind = Num_kind;
2104 p->v.Num.n = n;
2105 p->lineno = lineno;
2106 p->col_offset = col_offset;
2107 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108}
2109
2110expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002111Str(string s, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002113 expr_ty p;
2114 if (!s) {
2115 PyErr_SetString(PyExc_ValueError,
2116 "field s is required for Str");
2117 return NULL;
2118 }
2119 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2120 if (!p)
2121 return NULL;
2122 p->kind = Str_kind;
2123 p->v.Str.s = s;
2124 p->lineno = lineno;
2125 p->col_offset = col_offset;
2126 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127}
2128
2129expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002130FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
2131 int col_offset, PyArena *arena)
2132{
2133 expr_ty p;
2134 if (!value) {
2135 PyErr_SetString(PyExc_ValueError,
2136 "field value is required for FormattedValue");
2137 return NULL;
2138 }
2139 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2140 if (!p)
2141 return NULL;
2142 p->kind = FormattedValue_kind;
2143 p->v.FormattedValue.value = value;
2144 p->v.FormattedValue.conversion = conversion;
2145 p->v.FormattedValue.format_spec = format_spec;
2146 p->lineno = lineno;
2147 p->col_offset = col_offset;
2148 return p;
2149}
2150
2151expr_ty
2152JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena *arena)
2153{
2154 expr_ty p;
2155 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2156 if (!p)
2157 return NULL;
2158 p->kind = JoinedStr_kind;
2159 p->v.JoinedStr.values = values;
2160 p->lineno = lineno;
2161 p->col_offset = col_offset;
2162 return p;
2163}
2164
2165expr_ty
Benjamin Petersone2498412011-08-09 16:08:39 -05002166Bytes(bytes s, int lineno, int col_offset, PyArena *arena)
Thomas Wouters00e41de2007-02-23 19:56:57 +00002167{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002168 expr_ty p;
2169 if (!s) {
2170 PyErr_SetString(PyExc_ValueError,
2171 "field s is required for Bytes");
2172 return NULL;
2173 }
2174 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2175 if (!p)
2176 return NULL;
2177 p->kind = Bytes_kind;
2178 p->v.Bytes.s = s;
2179 p->lineno = lineno;
2180 p->col_offset = col_offset;
2181 return p;
Thomas Wouters00e41de2007-02-23 19:56:57 +00002182}
2183
2184expr_ty
Benjamin Peterson442f2092012-12-06 17:41:04 -05002185NameConstant(singleton value, int lineno, int col_offset, PyArena *arena)
2186{
Victor Stinneree4b59c2013-07-27 00:01:35 +02002187 expr_ty p;
2188 if (!value) {
2189 PyErr_SetString(PyExc_ValueError,
2190 "field value is required for NameConstant");
2191 return NULL;
2192 }
2193 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2194 if (!p)
2195 return NULL;
2196 p->kind = NameConstant_kind;
2197 p->v.NameConstant.value = value;
2198 p->lineno = lineno;
2199 p->col_offset = col_offset;
2200 return p;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002201}
2202
2203expr_ty
Georg Brandl52318d62006-09-06 07:06:08 +00002204Ellipsis(int lineno, int col_offset, PyArena *arena)
2205{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002206 expr_ty p;
2207 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2208 if (!p)
2209 return NULL;
2210 p->kind = Ellipsis_kind;
2211 p->lineno = lineno;
2212 p->col_offset = col_offset;
2213 return p;
Georg Brandl52318d62006-09-06 07:06:08 +00002214}
2215
2216expr_ty
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002217Constant(constant value, int lineno, int col_offset, PyArena *arena)
2218{
2219 expr_ty p;
2220 if (!value) {
2221 PyErr_SetString(PyExc_ValueError,
2222 "field value is required for Constant");
2223 return NULL;
2224 }
2225 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2226 if (!p)
2227 return NULL;
2228 p->kind = Constant_kind;
2229 p->v.Constant.value = value;
2230 p->lineno = lineno;
2231 p->col_offset = col_offset;
2232 return p;
2233}
2234
2235expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002236Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
2237 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002239 expr_ty p;
2240 if (!value) {
2241 PyErr_SetString(PyExc_ValueError,
2242 "field value is required for Attribute");
2243 return NULL;
2244 }
2245 if (!attr) {
2246 PyErr_SetString(PyExc_ValueError,
2247 "field attr is required for Attribute");
2248 return NULL;
2249 }
2250 if (!ctx) {
2251 PyErr_SetString(PyExc_ValueError,
2252 "field ctx is required for Attribute");
2253 return NULL;
2254 }
2255 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2256 if (!p)
2257 return NULL;
2258 p->kind = Attribute_kind;
2259 p->v.Attribute.value = value;
2260 p->v.Attribute.attr = attr;
2261 p->v.Attribute.ctx = ctx;
2262 p->lineno = lineno;
2263 p->col_offset = col_offset;
2264 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265}
2266
2267expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002268Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
2269 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002271 expr_ty p;
2272 if (!value) {
2273 PyErr_SetString(PyExc_ValueError,
2274 "field value is required for Subscript");
2275 return NULL;
2276 }
2277 if (!slice) {
2278 PyErr_SetString(PyExc_ValueError,
2279 "field slice is required for Subscript");
2280 return NULL;
2281 }
2282 if (!ctx) {
2283 PyErr_SetString(PyExc_ValueError,
2284 "field ctx is required for Subscript");
2285 return NULL;
2286 }
2287 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2288 if (!p)
2289 return NULL;
2290 p->kind = Subscript_kind;
2291 p->v.Subscript.value = value;
2292 p->v.Subscript.slice = slice;
2293 p->v.Subscript.ctx = ctx;
2294 p->lineno = lineno;
2295 p->col_offset = col_offset;
2296 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297}
2298
2299expr_ty
Guido van Rossum0368b722007-05-11 16:50:42 +00002300Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
2301 *arena)
2302{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002303 expr_ty p;
2304 if (!value) {
2305 PyErr_SetString(PyExc_ValueError,
2306 "field value is required for Starred");
2307 return NULL;
2308 }
2309 if (!ctx) {
2310 PyErr_SetString(PyExc_ValueError,
2311 "field ctx is required for Starred");
2312 return NULL;
2313 }
2314 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2315 if (!p)
2316 return NULL;
2317 p->kind = Starred_kind;
2318 p->v.Starred.value = value;
2319 p->v.Starred.ctx = ctx;
2320 p->lineno = lineno;
2321 p->col_offset = col_offset;
2322 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002323}
2324
2325expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002326Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
2327 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002329 expr_ty p;
2330 if (!id) {
2331 PyErr_SetString(PyExc_ValueError,
2332 "field id is required for Name");
2333 return NULL;
2334 }
2335 if (!ctx) {
2336 PyErr_SetString(PyExc_ValueError,
2337 "field ctx is required for Name");
2338 return NULL;
2339 }
2340 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2341 if (!p)
2342 return NULL;
2343 p->kind = Name_kind;
2344 p->v.Name.id = id;
2345 p->v.Name.ctx = ctx;
2346 p->lineno = lineno;
2347 p->col_offset = col_offset;
2348 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349}
2350
2351expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002352List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2353 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002355 expr_ty p;
2356 if (!ctx) {
2357 PyErr_SetString(PyExc_ValueError,
2358 "field ctx is required for List");
2359 return NULL;
2360 }
2361 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2362 if (!p)
2363 return NULL;
2364 p->kind = List_kind;
2365 p->v.List.elts = elts;
2366 p->v.List.ctx = ctx;
2367 p->lineno = lineno;
2368 p->col_offset = col_offset;
2369 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370}
2371
2372expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002373Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2374 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002376 expr_ty p;
2377 if (!ctx) {
2378 PyErr_SetString(PyExc_ValueError,
2379 "field ctx is required for Tuple");
2380 return NULL;
2381 }
2382 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2383 if (!p)
2384 return NULL;
2385 p->kind = Tuple_kind;
2386 p->v.Tuple.elts = elts;
2387 p->v.Tuple.ctx = ctx;
2388 p->lineno = lineno;
2389 p->col_offset = col_offset;
2390 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391}
2392
2393slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002394Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002396 slice_ty p;
2397 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2398 if (!p)
2399 return NULL;
2400 p->kind = Slice_kind;
2401 p->v.Slice.lower = lower;
2402 p->v.Slice.upper = upper;
2403 p->v.Slice.step = step;
2404 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405}
2406
2407slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002408ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002410 slice_ty p;
2411 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2412 if (!p)
2413 return NULL;
2414 p->kind = ExtSlice_kind;
2415 p->v.ExtSlice.dims = dims;
2416 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417}
2418
2419slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002420Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002422 slice_ty p;
2423 if (!value) {
2424 PyErr_SetString(PyExc_ValueError,
2425 "field value is required for Index");
2426 return NULL;
2427 }
2428 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2429 if (!p)
2430 return NULL;
2431 p->kind = Index_kind;
2432 p->v.Index.value = value;
2433 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434}
2435
2436comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002437comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2438 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002440 comprehension_ty p;
2441 if (!target) {
2442 PyErr_SetString(PyExc_ValueError,
2443 "field target is required for comprehension");
2444 return NULL;
2445 }
2446 if (!iter) {
2447 PyErr_SetString(PyExc_ValueError,
2448 "field iter is required for comprehension");
2449 return NULL;
2450 }
2451 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2452 if (!p)
2453 return NULL;
2454 p->target = target;
2455 p->iter = iter;
2456 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002457 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002458 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459}
2460
2461excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002462ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002463 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002465 excepthandler_ty p;
2466 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2467 if (!p)
2468 return NULL;
2469 p->kind = ExceptHandler_kind;
2470 p->v.ExceptHandler.type = type;
2471 p->v.ExceptHandler.name = name;
2472 p->v.ExceptHandler.body = body;
2473 p->lineno = lineno;
2474 p->col_offset = col_offset;
2475 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002476}
2477
2478arguments_ty
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002479arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
2480 kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002482 arguments_ty p;
2483 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2484 if (!p)
2485 return NULL;
2486 p->args = args;
2487 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002488 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002489 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002490 p->kwarg = kwarg;
2491 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002492 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493}
2494
Neal Norwitzc1505362006-12-28 06:47:50 +00002495arg_ty
Victor Stinnerc106c682015-11-06 17:01:48 +01002496arg(identifier arg, expr_ty annotation, int lineno, int col_offset, PyArena
2497 *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002498{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002499 arg_ty p;
2500 if (!arg) {
2501 PyErr_SetString(PyExc_ValueError,
2502 "field arg is required for arg");
2503 return NULL;
2504 }
2505 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2506 if (!p)
2507 return NULL;
2508 p->arg = arg;
2509 p->annotation = annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01002510 p->lineno = lineno;
2511 p->col_offset = col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002512 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002513}
2514
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002516keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002518 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002519 if (!value) {
2520 PyErr_SetString(PyExc_ValueError,
2521 "field value is required for keyword");
2522 return NULL;
2523 }
2524 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2525 if (!p)
2526 return NULL;
2527 p->arg = arg;
2528 p->value = value;
2529 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530}
2531
2532alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002533alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002535 alias_ty p;
2536 if (!name) {
2537 PyErr_SetString(PyExc_ValueError,
2538 "field name is required for alias");
2539 return NULL;
2540 }
2541 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2542 if (!p)
2543 return NULL;
2544 p->name = name;
2545 p->asname = asname;
2546 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547}
2548
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002549withitem_ty
2550withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2551{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002552 withitem_ty p;
2553 if (!context_expr) {
2554 PyErr_SetString(PyExc_ValueError,
2555 "field context_expr is required for withitem");
2556 return NULL;
2557 }
2558 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2559 if (!p)
2560 return NULL;
2561 p->context_expr = context_expr;
2562 p->optional_vars = optional_vars;
2563 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002564}
2565
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002566
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002567PyObject*
2568ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002569{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002570 mod_ty o = (mod_ty)_o;
2571 PyObject *result = NULL, *value = NULL;
2572 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002573 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002574 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002575
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002576 switch (o->kind) {
2577 case Module_kind:
2578 result = PyType_GenericNew(Module_type, NULL, NULL);
2579 if (!result) goto failed;
2580 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2581 if (!value) goto failed;
2582 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2583 goto failed;
2584 Py_DECREF(value);
2585 break;
2586 case Interactive_kind:
2587 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2588 if (!result) goto failed;
2589 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2590 if (!value) goto failed;
2591 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2592 goto failed;
2593 Py_DECREF(value);
2594 break;
2595 case Expression_kind:
2596 result = PyType_GenericNew(Expression_type, NULL, NULL);
2597 if (!result) goto failed;
2598 value = ast2obj_expr(o->v.Expression.body);
2599 if (!value) goto failed;
2600 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2601 goto failed;
2602 Py_DECREF(value);
2603 break;
2604 case Suite_kind:
2605 result = PyType_GenericNew(Suite_type, NULL, NULL);
2606 if (!result) goto failed;
2607 value = ast2obj_list(o->v.Suite.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 }
2614 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002615failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002616 Py_XDECREF(value);
2617 Py_XDECREF(result);
2618 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619}
2620
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002621PyObject*
2622ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002624 stmt_ty o = (stmt_ty)_o;
2625 PyObject *result = NULL, *value = NULL;
2626 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002627 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002628 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002629
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002630 switch (o->kind) {
2631 case FunctionDef_kind:
2632 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2633 if (!result) goto failed;
2634 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002635 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002636 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2637 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002638 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002639 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002640 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002641 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2642 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002643 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002644 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2645 if (!value) goto failed;
2646 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2647 goto failed;
2648 Py_DECREF(value);
2649 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2650 if (!value) goto failed;
2651 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2652 goto failed;
2653 Py_DECREF(value);
2654 value = ast2obj_expr(o->v.FunctionDef.returns);
2655 if (!value) goto failed;
2656 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2657 goto failed;
2658 Py_DECREF(value);
2659 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002660 case AsyncFunctionDef_kind:
2661 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2662 if (!result) goto failed;
2663 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2664 if (!value) goto failed;
2665 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2666 goto failed;
2667 Py_DECREF(value);
2668 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2669 if (!value) goto failed;
2670 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2671 goto failed;
2672 Py_DECREF(value);
2673 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2674 if (!value) goto failed;
2675 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2676 goto failed;
2677 Py_DECREF(value);
2678 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2679 ast2obj_expr);
2680 if (!value) goto failed;
2681 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2682 goto failed;
2683 Py_DECREF(value);
2684 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2685 if (!value) goto failed;
2686 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2687 goto failed;
2688 Py_DECREF(value);
2689 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002690 case ClassDef_kind:
2691 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2692 if (!result) goto failed;
2693 value = ast2obj_identifier(o->v.ClassDef.name);
2694 if (!value) goto failed;
2695 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2696 goto failed;
2697 Py_DECREF(value);
2698 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2699 if (!value) goto failed;
2700 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2701 goto failed;
2702 Py_DECREF(value);
2703 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2704 if (!value) goto failed;
2705 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2706 goto failed;
2707 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002708 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2709 if (!value) goto failed;
2710 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2711 goto failed;
2712 Py_DECREF(value);
2713 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2714 if (!value) goto failed;
2715 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2716 goto failed;
2717 Py_DECREF(value);
2718 break;
2719 case Return_kind:
2720 result = PyType_GenericNew(Return_type, NULL, NULL);
2721 if (!result) goto failed;
2722 value = ast2obj_expr(o->v.Return.value);
2723 if (!value) goto failed;
2724 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2725 goto failed;
2726 Py_DECREF(value);
2727 break;
2728 case Delete_kind:
2729 result = PyType_GenericNew(Delete_type, NULL, NULL);
2730 if (!result) goto failed;
2731 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2732 if (!value) goto failed;
2733 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2734 goto failed;
2735 Py_DECREF(value);
2736 break;
2737 case Assign_kind:
2738 result = PyType_GenericNew(Assign_type, NULL, NULL);
2739 if (!result) goto failed;
2740 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2741 if (!value) goto failed;
2742 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2743 goto failed;
2744 Py_DECREF(value);
2745 value = ast2obj_expr(o->v.Assign.value);
2746 if (!value) goto failed;
2747 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2748 goto failed;
2749 Py_DECREF(value);
2750 break;
2751 case AugAssign_kind:
2752 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2753 if (!result) goto failed;
2754 value = ast2obj_expr(o->v.AugAssign.target);
2755 if (!value) goto failed;
2756 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2757 goto failed;
2758 Py_DECREF(value);
2759 value = ast2obj_operator(o->v.AugAssign.op);
2760 if (!value) goto failed;
2761 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2762 goto failed;
2763 Py_DECREF(value);
2764 value = ast2obj_expr(o->v.AugAssign.value);
2765 if (!value) goto failed;
2766 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2767 goto failed;
2768 Py_DECREF(value);
2769 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002770 case AnnAssign_kind:
2771 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2772 if (!result) goto failed;
2773 value = ast2obj_expr(o->v.AnnAssign.target);
2774 if (!value) goto failed;
2775 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2776 goto failed;
2777 Py_DECREF(value);
2778 value = ast2obj_expr(o->v.AnnAssign.annotation);
2779 if (!value) goto failed;
2780 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2781 goto failed;
2782 Py_DECREF(value);
2783 value = ast2obj_expr(o->v.AnnAssign.value);
2784 if (!value) goto failed;
2785 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2786 goto failed;
2787 Py_DECREF(value);
2788 value = ast2obj_int(o->v.AnnAssign.simple);
2789 if (!value) goto failed;
2790 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2791 goto failed;
2792 Py_DECREF(value);
2793 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002794 case For_kind:
2795 result = PyType_GenericNew(For_type, NULL, NULL);
2796 if (!result) goto failed;
2797 value = ast2obj_expr(o->v.For.target);
2798 if (!value) goto failed;
2799 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2800 goto failed;
2801 Py_DECREF(value);
2802 value = ast2obj_expr(o->v.For.iter);
2803 if (!value) goto failed;
2804 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2805 goto failed;
2806 Py_DECREF(value);
2807 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2808 if (!value) goto failed;
2809 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2810 goto failed;
2811 Py_DECREF(value);
2812 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2813 if (!value) goto failed;
2814 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2815 goto failed;
2816 Py_DECREF(value);
2817 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002818 case AsyncFor_kind:
2819 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2820 if (!result) goto failed;
2821 value = ast2obj_expr(o->v.AsyncFor.target);
2822 if (!value) goto failed;
2823 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2824 goto failed;
2825 Py_DECREF(value);
2826 value = ast2obj_expr(o->v.AsyncFor.iter);
2827 if (!value) goto failed;
2828 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2829 goto failed;
2830 Py_DECREF(value);
2831 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2832 if (!value) goto failed;
2833 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2834 goto failed;
2835 Py_DECREF(value);
2836 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2837 if (!value) goto failed;
2838 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2839 goto failed;
2840 Py_DECREF(value);
2841 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002842 case While_kind:
2843 result = PyType_GenericNew(While_type, NULL, NULL);
2844 if (!result) goto failed;
2845 value = ast2obj_expr(o->v.While.test);
2846 if (!value) goto failed;
2847 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2848 goto failed;
2849 Py_DECREF(value);
2850 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2851 if (!value) goto failed;
2852 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2853 goto failed;
2854 Py_DECREF(value);
2855 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2856 if (!value) goto failed;
2857 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2858 goto failed;
2859 Py_DECREF(value);
2860 break;
2861 case If_kind:
2862 result = PyType_GenericNew(If_type, NULL, NULL);
2863 if (!result) goto failed;
2864 value = ast2obj_expr(o->v.If.test);
2865 if (!value) goto failed;
2866 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2867 goto failed;
2868 Py_DECREF(value);
2869 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2870 if (!value) goto failed;
2871 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2872 goto failed;
2873 Py_DECREF(value);
2874 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2875 if (!value) goto failed;
2876 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2877 goto failed;
2878 Py_DECREF(value);
2879 break;
2880 case With_kind:
2881 result = PyType_GenericNew(With_type, NULL, NULL);
2882 if (!result) goto failed;
2883 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
2884 if (!value) goto failed;
2885 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2886 goto failed;
2887 Py_DECREF(value);
2888 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2889 if (!value) goto failed;
2890 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2891 goto failed;
2892 Py_DECREF(value);
2893 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002894 case AsyncWith_kind:
2895 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
2896 if (!result) goto failed;
2897 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
2898 if (!value) goto failed;
2899 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2900 goto failed;
2901 Py_DECREF(value);
2902 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
2903 if (!value) goto failed;
2904 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2905 goto failed;
2906 Py_DECREF(value);
2907 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002908 case Raise_kind:
2909 result = PyType_GenericNew(Raise_type, NULL, NULL);
2910 if (!result) goto failed;
2911 value = ast2obj_expr(o->v.Raise.exc);
2912 if (!value) goto failed;
2913 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
2914 goto failed;
2915 Py_DECREF(value);
2916 value = ast2obj_expr(o->v.Raise.cause);
2917 if (!value) goto failed;
2918 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
2919 goto failed;
2920 Py_DECREF(value);
2921 break;
2922 case Try_kind:
2923 result = PyType_GenericNew(Try_type, NULL, NULL);
2924 if (!result) goto failed;
2925 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
2926 if (!value) goto failed;
2927 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2928 goto failed;
2929 Py_DECREF(value);
2930 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
2931 if (!value) goto failed;
2932 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
2933 goto failed;
2934 Py_DECREF(value);
2935 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
2936 if (!value) goto failed;
2937 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2938 goto failed;
2939 Py_DECREF(value);
2940 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
2941 if (!value) goto failed;
2942 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
2943 goto failed;
2944 Py_DECREF(value);
2945 break;
2946 case Assert_kind:
2947 result = PyType_GenericNew(Assert_type, NULL, NULL);
2948 if (!result) goto failed;
2949 value = ast2obj_expr(o->v.Assert.test);
2950 if (!value) goto failed;
2951 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2952 goto failed;
2953 Py_DECREF(value);
2954 value = ast2obj_expr(o->v.Assert.msg);
2955 if (!value) goto failed;
2956 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
2957 goto failed;
2958 Py_DECREF(value);
2959 break;
2960 case Import_kind:
2961 result = PyType_GenericNew(Import_type, NULL, NULL);
2962 if (!result) goto failed;
2963 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2964 if (!value) goto failed;
2965 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2966 goto failed;
2967 Py_DECREF(value);
2968 break;
2969 case ImportFrom_kind:
2970 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
2971 if (!result) goto failed;
2972 value = ast2obj_identifier(o->v.ImportFrom.module);
2973 if (!value) goto failed;
2974 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
2975 goto failed;
2976 Py_DECREF(value);
2977 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
2978 if (!value) goto failed;
2979 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2980 goto failed;
2981 Py_DECREF(value);
2982 value = ast2obj_int(o->v.ImportFrom.level);
2983 if (!value) goto failed;
2984 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
2985 goto failed;
2986 Py_DECREF(value);
2987 break;
2988 case Global_kind:
2989 result = PyType_GenericNew(Global_type, NULL, NULL);
2990 if (!result) goto failed;
2991 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
2992 if (!value) goto failed;
2993 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2994 goto failed;
2995 Py_DECREF(value);
2996 break;
2997 case Nonlocal_kind:
2998 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
2999 if (!result) goto failed;
3000 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3001 if (!value) goto failed;
3002 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3003 goto failed;
3004 Py_DECREF(value);
3005 break;
3006 case Expr_kind:
3007 result = PyType_GenericNew(Expr_type, NULL, NULL);
3008 if (!result) goto failed;
3009 value = ast2obj_expr(o->v.Expr.value);
3010 if (!value) goto failed;
3011 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3012 goto failed;
3013 Py_DECREF(value);
3014 break;
3015 case Pass_kind:
3016 result = PyType_GenericNew(Pass_type, NULL, NULL);
3017 if (!result) goto failed;
3018 break;
3019 case Break_kind:
3020 result = PyType_GenericNew(Break_type, NULL, NULL);
3021 if (!result) goto failed;
3022 break;
3023 case Continue_kind:
3024 result = PyType_GenericNew(Continue_type, NULL, NULL);
3025 if (!result) goto failed;
3026 break;
3027 }
3028 value = ast2obj_int(o->lineno);
3029 if (!value) goto failed;
3030 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3031 goto failed;
3032 Py_DECREF(value);
3033 value = ast2obj_int(o->col_offset);
3034 if (!value) goto failed;
3035 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3036 goto failed;
3037 Py_DECREF(value);
3038 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003039failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003040 Py_XDECREF(value);
3041 Py_XDECREF(result);
3042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043}
3044
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003045PyObject*
3046ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003048 expr_ty o = (expr_ty)_o;
3049 PyObject *result = NULL, *value = NULL;
3050 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003051 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003052 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003053
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003054 switch (o->kind) {
3055 case BoolOp_kind:
3056 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3057 if (!result) goto failed;
3058 value = ast2obj_boolop(o->v.BoolOp.op);
3059 if (!value) goto failed;
3060 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3061 goto failed;
3062 Py_DECREF(value);
3063 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3064 if (!value) goto failed;
3065 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3066 goto failed;
3067 Py_DECREF(value);
3068 break;
3069 case BinOp_kind:
3070 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3071 if (!result) goto failed;
3072 value = ast2obj_expr(o->v.BinOp.left);
3073 if (!value) goto failed;
3074 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3075 goto failed;
3076 Py_DECREF(value);
3077 value = ast2obj_operator(o->v.BinOp.op);
3078 if (!value) goto failed;
3079 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3080 goto failed;
3081 Py_DECREF(value);
3082 value = ast2obj_expr(o->v.BinOp.right);
3083 if (!value) goto failed;
3084 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3085 goto failed;
3086 Py_DECREF(value);
3087 break;
3088 case UnaryOp_kind:
3089 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3090 if (!result) goto failed;
3091 value = ast2obj_unaryop(o->v.UnaryOp.op);
3092 if (!value) goto failed;
3093 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3094 goto failed;
3095 Py_DECREF(value);
3096 value = ast2obj_expr(o->v.UnaryOp.operand);
3097 if (!value) goto failed;
3098 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3099 goto failed;
3100 Py_DECREF(value);
3101 break;
3102 case Lambda_kind:
3103 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3104 if (!result) goto failed;
3105 value = ast2obj_arguments(o->v.Lambda.args);
3106 if (!value) goto failed;
3107 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3108 goto failed;
3109 Py_DECREF(value);
3110 value = ast2obj_expr(o->v.Lambda.body);
3111 if (!value) goto failed;
3112 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3113 goto failed;
3114 Py_DECREF(value);
3115 break;
3116 case IfExp_kind:
3117 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3118 if (!result) goto failed;
3119 value = ast2obj_expr(o->v.IfExp.test);
3120 if (!value) goto failed;
3121 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3122 goto failed;
3123 Py_DECREF(value);
3124 value = ast2obj_expr(o->v.IfExp.body);
3125 if (!value) goto failed;
3126 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3127 goto failed;
3128 Py_DECREF(value);
3129 value = ast2obj_expr(o->v.IfExp.orelse);
3130 if (!value) goto failed;
3131 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3132 goto failed;
3133 Py_DECREF(value);
3134 break;
3135 case Dict_kind:
3136 result = PyType_GenericNew(Dict_type, NULL, NULL);
3137 if (!result) goto failed;
3138 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3139 if (!value) goto failed;
3140 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3141 goto failed;
3142 Py_DECREF(value);
3143 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3144 if (!value) goto failed;
3145 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3146 goto failed;
3147 Py_DECREF(value);
3148 break;
3149 case Set_kind:
3150 result = PyType_GenericNew(Set_type, NULL, NULL);
3151 if (!result) goto failed;
3152 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3153 if (!value) goto failed;
3154 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3155 goto failed;
3156 Py_DECREF(value);
3157 break;
3158 case ListComp_kind:
3159 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3160 if (!result) goto failed;
3161 value = ast2obj_expr(o->v.ListComp.elt);
3162 if (!value) goto failed;
3163 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3164 goto failed;
3165 Py_DECREF(value);
3166 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3167 if (!value) goto failed;
3168 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3169 goto failed;
3170 Py_DECREF(value);
3171 break;
3172 case SetComp_kind:
3173 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3174 if (!result) goto failed;
3175 value = ast2obj_expr(o->v.SetComp.elt);
3176 if (!value) goto failed;
3177 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3178 goto failed;
3179 Py_DECREF(value);
3180 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3181 if (!value) goto failed;
3182 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3183 goto failed;
3184 Py_DECREF(value);
3185 break;
3186 case DictComp_kind:
3187 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3188 if (!result) goto failed;
3189 value = ast2obj_expr(o->v.DictComp.key);
3190 if (!value) goto failed;
3191 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3192 goto failed;
3193 Py_DECREF(value);
3194 value = ast2obj_expr(o->v.DictComp.value);
3195 if (!value) goto failed;
3196 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3197 goto failed;
3198 Py_DECREF(value);
3199 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3200 if (!value) goto failed;
3201 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3202 goto failed;
3203 Py_DECREF(value);
3204 break;
3205 case GeneratorExp_kind:
3206 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3207 if (!result) goto failed;
3208 value = ast2obj_expr(o->v.GeneratorExp.elt);
3209 if (!value) goto failed;
3210 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3211 goto failed;
3212 Py_DECREF(value);
3213 value = ast2obj_list(o->v.GeneratorExp.generators,
3214 ast2obj_comprehension);
3215 if (!value) goto failed;
3216 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3217 goto failed;
3218 Py_DECREF(value);
3219 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003220 case Await_kind:
3221 result = PyType_GenericNew(Await_type, NULL, NULL);
3222 if (!result) goto failed;
3223 value = ast2obj_expr(o->v.Await.value);
3224 if (!value) goto failed;
3225 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3226 goto failed;
3227 Py_DECREF(value);
3228 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003229 case Yield_kind:
3230 result = PyType_GenericNew(Yield_type, NULL, NULL);
3231 if (!result) goto failed;
3232 value = ast2obj_expr(o->v.Yield.value);
3233 if (!value) goto failed;
3234 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3235 goto failed;
3236 Py_DECREF(value);
3237 break;
3238 case YieldFrom_kind:
3239 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3240 if (!result) goto failed;
3241 value = ast2obj_expr(o->v.YieldFrom.value);
3242 if (!value) goto failed;
3243 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3244 goto failed;
3245 Py_DECREF(value);
3246 break;
3247 case Compare_kind:
3248 result = PyType_GenericNew(Compare_type, NULL, NULL);
3249 if (!result) goto failed;
3250 value = ast2obj_expr(o->v.Compare.left);
3251 if (!value) goto failed;
3252 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3253 goto failed;
3254 Py_DECREF(value);
3255 {
3256 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3257 value = PyList_New(n);
3258 if (!value) goto failed;
3259 for(i = 0; i < n; i++)
3260 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003261 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003262 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003263 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3264 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003265 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003266 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003267 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003268 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3269 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003270 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003271 break;
3272 case Call_kind:
3273 result = PyType_GenericNew(Call_type, NULL, NULL);
3274 if (!result) goto failed;
3275 value = ast2obj_expr(o->v.Call.func);
3276 if (!value) goto failed;
3277 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3278 goto failed;
3279 Py_DECREF(value);
3280 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3281 if (!value) goto failed;
3282 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3283 goto failed;
3284 Py_DECREF(value);
3285 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3286 if (!value) goto failed;
3287 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3288 goto failed;
3289 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003290 break;
3291 case Num_kind:
3292 result = PyType_GenericNew(Num_type, NULL, NULL);
3293 if (!result) goto failed;
3294 value = ast2obj_object(o->v.Num.n);
3295 if (!value) goto failed;
3296 if (_PyObject_SetAttrId(result, &PyId_n, value) == -1)
3297 goto failed;
3298 Py_DECREF(value);
3299 break;
3300 case Str_kind:
3301 result = PyType_GenericNew(Str_type, NULL, NULL);
3302 if (!result) goto failed;
3303 value = ast2obj_string(o->v.Str.s);
3304 if (!value) goto failed;
3305 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3306 goto failed;
3307 Py_DECREF(value);
3308 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003309 case FormattedValue_kind:
3310 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3311 if (!result) goto failed;
3312 value = ast2obj_expr(o->v.FormattedValue.value);
3313 if (!value) goto failed;
3314 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3315 goto failed;
3316 Py_DECREF(value);
3317 value = ast2obj_int(o->v.FormattedValue.conversion);
3318 if (!value) goto failed;
3319 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3320 goto failed;
3321 Py_DECREF(value);
3322 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3323 if (!value) goto failed;
3324 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3325 goto failed;
3326 Py_DECREF(value);
3327 break;
3328 case JoinedStr_kind:
3329 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3330 if (!result) goto failed;
3331 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3332 if (!value) goto failed;
3333 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3334 goto failed;
3335 Py_DECREF(value);
3336 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003337 case Bytes_kind:
3338 result = PyType_GenericNew(Bytes_type, NULL, NULL);
3339 if (!result) goto failed;
3340 value = ast2obj_bytes(o->v.Bytes.s);
3341 if (!value) goto failed;
3342 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3343 goto failed;
3344 Py_DECREF(value);
3345 break;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003346 case NameConstant_kind:
3347 result = PyType_GenericNew(NameConstant_type, NULL, NULL);
3348 if (!result) goto failed;
3349 value = ast2obj_singleton(o->v.NameConstant.value);
3350 if (!value) goto failed;
3351 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3352 goto failed;
3353 Py_DECREF(value);
3354 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003355 case Ellipsis_kind:
3356 result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
3357 if (!result) goto failed;
3358 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003359 case Constant_kind:
3360 result = PyType_GenericNew(Constant_type, NULL, NULL);
3361 if (!result) goto failed;
3362 value = ast2obj_constant(o->v.Constant.value);
3363 if (!value) goto failed;
3364 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3365 goto failed;
3366 Py_DECREF(value);
3367 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003368 case Attribute_kind:
3369 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3370 if (!result) goto failed;
3371 value = ast2obj_expr(o->v.Attribute.value);
3372 if (!value) goto failed;
3373 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3374 goto failed;
3375 Py_DECREF(value);
3376 value = ast2obj_identifier(o->v.Attribute.attr);
3377 if (!value) goto failed;
3378 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3379 goto failed;
3380 Py_DECREF(value);
3381 value = ast2obj_expr_context(o->v.Attribute.ctx);
3382 if (!value) goto failed;
3383 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3384 goto failed;
3385 Py_DECREF(value);
3386 break;
3387 case Subscript_kind:
3388 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3389 if (!result) goto failed;
3390 value = ast2obj_expr(o->v.Subscript.value);
3391 if (!value) goto failed;
3392 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3393 goto failed;
3394 Py_DECREF(value);
3395 value = ast2obj_slice(o->v.Subscript.slice);
3396 if (!value) goto failed;
3397 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3398 goto failed;
3399 Py_DECREF(value);
3400 value = ast2obj_expr_context(o->v.Subscript.ctx);
3401 if (!value) goto failed;
3402 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3403 goto failed;
3404 Py_DECREF(value);
3405 break;
3406 case Starred_kind:
3407 result = PyType_GenericNew(Starred_type, NULL, NULL);
3408 if (!result) goto failed;
3409 value = ast2obj_expr(o->v.Starred.value);
3410 if (!value) goto failed;
3411 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3412 goto failed;
3413 Py_DECREF(value);
3414 value = ast2obj_expr_context(o->v.Starred.ctx);
3415 if (!value) goto failed;
3416 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3417 goto failed;
3418 Py_DECREF(value);
3419 break;
3420 case Name_kind:
3421 result = PyType_GenericNew(Name_type, NULL, NULL);
3422 if (!result) goto failed;
3423 value = ast2obj_identifier(o->v.Name.id);
3424 if (!value) goto failed;
3425 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3426 goto failed;
3427 Py_DECREF(value);
3428 value = ast2obj_expr_context(o->v.Name.ctx);
3429 if (!value) goto failed;
3430 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3431 goto failed;
3432 Py_DECREF(value);
3433 break;
3434 case List_kind:
3435 result = PyType_GenericNew(List_type, NULL, NULL);
3436 if (!result) goto failed;
3437 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3438 if (!value) goto failed;
3439 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3440 goto failed;
3441 Py_DECREF(value);
3442 value = ast2obj_expr_context(o->v.List.ctx);
3443 if (!value) goto failed;
3444 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3445 goto failed;
3446 Py_DECREF(value);
3447 break;
3448 case Tuple_kind:
3449 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3450 if (!result) goto failed;
3451 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3452 if (!value) goto failed;
3453 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3454 goto failed;
3455 Py_DECREF(value);
3456 value = ast2obj_expr_context(o->v.Tuple.ctx);
3457 if (!value) goto failed;
3458 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3459 goto failed;
3460 Py_DECREF(value);
3461 break;
3462 }
3463 value = ast2obj_int(o->lineno);
3464 if (!value) goto failed;
3465 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3466 goto failed;
3467 Py_DECREF(value);
3468 value = ast2obj_int(o->col_offset);
3469 if (!value) goto failed;
3470 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3471 goto failed;
3472 Py_DECREF(value);
3473 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003474failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003475 Py_XDECREF(value);
3476 Py_XDECREF(result);
3477 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003478}
3479
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003480PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003481{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003482 switch(o) {
3483 case Load:
3484 Py_INCREF(Load_singleton);
3485 return Load_singleton;
3486 case Store:
3487 Py_INCREF(Store_singleton);
3488 return Store_singleton;
3489 case Del:
3490 Py_INCREF(Del_singleton);
3491 return Del_singleton;
3492 case AugLoad:
3493 Py_INCREF(AugLoad_singleton);
3494 return AugLoad_singleton;
3495 case AugStore:
3496 Py_INCREF(AugStore_singleton);
3497 return AugStore_singleton;
3498 case Param:
3499 Py_INCREF(Param_singleton);
3500 return Param_singleton;
3501 default:
3502 /* should never happen, but just in case ... */
3503 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3504 return NULL;
3505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003506}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003507PyObject*
3508ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003509{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003510 slice_ty o = (slice_ty)_o;
3511 PyObject *result = NULL, *value = NULL;
3512 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003513 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003514 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003515
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003516 switch (o->kind) {
3517 case Slice_kind:
3518 result = PyType_GenericNew(Slice_type, NULL, NULL);
3519 if (!result) goto failed;
3520 value = ast2obj_expr(o->v.Slice.lower);
3521 if (!value) goto failed;
3522 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3523 goto failed;
3524 Py_DECREF(value);
3525 value = ast2obj_expr(o->v.Slice.upper);
3526 if (!value) goto failed;
3527 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3528 goto failed;
3529 Py_DECREF(value);
3530 value = ast2obj_expr(o->v.Slice.step);
3531 if (!value) goto failed;
3532 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3533 goto failed;
3534 Py_DECREF(value);
3535 break;
3536 case ExtSlice_kind:
3537 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3538 if (!result) goto failed;
3539 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3540 if (!value) goto failed;
3541 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3542 goto failed;
3543 Py_DECREF(value);
3544 break;
3545 case Index_kind:
3546 result = PyType_GenericNew(Index_type, NULL, NULL);
3547 if (!result) goto failed;
3548 value = ast2obj_expr(o->v.Index.value);
3549 if (!value) goto failed;
3550 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3551 goto failed;
3552 Py_DECREF(value);
3553 break;
3554 }
3555 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003556failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003557 Py_XDECREF(value);
3558 Py_XDECREF(result);
3559 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003560}
3561
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003562PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003564 switch(o) {
3565 case And:
3566 Py_INCREF(And_singleton);
3567 return And_singleton;
3568 case Or:
3569 Py_INCREF(Or_singleton);
3570 return Or_singleton;
3571 default:
3572 /* should never happen, but just in case ... */
3573 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3574 return NULL;
3575 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003576}
3577PyObject* ast2obj_operator(operator_ty o)
3578{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003579 switch(o) {
3580 case Add:
3581 Py_INCREF(Add_singleton);
3582 return Add_singleton;
3583 case Sub:
3584 Py_INCREF(Sub_singleton);
3585 return Sub_singleton;
3586 case Mult:
3587 Py_INCREF(Mult_singleton);
3588 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003589 case MatMult:
3590 Py_INCREF(MatMult_singleton);
3591 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003592 case Div:
3593 Py_INCREF(Div_singleton);
3594 return Div_singleton;
3595 case Mod:
3596 Py_INCREF(Mod_singleton);
3597 return Mod_singleton;
3598 case Pow:
3599 Py_INCREF(Pow_singleton);
3600 return Pow_singleton;
3601 case LShift:
3602 Py_INCREF(LShift_singleton);
3603 return LShift_singleton;
3604 case RShift:
3605 Py_INCREF(RShift_singleton);
3606 return RShift_singleton;
3607 case BitOr:
3608 Py_INCREF(BitOr_singleton);
3609 return BitOr_singleton;
3610 case BitXor:
3611 Py_INCREF(BitXor_singleton);
3612 return BitXor_singleton;
3613 case BitAnd:
3614 Py_INCREF(BitAnd_singleton);
3615 return BitAnd_singleton;
3616 case FloorDiv:
3617 Py_INCREF(FloorDiv_singleton);
3618 return FloorDiv_singleton;
3619 default:
3620 /* should never happen, but just in case ... */
3621 PyErr_Format(PyExc_SystemError, "unknown operator found");
3622 return NULL;
3623 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003624}
3625PyObject* ast2obj_unaryop(unaryop_ty o)
3626{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003627 switch(o) {
3628 case Invert:
3629 Py_INCREF(Invert_singleton);
3630 return Invert_singleton;
3631 case Not:
3632 Py_INCREF(Not_singleton);
3633 return Not_singleton;
3634 case UAdd:
3635 Py_INCREF(UAdd_singleton);
3636 return UAdd_singleton;
3637 case USub:
3638 Py_INCREF(USub_singleton);
3639 return USub_singleton;
3640 default:
3641 /* should never happen, but just in case ... */
3642 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3643 return NULL;
3644 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003645}
3646PyObject* ast2obj_cmpop(cmpop_ty o)
3647{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003648 switch(o) {
3649 case Eq:
3650 Py_INCREF(Eq_singleton);
3651 return Eq_singleton;
3652 case NotEq:
3653 Py_INCREF(NotEq_singleton);
3654 return NotEq_singleton;
3655 case Lt:
3656 Py_INCREF(Lt_singleton);
3657 return Lt_singleton;
3658 case LtE:
3659 Py_INCREF(LtE_singleton);
3660 return LtE_singleton;
3661 case Gt:
3662 Py_INCREF(Gt_singleton);
3663 return Gt_singleton;
3664 case GtE:
3665 Py_INCREF(GtE_singleton);
3666 return GtE_singleton;
3667 case Is:
3668 Py_INCREF(Is_singleton);
3669 return Is_singleton;
3670 case IsNot:
3671 Py_INCREF(IsNot_singleton);
3672 return IsNot_singleton;
3673 case In:
3674 Py_INCREF(In_singleton);
3675 return In_singleton;
3676 case NotIn:
3677 Py_INCREF(NotIn_singleton);
3678 return NotIn_singleton;
3679 default:
3680 /* should never happen, but just in case ... */
3681 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3682 return NULL;
3683 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003684}
3685PyObject*
3686ast2obj_comprehension(void* _o)
3687{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003688 comprehension_ty o = (comprehension_ty)_o;
3689 PyObject *result = NULL, *value = NULL;
3690 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003691 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003692 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003693
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003694 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3695 if (!result) return NULL;
3696 value = ast2obj_expr(o->target);
3697 if (!value) goto failed;
3698 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3699 goto failed;
3700 Py_DECREF(value);
3701 value = ast2obj_expr(o->iter);
3702 if (!value) goto failed;
3703 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3704 goto failed;
3705 Py_DECREF(value);
3706 value = ast2obj_list(o->ifs, ast2obj_expr);
3707 if (!value) goto failed;
3708 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3709 goto failed;
3710 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003711 value = ast2obj_int(o->is_async);
3712 if (!value) goto failed;
3713 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3714 goto failed;
3715 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003716 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003717failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003718 Py_XDECREF(value);
3719 Py_XDECREF(result);
3720 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721}
3722
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003723PyObject*
3724ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003725{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003726 excepthandler_ty o = (excepthandler_ty)_o;
3727 PyObject *result = NULL, *value = NULL;
3728 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003729 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003730 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003731
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003732 switch (o->kind) {
3733 case ExceptHandler_kind:
3734 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3735 if (!result) goto failed;
3736 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003737 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003738 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3739 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003740 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003741 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003742 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003743 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3744 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003745 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003746 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3747 if (!value) goto failed;
3748 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3749 goto failed;
3750 Py_DECREF(value);
3751 break;
3752 }
3753 value = ast2obj_int(o->lineno);
3754 if (!value) goto failed;
3755 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3756 goto failed;
3757 Py_DECREF(value);
3758 value = ast2obj_int(o->col_offset);
3759 if (!value) goto failed;
3760 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3761 goto failed;
3762 Py_DECREF(value);
3763 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003764failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003765 Py_XDECREF(value);
3766 Py_XDECREF(result);
3767 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003768}
3769
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003770PyObject*
3771ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003772{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003773 arguments_ty o = (arguments_ty)_o;
3774 PyObject *result = NULL, *value = NULL;
3775 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003776 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003777 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003778
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003779 result = PyType_GenericNew(arguments_type, NULL, NULL);
3780 if (!result) return NULL;
3781 value = ast2obj_list(o->args, ast2obj_arg);
3782 if (!value) goto failed;
3783 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3784 goto failed;
3785 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003786 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003787 if (!value) goto failed;
3788 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3789 goto failed;
3790 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003791 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3792 if (!value) goto failed;
3793 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3794 goto failed;
3795 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003796 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003797 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003798 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003799 goto failed;
3800 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003801 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003802 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003803 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003804 goto failed;
3805 Py_DECREF(value);
3806 value = ast2obj_list(o->defaults, ast2obj_expr);
3807 if (!value) goto failed;
3808 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3809 goto failed;
3810 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003811 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003812failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003813 Py_XDECREF(value);
3814 Py_XDECREF(result);
3815 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003816}
3817
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003818PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003819ast2obj_arg(void* _o)
3820{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003821 arg_ty o = (arg_ty)_o;
3822 PyObject *result = NULL, *value = NULL;
3823 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003824 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003825 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003826
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003827 result = PyType_GenericNew(arg_type, NULL, NULL);
3828 if (!result) return NULL;
3829 value = ast2obj_identifier(o->arg);
3830 if (!value) goto failed;
3831 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3832 goto failed;
3833 Py_DECREF(value);
3834 value = ast2obj_expr(o->annotation);
3835 if (!value) goto failed;
3836 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
3837 goto failed;
3838 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003839 value = ast2obj_int(o->lineno);
3840 if (!value) goto failed;
3841 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3842 goto failed;
3843 Py_DECREF(value);
3844 value = ast2obj_int(o->col_offset);
3845 if (!value) goto failed;
3846 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3847 goto failed;
3848 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003849 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00003850failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003851 Py_XDECREF(value);
3852 Py_XDECREF(result);
3853 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003854}
3855
3856PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003857ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003859 keyword_ty o = (keyword_ty)_o;
3860 PyObject *result = NULL, *value = NULL;
3861 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003862 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003863 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003864
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003865 result = PyType_GenericNew(keyword_type, NULL, NULL);
3866 if (!result) return NULL;
3867 value = ast2obj_identifier(o->arg);
3868 if (!value) goto failed;
3869 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3870 goto failed;
3871 Py_DECREF(value);
3872 value = ast2obj_expr(o->value);
3873 if (!value) goto failed;
3874 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3875 goto failed;
3876 Py_DECREF(value);
3877 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003878failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003879 Py_XDECREF(value);
3880 Py_XDECREF(result);
3881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003882}
3883
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003884PyObject*
3885ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003886{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003887 alias_ty o = (alias_ty)_o;
3888 PyObject *result = NULL, *value = NULL;
3889 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003890 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003891 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003892
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003893 result = PyType_GenericNew(alias_type, NULL, NULL);
3894 if (!result) return NULL;
3895 value = ast2obj_identifier(o->name);
3896 if (!value) goto failed;
3897 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3898 goto failed;
3899 Py_DECREF(value);
3900 value = ast2obj_identifier(o->asname);
3901 if (!value) goto failed;
3902 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
3903 goto failed;
3904 Py_DECREF(value);
3905 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003906failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003907 Py_XDECREF(value);
3908 Py_XDECREF(result);
3909 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003910}
3911
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003912PyObject*
3913ast2obj_withitem(void* _o)
3914{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003915 withitem_ty o = (withitem_ty)_o;
3916 PyObject *result = NULL, *value = NULL;
3917 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003918 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003919 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003920
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003921 result = PyType_GenericNew(withitem_type, NULL, NULL);
3922 if (!result) return NULL;
3923 value = ast2obj_expr(o->context_expr);
3924 if (!value) goto failed;
3925 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
3926 goto failed;
3927 Py_DECREF(value);
3928 value = ast2obj_expr(o->optional_vars);
3929 if (!value) goto failed;
3930 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
3931 goto failed;
3932 Py_DECREF(value);
3933 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003934failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003935 Py_XDECREF(value);
3936 Py_XDECREF(result);
3937 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003938}
3939
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003940
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003941int
3942obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3943{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003944 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003945
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003946 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003947
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 if (obj == Py_None) {
3949 *out = NULL;
3950 return 0;
3951 }
3952 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3953 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003954 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003955 }
3956 if (isinstance) {
3957 asdl_seq* body;
3958
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003959 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
3960 return 1;
3961 }
3962 if (tmp == NULL) {
3963 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
3964 return 1;
3965 }
3966 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003967 int res;
3968 Py_ssize_t len;
3969 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003970 if (!PyList_Check(tmp)) {
3971 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3972 goto failed;
3973 }
3974 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003975 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003976 if (body == NULL) goto failed;
3977 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003978 stmt_ty val;
3979 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003980 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03003981 if (len != PyList_GET_SIZE(tmp)) {
3982 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
3983 goto failed;
3984 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003985 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003986 }
Victor Stinner1acc1292013-07-27 00:03:47 +02003987 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003988 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003989 *out = Module(body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003990 if (*out == NULL) goto failed;
3991 return 0;
3992 }
3993 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
3994 if (isinstance == -1) {
3995 return 1;
3996 }
3997 if (isinstance) {
3998 asdl_seq* body;
3999
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004000 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4001 return 1;
4002 }
4003 if (tmp == NULL) {
4004 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4005 return 1;
4006 }
4007 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004008 int res;
4009 Py_ssize_t len;
4010 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004011 if (!PyList_Check(tmp)) {
4012 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4013 goto failed;
4014 }
4015 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004016 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004017 if (body == NULL) goto failed;
4018 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004019 stmt_ty val;
4020 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004021 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004022 if (len != PyList_GET_SIZE(tmp)) {
4023 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4024 goto failed;
4025 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004026 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004027 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004028 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004029 }
4030 *out = Interactive(body, arena);
4031 if (*out == NULL) goto failed;
4032 return 0;
4033 }
4034 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4035 if (isinstance == -1) {
4036 return 1;
4037 }
4038 if (isinstance) {
4039 expr_ty body;
4040
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004041 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4042 return 1;
4043 }
4044 if (tmp == NULL) {
4045 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4046 return 1;
4047 }
4048 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004049 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004050 res = obj2ast_expr(tmp, &body, arena);
4051 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004052 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004053 }
4054 *out = Expression(body, arena);
4055 if (*out == NULL) goto failed;
4056 return 0;
4057 }
4058 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4059 if (isinstance == -1) {
4060 return 1;
4061 }
4062 if (isinstance) {
4063 asdl_seq* body;
4064
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004065 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4066 return 1;
4067 }
4068 if (tmp == NULL) {
4069 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4070 return 1;
4071 }
4072 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004073 int res;
4074 Py_ssize_t len;
4075 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004076 if (!PyList_Check(tmp)) {
4077 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4078 goto failed;
4079 }
4080 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004081 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 if (body == NULL) goto failed;
4083 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004084 stmt_ty val;
4085 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004086 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004087 if (len != PyList_GET_SIZE(tmp)) {
4088 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4089 goto failed;
4090 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004091 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004092 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004093 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004094 }
4095 *out = Suite(body, arena);
4096 if (*out == NULL) goto failed;
4097 return 0;
4098 }
4099
4100 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4101 failed:
4102 Py_XDECREF(tmp);
4103 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004104}
4105
4106int
4107obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4108{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004109 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004110
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004111 PyObject *tmp = NULL;
4112 int lineno;
4113 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004114
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004115 if (obj == Py_None) {
4116 *out = NULL;
4117 return 0;
4118 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004119 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4120 return 1;
4121 }
4122 if (tmp == NULL) {
4123 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4124 return 1;
4125 }
4126 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004127 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004128 res = obj2ast_int(tmp, &lineno, arena);
4129 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004130 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004131 }
4132 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004133 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004134 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004135 if (tmp == NULL) {
4136 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4137 return 1;
4138 }
4139 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004140 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004141 res = obj2ast_int(tmp, &col_offset, arena);
4142 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004143 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004144 }
4145 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4146 if (isinstance == -1) {
4147 return 1;
4148 }
4149 if (isinstance) {
4150 identifier name;
4151 arguments_ty args;
4152 asdl_seq* body;
4153 asdl_seq* decorator_list;
4154 expr_ty returns;
4155
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004156 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4157 return 1;
4158 }
4159 if (tmp == NULL) {
4160 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4161 return 1;
4162 }
4163 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004164 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004165 res = obj2ast_identifier(tmp, &name, arena);
4166 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004167 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004168 }
4169 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004170 return 1;
4171 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004172 if (tmp == NULL) {
4173 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4174 return 1;
4175 }
4176 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004177 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004178 res = obj2ast_arguments(tmp, &args, arena);
4179 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004180 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004181 }
4182 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004183 return 1;
4184 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004185 if (tmp == NULL) {
4186 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4187 return 1;
4188 }
4189 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004190 int res;
4191 Py_ssize_t len;
4192 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004193 if (!PyList_Check(tmp)) {
4194 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4195 goto failed;
4196 }
4197 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004198 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004199 if (body == NULL) goto failed;
4200 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004201 stmt_ty val;
4202 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004203 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004204 if (len != PyList_GET_SIZE(tmp)) {
4205 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4206 goto failed;
4207 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004208 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004209 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004210 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004211 }
4212 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004213 return 1;
4214 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004215 if (tmp == NULL) {
4216 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4217 return 1;
4218 }
4219 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004220 int res;
4221 Py_ssize_t len;
4222 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004223 if (!PyList_Check(tmp)) {
4224 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4225 goto failed;
4226 }
4227 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004228 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004229 if (decorator_list == NULL) goto failed;
4230 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004231 expr_ty val;
4232 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004233 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004234 if (len != PyList_GET_SIZE(tmp)) {
4235 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4236 goto failed;
4237 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004238 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004239 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004240 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004241 }
4242 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004243 return 1;
4244 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004245 if (tmp == NULL || tmp == Py_None) {
4246 Py_CLEAR(tmp);
4247 returns = NULL;
4248 }
4249 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004250 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004251 res = obj2ast_expr(tmp, &returns, arena);
4252 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004253 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004254 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03004255 *out = FunctionDef(name, args, body, decorator_list, returns, lineno,
4256 col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004257 if (*out == NULL) goto failed;
4258 return 0;
4259 }
Yury Selivanov75445082015-05-11 22:57:16 -04004260 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4261 if (isinstance == -1) {
4262 return 1;
4263 }
4264 if (isinstance) {
4265 identifier name;
4266 arguments_ty args;
4267 asdl_seq* body;
4268 asdl_seq* decorator_list;
4269 expr_ty returns;
4270
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004271 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4272 return 1;
4273 }
4274 if (tmp == NULL) {
4275 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4276 return 1;
4277 }
4278 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004279 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004280 res = obj2ast_identifier(tmp, &name, arena);
4281 if (res != 0) goto failed;
4282 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004283 }
4284 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004285 return 1;
4286 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004287 if (tmp == NULL) {
4288 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4289 return 1;
4290 }
4291 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004292 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004293 res = obj2ast_arguments(tmp, &args, arena);
4294 if (res != 0) goto failed;
4295 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004296 }
4297 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004298 return 1;
4299 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004300 if (tmp == NULL) {
4301 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4302 return 1;
4303 }
4304 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004305 int res;
4306 Py_ssize_t len;
4307 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004308 if (!PyList_Check(tmp)) {
4309 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4310 goto failed;
4311 }
4312 len = PyList_GET_SIZE(tmp);
4313 body = _Py_asdl_seq_new(len, arena);
4314 if (body == NULL) goto failed;
4315 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004316 stmt_ty val;
4317 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004318 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004319 if (len != PyList_GET_SIZE(tmp)) {
4320 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4321 goto failed;
4322 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004323 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004324 }
4325 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004326 }
4327 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004328 return 1;
4329 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004330 if (tmp == NULL) {
4331 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4332 return 1;
4333 }
4334 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004335 int res;
4336 Py_ssize_t len;
4337 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004338 if (!PyList_Check(tmp)) {
4339 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4340 goto failed;
4341 }
4342 len = PyList_GET_SIZE(tmp);
4343 decorator_list = _Py_asdl_seq_new(len, arena);
4344 if (decorator_list == NULL) goto failed;
4345 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004346 expr_ty val;
4347 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004348 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004349 if (len != PyList_GET_SIZE(tmp)) {
4350 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4351 goto failed;
4352 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004353 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004354 }
4355 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004356 }
4357 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004358 return 1;
4359 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004360 if (tmp == NULL || tmp == Py_None) {
4361 Py_CLEAR(tmp);
4362 returns = NULL;
4363 }
4364 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004365 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004366 res = obj2ast_expr(tmp, &returns, arena);
4367 if (res != 0) goto failed;
4368 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004369 }
4370 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03004371 lineno, col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004372 if (*out == NULL) goto failed;
4373 return 0;
4374 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004375 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4376 if (isinstance == -1) {
4377 return 1;
4378 }
4379 if (isinstance) {
4380 identifier name;
4381 asdl_seq* bases;
4382 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004383 asdl_seq* body;
4384 asdl_seq* decorator_list;
4385
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004386 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4387 return 1;
4388 }
4389 if (tmp == NULL) {
4390 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4391 return 1;
4392 }
4393 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004394 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004395 res = obj2ast_identifier(tmp, &name, arena);
4396 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004397 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004398 }
4399 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004400 return 1;
4401 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004402 if (tmp == NULL) {
4403 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4404 return 1;
4405 }
4406 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004407 int res;
4408 Py_ssize_t len;
4409 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004410 if (!PyList_Check(tmp)) {
4411 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4412 goto failed;
4413 }
4414 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004415 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004416 if (bases == 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);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004420 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004421 if (len != PyList_GET_SIZE(tmp)) {
4422 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4423 goto failed;
4424 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004425 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004426 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004427 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004428 }
4429 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004430 return 1;
4431 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004432 if (tmp == NULL) {
4433 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4434 return 1;
4435 }
4436 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004437 int res;
4438 Py_ssize_t len;
4439 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004440 if (!PyList_Check(tmp)) {
4441 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4442 goto failed;
4443 }
4444 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004445 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004446 if (keywords == NULL) goto failed;
4447 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004448 keyword_ty val;
4449 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004450 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004451 if (len != PyList_GET_SIZE(tmp)) {
4452 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4453 goto failed;
4454 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004455 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004456 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004457 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004458 }
4459 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004460 return 1;
4461 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004462 if (tmp == NULL) {
4463 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4464 return 1;
4465 }
4466 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004467 int res;
4468 Py_ssize_t len;
4469 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004470 if (!PyList_Check(tmp)) {
4471 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4472 goto failed;
4473 }
4474 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004475 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004476 if (body == NULL) goto failed;
4477 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004478 stmt_ty val;
4479 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004480 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004481 if (len != PyList_GET_SIZE(tmp)) {
4482 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4483 goto failed;
4484 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004485 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004486 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004487 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004488 }
4489 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004490 return 1;
4491 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004492 if (tmp == NULL) {
4493 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4494 return 1;
4495 }
4496 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004497 int res;
4498 Py_ssize_t len;
4499 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004500 if (!PyList_Check(tmp)) {
4501 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4502 goto failed;
4503 }
4504 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004505 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004506 if (decorator_list == NULL) goto failed;
4507 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004508 expr_ty val;
4509 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004510 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004511 if (len != PyList_GET_SIZE(tmp)) {
4512 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4513 goto failed;
4514 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004515 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004516 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004517 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004518 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03004519 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
4520 col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004521 if (*out == NULL) goto failed;
4522 return 0;
4523 }
4524 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4525 if (isinstance == -1) {
4526 return 1;
4527 }
4528 if (isinstance) {
4529 expr_ty value;
4530
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004531 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4532 return 1;
4533 }
4534 if (tmp == NULL || tmp == Py_None) {
4535 Py_CLEAR(tmp);
4536 value = NULL;
4537 }
4538 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004539 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004540 res = obj2ast_expr(tmp, &value, arena);
4541 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004542 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004543 }
4544 *out = Return(value, lineno, col_offset, arena);
4545 if (*out == NULL) goto failed;
4546 return 0;
4547 }
4548 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4549 if (isinstance == -1) {
4550 return 1;
4551 }
4552 if (isinstance) {
4553 asdl_seq* targets;
4554
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004555 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4556 return 1;
4557 }
4558 if (tmp == NULL) {
4559 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4560 return 1;
4561 }
4562 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004563 int res;
4564 Py_ssize_t len;
4565 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004566 if (!PyList_Check(tmp)) {
4567 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4568 goto failed;
4569 }
4570 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004571 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004572 if (targets == NULL) goto failed;
4573 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004574 expr_ty val;
4575 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004576 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004577 if (len != PyList_GET_SIZE(tmp)) {
4578 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4579 goto failed;
4580 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004581 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004582 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004583 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004584 }
4585 *out = Delete(targets, lineno, col_offset, arena);
4586 if (*out == NULL) goto failed;
4587 return 0;
4588 }
4589 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4590 if (isinstance == -1) {
4591 return 1;
4592 }
4593 if (isinstance) {
4594 asdl_seq* targets;
4595 expr_ty value;
4596
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004597 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4598 return 1;
4599 }
4600 if (tmp == NULL) {
4601 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4602 return 1;
4603 }
4604 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004605 int res;
4606 Py_ssize_t len;
4607 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004608 if (!PyList_Check(tmp)) {
4609 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4610 goto failed;
4611 }
4612 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004613 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004614 if (targets == NULL) goto failed;
4615 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004616 expr_ty val;
4617 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004618 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004619 if (len != PyList_GET_SIZE(tmp)) {
4620 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4621 goto failed;
4622 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004623 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004624 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004625 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004626 }
4627 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004628 return 1;
4629 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004630 if (tmp == NULL) {
4631 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4632 return 1;
4633 }
4634 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004635 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004636 res = obj2ast_expr(tmp, &value, arena);
4637 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004638 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004639 }
4640 *out = Assign(targets, value, lineno, col_offset, arena);
4641 if (*out == NULL) goto failed;
4642 return 0;
4643 }
4644 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
4645 if (isinstance == -1) {
4646 return 1;
4647 }
4648 if (isinstance) {
4649 expr_ty target;
4650 operator_ty op;
4651 expr_ty value;
4652
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004653 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4654 return 1;
4655 }
4656 if (tmp == NULL) {
4657 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
4658 return 1;
4659 }
4660 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004661 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004662 res = obj2ast_expr(tmp, &target, arena);
4663 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004664 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004665 }
4666 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004667 return 1;
4668 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004669 if (tmp == NULL) {
4670 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
4671 return 1;
4672 }
4673 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004674 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004675 res = obj2ast_operator(tmp, &op, arena);
4676 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004677 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004678 }
4679 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004680 return 1;
4681 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004682 if (tmp == NULL) {
4683 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
4684 return 1;
4685 }
4686 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004687 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004688 res = obj2ast_expr(tmp, &value, arena);
4689 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004690 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004691 }
4692 *out = AugAssign(target, op, value, lineno, col_offset, arena);
4693 if (*out == NULL) goto failed;
4694 return 0;
4695 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004696 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
4697 if (isinstance == -1) {
4698 return 1;
4699 }
4700 if (isinstance) {
4701 expr_ty target;
4702 expr_ty annotation;
4703 expr_ty value;
4704 int simple;
4705
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004706 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4707 return 1;
4708 }
4709 if (tmp == NULL) {
4710 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
4711 return 1;
4712 }
4713 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004714 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004715 res = obj2ast_expr(tmp, &target, arena);
4716 if (res != 0) goto failed;
4717 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004718 }
4719 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004720 return 1;
4721 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004722 if (tmp == NULL) {
4723 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
4724 return 1;
4725 }
4726 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004727 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004728 res = obj2ast_expr(tmp, &annotation, arena);
4729 if (res != 0) goto failed;
4730 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004731 }
4732 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004733 return 1;
4734 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004735 if (tmp == NULL || tmp == Py_None) {
4736 Py_CLEAR(tmp);
4737 value = NULL;
4738 }
4739 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004740 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004741 res = obj2ast_expr(tmp, &value, arena);
4742 if (res != 0) goto failed;
4743 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004744 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004745 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
4746 return 1;
4747 }
4748 if (tmp == NULL) {
4749 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
4750 return 1;
4751 }
4752 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004753 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004754 res = obj2ast_int(tmp, &simple, arena);
4755 if (res != 0) goto failed;
4756 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004757 }
4758 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
4759 arena);
4760 if (*out == NULL) goto failed;
4761 return 0;
4762 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004763 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
4764 if (isinstance == -1) {
4765 return 1;
4766 }
4767 if (isinstance) {
4768 expr_ty target;
4769 expr_ty iter;
4770 asdl_seq* body;
4771 asdl_seq* orelse;
4772
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004773 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4774 return 1;
4775 }
4776 if (tmp == NULL) {
4777 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4778 return 1;
4779 }
4780 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004781 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004782 res = obj2ast_expr(tmp, &target, arena);
4783 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004784 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004785 }
4786 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004787 return 1;
4788 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004789 if (tmp == NULL) {
4790 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4791 return 1;
4792 }
4793 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004794 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004795 res = obj2ast_expr(tmp, &iter, arena);
4796 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004797 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004798 }
4799 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004800 return 1;
4801 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004802 if (tmp == NULL) {
4803 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4804 return 1;
4805 }
4806 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004807 int res;
4808 Py_ssize_t len;
4809 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004810 if (!PyList_Check(tmp)) {
4811 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4812 goto failed;
4813 }
4814 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004815 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004816 if (body == NULL) goto failed;
4817 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004818 stmt_ty val;
4819 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004820 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004821 if (len != PyList_GET_SIZE(tmp)) {
4822 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
4823 goto failed;
4824 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004825 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004826 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004827 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004828 }
4829 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004830 return 1;
4831 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004832 if (tmp == NULL) {
4833 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4834 return 1;
4835 }
4836 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004837 int res;
4838 Py_ssize_t len;
4839 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004840 if (!PyList_Check(tmp)) {
4841 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4842 goto failed;
4843 }
4844 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004845 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004846 if (orelse == NULL) goto failed;
4847 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004848 stmt_ty val;
4849 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004850 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004851 if (len != PyList_GET_SIZE(tmp)) {
4852 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
4853 goto failed;
4854 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004855 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004856 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004857 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004858 }
4859 *out = For(target, iter, body, orelse, lineno, col_offset, arena);
4860 if (*out == NULL) goto failed;
4861 return 0;
4862 }
Yury Selivanov75445082015-05-11 22:57:16 -04004863 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
4864 if (isinstance == -1) {
4865 return 1;
4866 }
4867 if (isinstance) {
4868 expr_ty target;
4869 expr_ty iter;
4870 asdl_seq* body;
4871 asdl_seq* orelse;
4872
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004873 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4874 return 1;
4875 }
4876 if (tmp == NULL) {
4877 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
4878 return 1;
4879 }
4880 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004881 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004882 res = obj2ast_expr(tmp, &target, arena);
4883 if (res != 0) goto failed;
4884 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004885 }
4886 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004887 return 1;
4888 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004889 if (tmp == NULL) {
4890 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
4891 return 1;
4892 }
4893 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004894 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004895 res = obj2ast_expr(tmp, &iter, arena);
4896 if (res != 0) goto failed;
4897 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004898 }
4899 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004900 return 1;
4901 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004902 if (tmp == NULL) {
4903 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
4904 return 1;
4905 }
4906 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004907 int res;
4908 Py_ssize_t len;
4909 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004910 if (!PyList_Check(tmp)) {
4911 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4912 goto failed;
4913 }
4914 len = PyList_GET_SIZE(tmp);
4915 body = _Py_asdl_seq_new(len, arena);
4916 if (body == NULL) goto failed;
4917 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004918 stmt_ty val;
4919 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004920 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004921 if (len != PyList_GET_SIZE(tmp)) {
4922 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
4923 goto failed;
4924 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004925 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004926 }
4927 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004928 }
4929 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004930 return 1;
4931 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004932 if (tmp == NULL) {
4933 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
4934 return 1;
4935 }
4936 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004937 int res;
4938 Py_ssize_t len;
4939 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004940 if (!PyList_Check(tmp)) {
4941 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4942 goto failed;
4943 }
4944 len = PyList_GET_SIZE(tmp);
4945 orelse = _Py_asdl_seq_new(len, arena);
4946 if (orelse == NULL) goto failed;
4947 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004948 stmt_ty val;
4949 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004950 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004951 if (len != PyList_GET_SIZE(tmp)) {
4952 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
4953 goto failed;
4954 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004955 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004956 }
4957 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004958 }
4959 *out = AsyncFor(target, iter, body, orelse, lineno, col_offset, arena);
4960 if (*out == NULL) goto failed;
4961 return 0;
4962 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004963 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
4964 if (isinstance == -1) {
4965 return 1;
4966 }
4967 if (isinstance) {
4968 expr_ty test;
4969 asdl_seq* body;
4970 asdl_seq* orelse;
4971
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004972 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
4973 return 1;
4974 }
4975 if (tmp == NULL) {
4976 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
4977 return 1;
4978 }
4979 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004980 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004981 res = obj2ast_expr(tmp, &test, arena);
4982 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004983 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004984 }
4985 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004986 return 1;
4987 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004988 if (tmp == NULL) {
4989 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
4990 return 1;
4991 }
4992 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004993 int res;
4994 Py_ssize_t len;
4995 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004996 if (!PyList_Check(tmp)) {
4997 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4998 goto failed;
4999 }
5000 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005001 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005002 if (body == NULL) goto failed;
5003 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005004 stmt_ty val;
5005 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005006 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005007 if (len != PyList_GET_SIZE(tmp)) {
5008 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5009 goto failed;
5010 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005011 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005012 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005013 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005014 }
5015 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005016 return 1;
5017 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005018 if (tmp == NULL) {
5019 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5020 return 1;
5021 }
5022 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005023 int res;
5024 Py_ssize_t len;
5025 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005026 if (!PyList_Check(tmp)) {
5027 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5028 goto failed;
5029 }
5030 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005031 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005032 if (orelse == NULL) goto failed;
5033 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005034 stmt_ty val;
5035 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005036 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005037 if (len != PyList_GET_SIZE(tmp)) {
5038 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5039 goto failed;
5040 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005041 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005042 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005043 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005044 }
5045 *out = While(test, body, orelse, lineno, col_offset, arena);
5046 if (*out == NULL) goto failed;
5047 return 0;
5048 }
5049 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5050 if (isinstance == -1) {
5051 return 1;
5052 }
5053 if (isinstance) {
5054 expr_ty test;
5055 asdl_seq* body;
5056 asdl_seq* orelse;
5057
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005058 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5059 return 1;
5060 }
5061 if (tmp == NULL) {
5062 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5063 return 1;
5064 }
5065 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005066 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005067 res = obj2ast_expr(tmp, &test, arena);
5068 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005069 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005070 }
5071 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005072 return 1;
5073 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005074 if (tmp == NULL) {
5075 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5076 return 1;
5077 }
5078 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005079 int res;
5080 Py_ssize_t len;
5081 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005082 if (!PyList_Check(tmp)) {
5083 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5084 goto failed;
5085 }
5086 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005087 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005088 if (body == NULL) goto failed;
5089 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005090 stmt_ty val;
5091 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005092 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005093 if (len != PyList_GET_SIZE(tmp)) {
5094 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5095 goto failed;
5096 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005097 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005098 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005099 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005100 }
5101 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005102 return 1;
5103 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005104 if (tmp == NULL) {
5105 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5106 return 1;
5107 }
5108 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005109 int res;
5110 Py_ssize_t len;
5111 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005112 if (!PyList_Check(tmp)) {
5113 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5114 goto failed;
5115 }
5116 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005117 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005118 if (orelse == NULL) goto failed;
5119 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005120 stmt_ty val;
5121 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005122 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005123 if (len != PyList_GET_SIZE(tmp)) {
5124 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5125 goto failed;
5126 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005127 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005128 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005129 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005130 }
5131 *out = If(test, body, orelse, lineno, col_offset, arena);
5132 if (*out == NULL) goto failed;
5133 return 0;
5134 }
5135 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5136 if (isinstance == -1) {
5137 return 1;
5138 }
5139 if (isinstance) {
5140 asdl_seq* items;
5141 asdl_seq* body;
5142
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005143 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5144 return 1;
5145 }
5146 if (tmp == NULL) {
5147 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5148 return 1;
5149 }
5150 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005151 int res;
5152 Py_ssize_t len;
5153 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005154 if (!PyList_Check(tmp)) {
5155 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5156 goto failed;
5157 }
5158 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005159 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005160 if (items == NULL) goto failed;
5161 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005162 withitem_ty val;
5163 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005164 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005165 if (len != PyList_GET_SIZE(tmp)) {
5166 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5167 goto failed;
5168 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005169 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005170 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005171 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005172 }
5173 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005174 return 1;
5175 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005176 if (tmp == NULL) {
5177 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5178 return 1;
5179 }
5180 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005181 int res;
5182 Py_ssize_t len;
5183 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005184 if (!PyList_Check(tmp)) {
5185 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5186 goto failed;
5187 }
5188 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005189 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005190 if (body == NULL) goto failed;
5191 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005192 stmt_ty val;
5193 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005194 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005195 if (len != PyList_GET_SIZE(tmp)) {
5196 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5197 goto failed;
5198 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005199 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005200 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005201 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005202 }
5203 *out = With(items, body, lineno, col_offset, arena);
5204 if (*out == NULL) goto failed;
5205 return 0;
5206 }
Yury Selivanov75445082015-05-11 22:57:16 -04005207 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5208 if (isinstance == -1) {
5209 return 1;
5210 }
5211 if (isinstance) {
5212 asdl_seq* items;
5213 asdl_seq* body;
5214
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005215 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5216 return 1;
5217 }
5218 if (tmp == NULL) {
5219 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5220 return 1;
5221 }
5222 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005223 int res;
5224 Py_ssize_t len;
5225 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005226 if (!PyList_Check(tmp)) {
5227 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5228 goto failed;
5229 }
5230 len = PyList_GET_SIZE(tmp);
5231 items = _Py_asdl_seq_new(len, arena);
5232 if (items == NULL) goto failed;
5233 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005234 withitem_ty val;
5235 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005236 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005237 if (len != PyList_GET_SIZE(tmp)) {
5238 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5239 goto failed;
5240 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005241 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005242 }
5243 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005244 }
5245 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005246 return 1;
5247 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005248 if (tmp == NULL) {
5249 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5250 return 1;
5251 }
5252 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005253 int res;
5254 Py_ssize_t len;
5255 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005256 if (!PyList_Check(tmp)) {
5257 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5258 goto failed;
5259 }
5260 len = PyList_GET_SIZE(tmp);
5261 body = _Py_asdl_seq_new(len, arena);
5262 if (body == NULL) goto failed;
5263 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005264 stmt_ty val;
5265 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005266 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005267 if (len != PyList_GET_SIZE(tmp)) {
5268 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5269 goto failed;
5270 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005271 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005272 }
5273 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005274 }
5275 *out = AsyncWith(items, body, lineno, col_offset, arena);
5276 if (*out == NULL) goto failed;
5277 return 0;
5278 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005279 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5280 if (isinstance == -1) {
5281 return 1;
5282 }
5283 if (isinstance) {
5284 expr_ty exc;
5285 expr_ty cause;
5286
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005287 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5288 return 1;
5289 }
5290 if (tmp == NULL || tmp == Py_None) {
5291 Py_CLEAR(tmp);
5292 exc = NULL;
5293 }
5294 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005295 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005296 res = obj2ast_expr(tmp, &exc, arena);
5297 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005298 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005299 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005300 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5301 return 1;
5302 }
5303 if (tmp == NULL || tmp == Py_None) {
5304 Py_CLEAR(tmp);
5305 cause = NULL;
5306 }
5307 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005308 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005309 res = obj2ast_expr(tmp, &cause, arena);
5310 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005311 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005312 }
5313 *out = Raise(exc, cause, lineno, col_offset, arena);
5314 if (*out == NULL) goto failed;
5315 return 0;
5316 }
5317 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5318 if (isinstance == -1) {
5319 return 1;
5320 }
5321 if (isinstance) {
5322 asdl_seq* body;
5323 asdl_seq* handlers;
5324 asdl_seq* orelse;
5325 asdl_seq* finalbody;
5326
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005327 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5328 return 1;
5329 }
5330 if (tmp == NULL) {
5331 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5332 return 1;
5333 }
5334 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005335 int res;
5336 Py_ssize_t len;
5337 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005338 if (!PyList_Check(tmp)) {
5339 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5340 goto failed;
5341 }
5342 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005343 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005344 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);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005348 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005349 if (len != PyList_GET_SIZE(tmp)) {
5350 PyErr_SetString(PyExc_RuntimeError, "Try 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);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005354 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005355 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005356 }
5357 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005358 return 1;
5359 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005360 if (tmp == NULL) {
5361 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5362 return 1;
5363 }
5364 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005365 int res;
5366 Py_ssize_t len;
5367 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005368 if (!PyList_Check(tmp)) {
5369 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5370 goto failed;
5371 }
5372 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005373 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005374 if (handlers == NULL) goto failed;
5375 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005376 excepthandler_ty val;
5377 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005378 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005379 if (len != PyList_GET_SIZE(tmp)) {
5380 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5381 goto failed;
5382 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005383 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005384 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005385 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005386 }
5387 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005388 return 1;
5389 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005390 if (tmp == NULL) {
5391 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5392 return 1;
5393 }
5394 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005395 int res;
5396 Py_ssize_t len;
5397 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005398 if (!PyList_Check(tmp)) {
5399 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5400 goto failed;
5401 }
5402 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005403 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005404 if (orelse == NULL) goto failed;
5405 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005406 stmt_ty val;
5407 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005408 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005409 if (len != PyList_GET_SIZE(tmp)) {
5410 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5411 goto failed;
5412 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005413 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005414 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005415 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005416 }
5417 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005418 return 1;
5419 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005420 if (tmp == NULL) {
5421 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5422 return 1;
5423 }
5424 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005425 int res;
5426 Py_ssize_t len;
5427 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005428 if (!PyList_Check(tmp)) {
5429 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5430 goto failed;
5431 }
5432 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005433 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005434 if (finalbody == NULL) goto failed;
5435 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005436 stmt_ty val;
5437 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005438 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005439 if (len != PyList_GET_SIZE(tmp)) {
5440 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5441 goto failed;
5442 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005443 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005444 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005445 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005446 }
5447 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
5448 arena);
5449 if (*out == NULL) goto failed;
5450 return 0;
5451 }
5452 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5453 if (isinstance == -1) {
5454 return 1;
5455 }
5456 if (isinstance) {
5457 expr_ty test;
5458 expr_ty msg;
5459
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005460 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5461 return 1;
5462 }
5463 if (tmp == NULL) {
5464 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5465 return 1;
5466 }
5467 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005468 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005469 res = obj2ast_expr(tmp, &test, arena);
5470 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005471 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005472 }
5473 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005474 return 1;
5475 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005476 if (tmp == NULL || tmp == Py_None) {
5477 Py_CLEAR(tmp);
5478 msg = NULL;
5479 }
5480 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005481 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005482 res = obj2ast_expr(tmp, &msg, arena);
5483 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005484 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005485 }
5486 *out = Assert(test, msg, lineno, col_offset, arena);
5487 if (*out == NULL) goto failed;
5488 return 0;
5489 }
5490 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5491 if (isinstance == -1) {
5492 return 1;
5493 }
5494 if (isinstance) {
5495 asdl_seq* names;
5496
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005497 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5498 return 1;
5499 }
5500 if (tmp == NULL) {
5501 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5502 return 1;
5503 }
5504 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005505 int res;
5506 Py_ssize_t len;
5507 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005508 if (!PyList_Check(tmp)) {
5509 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5510 goto failed;
5511 }
5512 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005513 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005514 if (names == NULL) goto failed;
5515 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005516 alias_ty val;
5517 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005518 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005519 if (len != PyList_GET_SIZE(tmp)) {
5520 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5521 goto failed;
5522 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005523 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005524 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005525 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005526 }
5527 *out = Import(names, lineno, col_offset, arena);
5528 if (*out == NULL) goto failed;
5529 return 0;
5530 }
5531 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5532 if (isinstance == -1) {
5533 return 1;
5534 }
5535 if (isinstance) {
5536 identifier module;
5537 asdl_seq* names;
5538 int level;
5539
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005540 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5541 return 1;
5542 }
5543 if (tmp == NULL || tmp == Py_None) {
5544 Py_CLEAR(tmp);
5545 module = NULL;
5546 }
5547 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005548 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005549 res = obj2ast_identifier(tmp, &module, arena);
5550 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005551 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005552 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005553 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5554 return 1;
5555 }
5556 if (tmp == NULL) {
5557 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
5558 return 1;
5559 }
5560 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005561 int res;
5562 Py_ssize_t len;
5563 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005564 if (!PyList_Check(tmp)) {
5565 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5566 goto failed;
5567 }
5568 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005569 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005570 if (names == NULL) goto failed;
5571 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005572 alias_ty val;
5573 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005574 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005575 if (len != PyList_GET_SIZE(tmp)) {
5576 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
5577 goto failed;
5578 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005579 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005580 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005581 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005582 }
5583 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005584 return 1;
5585 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005586 if (tmp == NULL || tmp == Py_None) {
5587 Py_CLEAR(tmp);
5588 level = 0;
5589 }
5590 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005591 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005592 res = obj2ast_int(tmp, &level, arena);
5593 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005594 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005595 }
5596 *out = ImportFrom(module, names, level, lineno, col_offset, arena);
5597 if (*out == NULL) goto failed;
5598 return 0;
5599 }
5600 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
5601 if (isinstance == -1) {
5602 return 1;
5603 }
5604 if (isinstance) {
5605 asdl_seq* names;
5606
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005607 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5608 return 1;
5609 }
5610 if (tmp == NULL) {
5611 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
5612 return 1;
5613 }
5614 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005615 int res;
5616 Py_ssize_t len;
5617 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005618 if (!PyList_Check(tmp)) {
5619 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5620 goto failed;
5621 }
5622 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005623 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005624 if (names == NULL) goto failed;
5625 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005626 identifier val;
5627 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005628 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005629 if (len != PyList_GET_SIZE(tmp)) {
5630 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
5631 goto failed;
5632 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005633 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005634 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005635 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005636 }
5637 *out = Global(names, lineno, col_offset, arena);
5638 if (*out == NULL) goto failed;
5639 return 0;
5640 }
5641 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
5642 if (isinstance == -1) {
5643 return 1;
5644 }
5645 if (isinstance) {
5646 asdl_seq* names;
5647
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005648 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5649 return 1;
5650 }
5651 if (tmp == NULL) {
5652 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
5653 return 1;
5654 }
5655 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005656 int res;
5657 Py_ssize_t len;
5658 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005659 if (!PyList_Check(tmp)) {
5660 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5661 goto failed;
5662 }
5663 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005664 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005665 if (names == NULL) goto failed;
5666 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005667 identifier val;
5668 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005669 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005670 if (len != PyList_GET_SIZE(tmp)) {
5671 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
5672 goto failed;
5673 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005674 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005675 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005676 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005677 }
5678 *out = Nonlocal(names, lineno, col_offset, arena);
5679 if (*out == NULL) goto failed;
5680 return 0;
5681 }
5682 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
5683 if (isinstance == -1) {
5684 return 1;
5685 }
5686 if (isinstance) {
5687 expr_ty value;
5688
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005689 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
5690 return 1;
5691 }
5692 if (tmp == NULL) {
5693 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
5694 return 1;
5695 }
5696 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005697 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005698 res = obj2ast_expr(tmp, &value, arena);
5699 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005700 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005701 }
5702 *out = Expr(value, lineno, col_offset, arena);
5703 if (*out == NULL) goto failed;
5704 return 0;
5705 }
5706 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
5707 if (isinstance == -1) {
5708 return 1;
5709 }
5710 if (isinstance) {
5711
5712 *out = Pass(lineno, col_offset, arena);
5713 if (*out == NULL) goto failed;
5714 return 0;
5715 }
5716 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
5717 if (isinstance == -1) {
5718 return 1;
5719 }
5720 if (isinstance) {
5721
5722 *out = Break(lineno, col_offset, arena);
5723 if (*out == NULL) goto failed;
5724 return 0;
5725 }
5726 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
5727 if (isinstance == -1) {
5728 return 1;
5729 }
5730 if (isinstance) {
5731
5732 *out = Continue(lineno, col_offset, arena);
5733 if (*out == NULL) goto failed;
5734 return 0;
5735 }
5736
5737 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
5738 failed:
5739 Py_XDECREF(tmp);
5740 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005741}
5742
5743int
5744obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
5745{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005746 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005747
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005748 PyObject *tmp = NULL;
5749 int lineno;
5750 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005751
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005752 if (obj == Py_None) {
5753 *out = NULL;
5754 return 0;
5755 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005756 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
5757 return 1;
5758 }
5759 if (tmp == NULL) {
5760 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
5761 return 1;
5762 }
5763 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005764 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005765 res = obj2ast_int(tmp, &lineno, arena);
5766 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005767 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005768 }
5769 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005770 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005771 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005772 if (tmp == NULL) {
5773 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
5774 return 1;
5775 }
5776 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005777 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005778 res = obj2ast_int(tmp, &col_offset, arena);
5779 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005780 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005781 }
5782 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
5783 if (isinstance == -1) {
5784 return 1;
5785 }
5786 if (isinstance) {
5787 boolop_ty op;
5788 asdl_seq* values;
5789
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005790 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5791 return 1;
5792 }
5793 if (tmp == NULL) {
5794 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
5795 return 1;
5796 }
5797 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005798 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005799 res = obj2ast_boolop(tmp, &op, arena);
5800 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005801 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005802 }
5803 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005804 return 1;
5805 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005806 if (tmp == NULL) {
5807 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
5808 return 1;
5809 }
5810 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005811 int res;
5812 Py_ssize_t len;
5813 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005814 if (!PyList_Check(tmp)) {
5815 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5816 goto failed;
5817 }
5818 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005819 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005820 if (values == NULL) goto failed;
5821 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005822 expr_ty val;
5823 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005824 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005825 if (len != PyList_GET_SIZE(tmp)) {
5826 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
5827 goto failed;
5828 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005829 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005830 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005831 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005832 }
5833 *out = BoolOp(op, values, lineno, col_offset, arena);
5834 if (*out == NULL) goto failed;
5835 return 0;
5836 }
5837 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
5838 if (isinstance == -1) {
5839 return 1;
5840 }
5841 if (isinstance) {
5842 expr_ty left;
5843 operator_ty op;
5844 expr_ty right;
5845
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005846 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
5847 return 1;
5848 }
5849 if (tmp == NULL) {
5850 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
5851 return 1;
5852 }
5853 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005854 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005855 res = obj2ast_expr(tmp, &left, arena);
5856 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005857 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005858 }
5859 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005860 return 1;
5861 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005862 if (tmp == NULL) {
5863 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
5864 return 1;
5865 }
5866 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005867 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005868 res = obj2ast_operator(tmp, &op, arena);
5869 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005870 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005871 }
5872 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005873 return 1;
5874 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005875 if (tmp == NULL) {
5876 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
5877 return 1;
5878 }
5879 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005880 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005881 res = obj2ast_expr(tmp, &right, arena);
5882 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005883 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005884 }
5885 *out = BinOp(left, op, right, lineno, col_offset, arena);
5886 if (*out == NULL) goto failed;
5887 return 0;
5888 }
5889 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
5890 if (isinstance == -1) {
5891 return 1;
5892 }
5893 if (isinstance) {
5894 unaryop_ty op;
5895 expr_ty operand;
5896
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005897 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5898 return 1;
5899 }
5900 if (tmp == NULL) {
5901 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
5902 return 1;
5903 }
5904 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005905 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005906 res = obj2ast_unaryop(tmp, &op, arena);
5907 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005908 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005909 }
5910 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005911 return 1;
5912 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005913 if (tmp == NULL) {
5914 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
5915 return 1;
5916 }
5917 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005918 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005919 res = obj2ast_expr(tmp, &operand, arena);
5920 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005921 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005922 }
5923 *out = UnaryOp(op, operand, lineno, col_offset, arena);
5924 if (*out == NULL) goto failed;
5925 return 0;
5926 }
5927 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
5928 if (isinstance == -1) {
5929 return 1;
5930 }
5931 if (isinstance) {
5932 arguments_ty args;
5933 expr_ty body;
5934
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005935 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
5936 return 1;
5937 }
5938 if (tmp == NULL) {
5939 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
5940 return 1;
5941 }
5942 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005943 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005944 res = obj2ast_arguments(tmp, &args, arena);
5945 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005946 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005947 }
5948 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005949 return 1;
5950 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005951 if (tmp == NULL) {
5952 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
5953 return 1;
5954 }
5955 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005956 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005957 res = obj2ast_expr(tmp, &body, arena);
5958 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005959 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005960 }
5961 *out = Lambda(args, body, lineno, col_offset, arena);
5962 if (*out == NULL) goto failed;
5963 return 0;
5964 }
5965 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
5966 if (isinstance == -1) {
5967 return 1;
5968 }
5969 if (isinstance) {
5970 expr_ty test;
5971 expr_ty body;
5972 expr_ty orelse;
5973
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005974 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5975 return 1;
5976 }
5977 if (tmp == NULL) {
5978 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
5979 return 1;
5980 }
5981 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005982 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005983 res = obj2ast_expr(tmp, &test, arena);
5984 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005985 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005986 }
5987 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005988 return 1;
5989 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005990 if (tmp == NULL) {
5991 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
5992 return 1;
5993 }
5994 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005995 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005996 res = obj2ast_expr(tmp, &body, arena);
5997 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005998 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005999 }
6000 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006001 return 1;
6002 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006003 if (tmp == NULL) {
6004 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6005 return 1;
6006 }
6007 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006008 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006009 res = obj2ast_expr(tmp, &orelse, arena);
6010 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006011 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006012 }
6013 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
6014 if (*out == NULL) goto failed;
6015 return 0;
6016 }
6017 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6018 if (isinstance == -1) {
6019 return 1;
6020 }
6021 if (isinstance) {
6022 asdl_seq* keys;
6023 asdl_seq* values;
6024
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006025 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6026 return 1;
6027 }
6028 if (tmp == NULL) {
6029 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6030 return 1;
6031 }
6032 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006033 int res;
6034 Py_ssize_t len;
6035 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006036 if (!PyList_Check(tmp)) {
6037 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6038 goto failed;
6039 }
6040 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006041 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006042 if (keys == NULL) goto failed;
6043 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006044 expr_ty val;
6045 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006046 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006047 if (len != PyList_GET_SIZE(tmp)) {
6048 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6049 goto failed;
6050 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006051 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006052 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006053 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006054 }
6055 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006056 return 1;
6057 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006058 if (tmp == NULL) {
6059 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6060 return 1;
6061 }
6062 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006063 int res;
6064 Py_ssize_t len;
6065 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006066 if (!PyList_Check(tmp)) {
6067 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6068 goto failed;
6069 }
6070 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006071 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006072 if (values == NULL) goto failed;
6073 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006074 expr_ty val;
6075 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006076 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006077 if (len != PyList_GET_SIZE(tmp)) {
6078 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6079 goto failed;
6080 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006081 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006082 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006083 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006084 }
6085 *out = Dict(keys, values, lineno, col_offset, arena);
6086 if (*out == NULL) goto failed;
6087 return 0;
6088 }
6089 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6090 if (isinstance == -1) {
6091 return 1;
6092 }
6093 if (isinstance) {
6094 asdl_seq* elts;
6095
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006096 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6097 return 1;
6098 }
6099 if (tmp == NULL) {
6100 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6101 return 1;
6102 }
6103 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006104 int res;
6105 Py_ssize_t len;
6106 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006107 if (!PyList_Check(tmp)) {
6108 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6109 goto failed;
6110 }
6111 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006112 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006113 if (elts == NULL) goto failed;
6114 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006115 expr_ty val;
6116 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006117 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006118 if (len != PyList_GET_SIZE(tmp)) {
6119 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6120 goto failed;
6121 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006122 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006123 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006124 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006125 }
6126 *out = Set(elts, lineno, col_offset, arena);
6127 if (*out == NULL) goto failed;
6128 return 0;
6129 }
6130 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6131 if (isinstance == -1) {
6132 return 1;
6133 }
6134 if (isinstance) {
6135 expr_ty elt;
6136 asdl_seq* generators;
6137
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006138 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6139 return 1;
6140 }
6141 if (tmp == NULL) {
6142 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6143 return 1;
6144 }
6145 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006146 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006147 res = obj2ast_expr(tmp, &elt, arena);
6148 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006149 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006150 }
6151 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006152 return 1;
6153 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006154 if (tmp == NULL) {
6155 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6156 return 1;
6157 }
6158 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006159 int res;
6160 Py_ssize_t len;
6161 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006162 if (!PyList_Check(tmp)) {
6163 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6164 goto failed;
6165 }
6166 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006167 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006168 if (generators == NULL) goto failed;
6169 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006170 comprehension_ty val;
6171 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006172 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006173 if (len != PyList_GET_SIZE(tmp)) {
6174 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6175 goto failed;
6176 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006177 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006178 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006179 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006180 }
6181 *out = ListComp(elt, generators, lineno, col_offset, arena);
6182 if (*out == NULL) goto failed;
6183 return 0;
6184 }
6185 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6186 if (isinstance == -1) {
6187 return 1;
6188 }
6189 if (isinstance) {
6190 expr_ty elt;
6191 asdl_seq* generators;
6192
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006193 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6194 return 1;
6195 }
6196 if (tmp == NULL) {
6197 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6198 return 1;
6199 }
6200 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006201 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006202 res = obj2ast_expr(tmp, &elt, arena);
6203 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006204 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006205 }
6206 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006207 return 1;
6208 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006209 if (tmp == NULL) {
6210 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6211 return 1;
6212 }
6213 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006214 int res;
6215 Py_ssize_t len;
6216 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006217 if (!PyList_Check(tmp)) {
6218 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6219 goto failed;
6220 }
6221 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006222 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006223 if (generators == NULL) goto failed;
6224 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006225 comprehension_ty val;
6226 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006227 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006228 if (len != PyList_GET_SIZE(tmp)) {
6229 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6230 goto failed;
6231 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006232 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006233 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006234 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006235 }
6236 *out = SetComp(elt, generators, lineno, col_offset, arena);
6237 if (*out == NULL) goto failed;
6238 return 0;
6239 }
6240 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6241 if (isinstance == -1) {
6242 return 1;
6243 }
6244 if (isinstance) {
6245 expr_ty key;
6246 expr_ty value;
6247 asdl_seq* generators;
6248
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006249 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6250 return 1;
6251 }
6252 if (tmp == NULL) {
6253 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6254 return 1;
6255 }
6256 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006257 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006258 res = obj2ast_expr(tmp, &key, arena);
6259 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006260 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006261 }
6262 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006263 return 1;
6264 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006265 if (tmp == NULL) {
6266 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6267 return 1;
6268 }
6269 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006270 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006271 res = obj2ast_expr(tmp, &value, arena);
6272 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006273 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006274 }
6275 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006276 return 1;
6277 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006278 if (tmp == NULL) {
6279 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6280 return 1;
6281 }
6282 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006283 int res;
6284 Py_ssize_t len;
6285 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006286 if (!PyList_Check(tmp)) {
6287 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6288 goto failed;
6289 }
6290 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006291 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006292 if (generators == NULL) goto failed;
6293 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006294 comprehension_ty val;
6295 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006296 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006297 if (len != PyList_GET_SIZE(tmp)) {
6298 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6299 goto failed;
6300 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006301 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006302 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006303 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006304 }
6305 *out = DictComp(key, value, generators, lineno, col_offset, arena);
6306 if (*out == NULL) goto failed;
6307 return 0;
6308 }
6309 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6310 if (isinstance == -1) {
6311 return 1;
6312 }
6313 if (isinstance) {
6314 expr_ty elt;
6315 asdl_seq* generators;
6316
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006317 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6318 return 1;
6319 }
6320 if (tmp == NULL) {
6321 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6322 return 1;
6323 }
6324 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006325 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006326 res = obj2ast_expr(tmp, &elt, arena);
6327 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006328 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006329 }
6330 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006331 return 1;
6332 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006333 if (tmp == NULL) {
6334 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6335 return 1;
6336 }
6337 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006338 int res;
6339 Py_ssize_t len;
6340 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006341 if (!PyList_Check(tmp)) {
6342 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6343 goto failed;
6344 }
6345 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006346 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006347 if (generators == NULL) goto failed;
6348 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006349 comprehension_ty val;
6350 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006351 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006352 if (len != PyList_GET_SIZE(tmp)) {
6353 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6354 goto failed;
6355 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006356 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006357 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006358 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006359 }
6360 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
6361 if (*out == NULL) goto failed;
6362 return 0;
6363 }
Yury Selivanov75445082015-05-11 22:57:16 -04006364 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6365 if (isinstance == -1) {
6366 return 1;
6367 }
6368 if (isinstance) {
6369 expr_ty value;
6370
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006371 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6372 return 1;
6373 }
6374 if (tmp == NULL) {
6375 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6376 return 1;
6377 }
6378 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006379 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006380 res = obj2ast_expr(tmp, &value, arena);
6381 if (res != 0) goto failed;
6382 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006383 }
6384 *out = Await(value, lineno, col_offset, arena);
6385 if (*out == NULL) goto failed;
6386 return 0;
6387 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006388 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6389 if (isinstance == -1) {
6390 return 1;
6391 }
6392 if (isinstance) {
6393 expr_ty value;
6394
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006395 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6396 return 1;
6397 }
6398 if (tmp == NULL || tmp == Py_None) {
6399 Py_CLEAR(tmp);
6400 value = NULL;
6401 }
6402 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006403 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006404 res = obj2ast_expr(tmp, &value, arena);
6405 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006406 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006407 }
6408 *out = Yield(value, lineno, col_offset, arena);
6409 if (*out == NULL) goto failed;
6410 return 0;
6411 }
6412 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6413 if (isinstance == -1) {
6414 return 1;
6415 }
6416 if (isinstance) {
6417 expr_ty value;
6418
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006419 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6420 return 1;
6421 }
6422 if (tmp == NULL) {
6423 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6424 return 1;
6425 }
6426 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006427 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006428 res = obj2ast_expr(tmp, &value, arena);
6429 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006430 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006431 }
6432 *out = YieldFrom(value, lineno, col_offset, arena);
6433 if (*out == NULL) goto failed;
6434 return 0;
6435 }
6436 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6437 if (isinstance == -1) {
6438 return 1;
6439 }
6440 if (isinstance) {
6441 expr_ty left;
6442 asdl_int_seq* ops;
6443 asdl_seq* comparators;
6444
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006445 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6446 return 1;
6447 }
6448 if (tmp == NULL) {
6449 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6450 return 1;
6451 }
6452 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006453 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006454 res = obj2ast_expr(tmp, &left, arena);
6455 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006456 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006457 }
6458 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006459 return 1;
6460 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006461 if (tmp == NULL) {
6462 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6463 return 1;
6464 }
6465 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006466 int res;
6467 Py_ssize_t len;
6468 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006469 if (!PyList_Check(tmp)) {
6470 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6471 goto failed;
6472 }
6473 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006474 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006475 if (ops == NULL) goto failed;
6476 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006477 cmpop_ty val;
6478 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006479 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006480 if (len != PyList_GET_SIZE(tmp)) {
6481 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
6482 goto failed;
6483 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006484 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006485 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006486 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006487 }
6488 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006489 return 1;
6490 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006491 if (tmp == NULL) {
6492 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
6493 return 1;
6494 }
6495 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006496 int res;
6497 Py_ssize_t len;
6498 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006499 if (!PyList_Check(tmp)) {
6500 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6501 goto failed;
6502 }
6503 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006504 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006505 if (comparators == NULL) goto failed;
6506 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006507 expr_ty val;
6508 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006509 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006510 if (len != PyList_GET_SIZE(tmp)) {
6511 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
6512 goto failed;
6513 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006514 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006515 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006516 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006517 }
6518 *out = Compare(left, ops, comparators, lineno, col_offset, arena);
6519 if (*out == NULL) goto failed;
6520 return 0;
6521 }
6522 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
6523 if (isinstance == -1) {
6524 return 1;
6525 }
6526 if (isinstance) {
6527 expr_ty func;
6528 asdl_seq* args;
6529 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006530
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006531 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
6532 return 1;
6533 }
6534 if (tmp == NULL) {
6535 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
6536 return 1;
6537 }
6538 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006539 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006540 res = obj2ast_expr(tmp, &func, arena);
6541 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006542 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006543 }
6544 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006545 return 1;
6546 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006547 if (tmp == NULL) {
6548 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
6549 return 1;
6550 }
6551 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006552 int res;
6553 Py_ssize_t len;
6554 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006555 if (!PyList_Check(tmp)) {
6556 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6557 goto failed;
6558 }
6559 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006560 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006561 if (args == NULL) goto failed;
6562 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006563 expr_ty val;
6564 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006565 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006566 if (len != PyList_GET_SIZE(tmp)) {
6567 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
6568 goto failed;
6569 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006570 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006571 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006572 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006573 }
6574 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006575 return 1;
6576 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006577 if (tmp == NULL) {
6578 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
6579 return 1;
6580 }
6581 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006582 int res;
6583 Py_ssize_t len;
6584 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006585 if (!PyList_Check(tmp)) {
6586 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6587 goto failed;
6588 }
6589 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006590 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006591 if (keywords == NULL) goto failed;
6592 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006593 keyword_ty val;
6594 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006595 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006596 if (len != PyList_GET_SIZE(tmp)) {
6597 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
6598 goto failed;
6599 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006600 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006601 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006602 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006603 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04006604 *out = Call(func, args, keywords, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006605 if (*out == NULL) goto failed;
6606 return 0;
6607 }
6608 isinstance = PyObject_IsInstance(obj, (PyObject*)Num_type);
6609 if (isinstance == -1) {
6610 return 1;
6611 }
6612 if (isinstance) {
6613 object n;
6614
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006615 if (_PyObject_LookupAttrId(obj, &PyId_n, &tmp) < 0) {
6616 return 1;
6617 }
6618 if (tmp == NULL) {
6619 PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
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_object(tmp, &n, arena);
6625 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006626 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006627 }
6628 *out = Num(n, lineno, col_offset, arena);
6629 if (*out == NULL) goto failed;
6630 return 0;
6631 }
6632 isinstance = PyObject_IsInstance(obj, (PyObject*)Str_type);
6633 if (isinstance == -1) {
6634 return 1;
6635 }
6636 if (isinstance) {
6637 string s;
6638
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006639 if (_PyObject_LookupAttrId(obj, &PyId_s, &tmp) < 0) {
6640 return 1;
6641 }
6642 if (tmp == NULL) {
6643 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
6644 return 1;
6645 }
6646 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006647 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006648 res = obj2ast_string(tmp, &s, arena);
6649 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006650 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006651 }
6652 *out = Str(s, lineno, col_offset, arena);
6653 if (*out == NULL) goto failed;
6654 return 0;
6655 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006656 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
6657 if (isinstance == -1) {
6658 return 1;
6659 }
6660 if (isinstance) {
6661 expr_ty value;
6662 int conversion;
6663 expr_ty format_spec;
6664
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006665 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6666 return 1;
6667 }
6668 if (tmp == NULL) {
6669 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
6670 return 1;
6671 }
6672 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006673 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006674 res = obj2ast_expr(tmp, &value, arena);
6675 if (res != 0) goto failed;
6676 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006677 }
6678 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006679 return 1;
6680 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006681 if (tmp == NULL || tmp == Py_None) {
6682 Py_CLEAR(tmp);
6683 conversion = 0;
6684 }
6685 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006686 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006687 res = obj2ast_int(tmp, &conversion, arena);
6688 if (res != 0) goto failed;
6689 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006690 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006691 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
6692 return 1;
6693 }
6694 if (tmp == NULL || tmp == Py_None) {
6695 Py_CLEAR(tmp);
6696 format_spec = NULL;
6697 }
6698 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006699 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006700 res = obj2ast_expr(tmp, &format_spec, arena);
6701 if (res != 0) goto failed;
6702 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006703 }
6704 *out = FormattedValue(value, conversion, format_spec, lineno,
6705 col_offset, arena);
6706 if (*out == NULL) goto failed;
6707 return 0;
6708 }
6709 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
6710 if (isinstance == -1) {
6711 return 1;
6712 }
6713 if (isinstance) {
6714 asdl_seq* values;
6715
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006716 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
6717 return 1;
6718 }
6719 if (tmp == NULL) {
6720 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
6721 return 1;
6722 }
6723 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006724 int res;
6725 Py_ssize_t len;
6726 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006727 if (!PyList_Check(tmp)) {
6728 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6729 goto failed;
6730 }
6731 len = PyList_GET_SIZE(tmp);
6732 values = _Py_asdl_seq_new(len, arena);
6733 if (values == NULL) goto failed;
6734 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006735 expr_ty val;
6736 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006737 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03006738 if (len != PyList_GET_SIZE(tmp)) {
6739 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
6740 goto failed;
6741 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006742 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006743 }
6744 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006745 }
6746 *out = JoinedStr(values, lineno, col_offset, arena);
6747 if (*out == NULL) goto failed;
6748 return 0;
6749 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006750 isinstance = PyObject_IsInstance(obj, (PyObject*)Bytes_type);
6751 if (isinstance == -1) {
6752 return 1;
6753 }
6754 if (isinstance) {
6755 bytes s;
6756
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006757 if (_PyObject_LookupAttrId(obj, &PyId_s, &tmp) < 0) {
6758 return 1;
6759 }
6760 if (tmp == NULL) {
6761 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Bytes");
6762 return 1;
6763 }
6764 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006765 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006766 res = obj2ast_bytes(tmp, &s, arena);
6767 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006768 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006769 }
6770 *out = Bytes(s, lineno, col_offset, arena);
6771 if (*out == NULL) goto failed;
6772 return 0;
6773 }
Victor Stinneree4b59c2013-07-27 00:01:35 +02006774 isinstance = PyObject_IsInstance(obj, (PyObject*)NameConstant_type);
6775 if (isinstance == -1) {
6776 return 1;
6777 }
6778 if (isinstance) {
6779 singleton value;
6780
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006781 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6782 return 1;
6783 }
6784 if (tmp == NULL) {
6785 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NameConstant");
6786 return 1;
6787 }
6788 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02006789 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02006790 res = obj2ast_singleton(tmp, &value, arena);
6791 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02006792 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02006793 }
6794 *out = NameConstant(value, lineno, col_offset, arena);
6795 if (*out == NULL) goto failed;
6796 return 0;
6797 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006798 isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type);
6799 if (isinstance == -1) {
6800 return 1;
6801 }
6802 if (isinstance) {
6803
6804 *out = Ellipsis(lineno, col_offset, arena);
6805 if (*out == NULL) goto failed;
6806 return 0;
6807 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006808 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
6809 if (isinstance == -1) {
6810 return 1;
6811 }
6812 if (isinstance) {
6813 constant value;
6814
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006815 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6816 return 1;
6817 }
6818 if (tmp == NULL) {
6819 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
6820 return 1;
6821 }
6822 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006823 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006824 res = obj2ast_constant(tmp, &value, arena);
6825 if (res != 0) goto failed;
6826 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006827 }
6828 *out = Constant(value, lineno, col_offset, arena);
6829 if (*out == NULL) goto failed;
6830 return 0;
6831 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006832 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
6833 if (isinstance == -1) {
6834 return 1;
6835 }
6836 if (isinstance) {
6837 expr_ty value;
6838 identifier attr;
6839 expr_context_ty ctx;
6840
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006841 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6842 return 1;
6843 }
6844 if (tmp == NULL) {
6845 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
6846 return 1;
6847 }
6848 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006849 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006850 res = obj2ast_expr(tmp, &value, arena);
6851 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006852 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006853 }
6854 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006855 return 1;
6856 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006857 if (tmp == NULL) {
6858 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
6859 return 1;
6860 }
6861 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006862 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006863 res = obj2ast_identifier(tmp, &attr, arena);
6864 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006865 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006866 }
6867 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006868 return 1;
6869 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006870 if (tmp == NULL) {
6871 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
6872 return 1;
6873 }
6874 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006875 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006876 res = obj2ast_expr_context(tmp, &ctx, arena);
6877 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006878 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006879 }
6880 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
6881 if (*out == NULL) goto failed;
6882 return 0;
6883 }
6884 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
6885 if (isinstance == -1) {
6886 return 1;
6887 }
6888 if (isinstance) {
6889 expr_ty value;
6890 slice_ty slice;
6891 expr_context_ty ctx;
6892
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006893 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6894 return 1;
6895 }
6896 if (tmp == NULL) {
6897 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
6898 return 1;
6899 }
6900 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006901 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006902 res = obj2ast_expr(tmp, &value, arena);
6903 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006904 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006905 }
6906 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006907 return 1;
6908 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006909 if (tmp == NULL) {
6910 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
6911 return 1;
6912 }
6913 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006914 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006915 res = obj2ast_slice(tmp, &slice, arena);
6916 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006917 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006918 }
6919 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006920 return 1;
6921 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006922 if (tmp == NULL) {
6923 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
6924 return 1;
6925 }
6926 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006927 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006928 res = obj2ast_expr_context(tmp, &ctx, arena);
6929 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006930 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006931 }
6932 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
6933 if (*out == NULL) goto failed;
6934 return 0;
6935 }
6936 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
6937 if (isinstance == -1) {
6938 return 1;
6939 }
6940 if (isinstance) {
6941 expr_ty value;
6942 expr_context_ty ctx;
6943
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006944 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6945 return 1;
6946 }
6947 if (tmp == NULL) {
6948 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
6949 return 1;
6950 }
6951 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006952 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006953 res = obj2ast_expr(tmp, &value, arena);
6954 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006955 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006956 }
6957 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006958 return 1;
6959 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006960 if (tmp == NULL) {
6961 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
6962 return 1;
6963 }
6964 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006965 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006966 res = obj2ast_expr_context(tmp, &ctx, arena);
6967 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006968 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006969 }
6970 *out = Starred(value, ctx, lineno, col_offset, arena);
6971 if (*out == NULL) goto failed;
6972 return 0;
6973 }
6974 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
6975 if (isinstance == -1) {
6976 return 1;
6977 }
6978 if (isinstance) {
6979 identifier id;
6980 expr_context_ty ctx;
6981
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006982 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
6983 return 1;
6984 }
6985 if (tmp == NULL) {
6986 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
6987 return 1;
6988 }
6989 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006990 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006991 res = obj2ast_identifier(tmp, &id, arena);
6992 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006993 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006994 }
6995 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006996 return 1;
6997 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006998 if (tmp == NULL) {
6999 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
7000 return 1;
7001 }
7002 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007003 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007004 res = obj2ast_expr_context(tmp, &ctx, arena);
7005 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007006 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007007 }
7008 *out = Name(id, ctx, lineno, col_offset, arena);
7009 if (*out == NULL) goto failed;
7010 return 0;
7011 }
7012 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7013 if (isinstance == -1) {
7014 return 1;
7015 }
7016 if (isinstance) {
7017 asdl_seq* elts;
7018 expr_context_ty ctx;
7019
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007020 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7021 return 1;
7022 }
7023 if (tmp == NULL) {
7024 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7025 return 1;
7026 }
7027 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007028 int res;
7029 Py_ssize_t len;
7030 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007031 if (!PyList_Check(tmp)) {
7032 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7033 goto failed;
7034 }
7035 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007036 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007037 if (elts == NULL) goto failed;
7038 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007039 expr_ty val;
7040 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007041 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007042 if (len != PyList_GET_SIZE(tmp)) {
7043 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7044 goto failed;
7045 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007046 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007047 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007048 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007049 }
7050 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007051 return 1;
7052 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007053 if (tmp == NULL) {
7054 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7055 return 1;
7056 }
7057 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007058 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007059 res = obj2ast_expr_context(tmp, &ctx, arena);
7060 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007061 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007062 }
7063 *out = List(elts, ctx, lineno, col_offset, arena);
7064 if (*out == NULL) goto failed;
7065 return 0;
7066 }
7067 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7068 if (isinstance == -1) {
7069 return 1;
7070 }
7071 if (isinstance) {
7072 asdl_seq* elts;
7073 expr_context_ty ctx;
7074
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007075 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7076 return 1;
7077 }
7078 if (tmp == NULL) {
7079 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7080 return 1;
7081 }
7082 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007083 int res;
7084 Py_ssize_t len;
7085 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007086 if (!PyList_Check(tmp)) {
7087 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7088 goto failed;
7089 }
7090 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007091 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007092 if (elts == NULL) goto failed;
7093 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007094 expr_ty val;
7095 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007096 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007097 if (len != PyList_GET_SIZE(tmp)) {
7098 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7099 goto failed;
7100 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007101 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007102 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007103 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007104 }
7105 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007106 return 1;
7107 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007108 if (tmp == NULL) {
7109 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7110 return 1;
7111 }
7112 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007113 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007114 res = obj2ast_expr_context(tmp, &ctx, arena);
7115 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007116 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007117 }
7118 *out = Tuple(elts, ctx, lineno, col_offset, arena);
7119 if (*out == NULL) goto failed;
7120 return 0;
7121 }
7122
7123 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7124 failed:
7125 Py_XDECREF(tmp);
7126 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007127}
7128
7129int
7130obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7131{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007132 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007133
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007134 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7135 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007136 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007137 }
7138 if (isinstance) {
7139 *out = Load;
7140 return 0;
7141 }
7142 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7143 if (isinstance == -1) {
7144 return 1;
7145 }
7146 if (isinstance) {
7147 *out = Store;
7148 return 0;
7149 }
7150 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7151 if (isinstance == -1) {
7152 return 1;
7153 }
7154 if (isinstance) {
7155 *out = Del;
7156 return 0;
7157 }
7158 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7159 if (isinstance == -1) {
7160 return 1;
7161 }
7162 if (isinstance) {
7163 *out = AugLoad;
7164 return 0;
7165 }
7166 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7167 if (isinstance == -1) {
7168 return 1;
7169 }
7170 if (isinstance) {
7171 *out = AugStore;
7172 return 0;
7173 }
7174 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7175 if (isinstance == -1) {
7176 return 1;
7177 }
7178 if (isinstance) {
7179 *out = Param;
7180 return 0;
7181 }
7182
7183 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7184 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007185}
7186
7187int
7188obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7189{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007190 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007191
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007192 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007193
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007194 if (obj == Py_None) {
7195 *out = NULL;
7196 return 0;
7197 }
7198 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7199 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007200 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007201 }
7202 if (isinstance) {
7203 expr_ty lower;
7204 expr_ty upper;
7205 expr_ty step;
7206
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007207 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7208 return 1;
7209 }
7210 if (tmp == NULL || tmp == Py_None) {
7211 Py_CLEAR(tmp);
7212 lower = NULL;
7213 }
7214 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007215 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007216 res = obj2ast_expr(tmp, &lower, arena);
7217 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007218 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007219 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007220 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7221 return 1;
7222 }
7223 if (tmp == NULL || tmp == Py_None) {
7224 Py_CLEAR(tmp);
7225 upper = NULL;
7226 }
7227 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007228 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007229 res = obj2ast_expr(tmp, &upper, arena);
7230 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007231 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007232 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007233 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
7234 return 1;
7235 }
7236 if (tmp == NULL || tmp == Py_None) {
7237 Py_CLEAR(tmp);
7238 step = NULL;
7239 }
7240 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007241 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007242 res = obj2ast_expr(tmp, &step, arena);
7243 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007244 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007245 }
7246 *out = Slice(lower, upper, step, arena);
7247 if (*out == NULL) goto failed;
7248 return 0;
7249 }
7250 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7251 if (isinstance == -1) {
7252 return 1;
7253 }
7254 if (isinstance) {
7255 asdl_seq* dims;
7256
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007257 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7258 return 1;
7259 }
7260 if (tmp == NULL) {
7261 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7262 return 1;
7263 }
7264 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007265 int res;
7266 Py_ssize_t len;
7267 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007268 if (!PyList_Check(tmp)) {
7269 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7270 goto failed;
7271 }
7272 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007273 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007274 if (dims == NULL) goto failed;
7275 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007276 slice_ty val;
7277 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007278 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007279 if (len != PyList_GET_SIZE(tmp)) {
7280 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7281 goto failed;
7282 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007283 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007284 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007285 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007286 }
7287 *out = ExtSlice(dims, arena);
7288 if (*out == NULL) goto failed;
7289 return 0;
7290 }
7291 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7292 if (isinstance == -1) {
7293 return 1;
7294 }
7295 if (isinstance) {
7296 expr_ty value;
7297
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007298 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7299 return 1;
7300 }
7301 if (tmp == NULL) {
7302 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7303 return 1;
7304 }
7305 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007306 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007307 res = obj2ast_expr(tmp, &value, arena);
7308 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007309 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007310 }
7311 *out = Index(value, arena);
7312 if (*out == NULL) goto failed;
7313 return 0;
7314 }
7315
7316 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7317 failed:
7318 Py_XDECREF(tmp);
7319 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007320}
7321
7322int
7323obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7324{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007325 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007326
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007327 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7328 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007329 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007330 }
7331 if (isinstance) {
7332 *out = And;
7333 return 0;
7334 }
7335 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7336 if (isinstance == -1) {
7337 return 1;
7338 }
7339 if (isinstance) {
7340 *out = Or;
7341 return 0;
7342 }
7343
7344 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7345 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007346}
7347
7348int
7349obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7350{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007351 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007352
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007353 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7354 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007355 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007356 }
7357 if (isinstance) {
7358 *out = Add;
7359 return 0;
7360 }
7361 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7362 if (isinstance == -1) {
7363 return 1;
7364 }
7365 if (isinstance) {
7366 *out = Sub;
7367 return 0;
7368 }
7369 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7370 if (isinstance == -1) {
7371 return 1;
7372 }
7373 if (isinstance) {
7374 *out = Mult;
7375 return 0;
7376 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007377 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7378 if (isinstance == -1) {
7379 return 1;
7380 }
7381 if (isinstance) {
7382 *out = MatMult;
7383 return 0;
7384 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007385 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7386 if (isinstance == -1) {
7387 return 1;
7388 }
7389 if (isinstance) {
7390 *out = Div;
7391 return 0;
7392 }
7393 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7394 if (isinstance == -1) {
7395 return 1;
7396 }
7397 if (isinstance) {
7398 *out = Mod;
7399 return 0;
7400 }
7401 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7402 if (isinstance == -1) {
7403 return 1;
7404 }
7405 if (isinstance) {
7406 *out = Pow;
7407 return 0;
7408 }
7409 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7410 if (isinstance == -1) {
7411 return 1;
7412 }
7413 if (isinstance) {
7414 *out = LShift;
7415 return 0;
7416 }
7417 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7418 if (isinstance == -1) {
7419 return 1;
7420 }
7421 if (isinstance) {
7422 *out = RShift;
7423 return 0;
7424 }
7425 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7426 if (isinstance == -1) {
7427 return 1;
7428 }
7429 if (isinstance) {
7430 *out = BitOr;
7431 return 0;
7432 }
7433 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7434 if (isinstance == -1) {
7435 return 1;
7436 }
7437 if (isinstance) {
7438 *out = BitXor;
7439 return 0;
7440 }
7441 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7442 if (isinstance == -1) {
7443 return 1;
7444 }
7445 if (isinstance) {
7446 *out = BitAnd;
7447 return 0;
7448 }
7449 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7450 if (isinstance == -1) {
7451 return 1;
7452 }
7453 if (isinstance) {
7454 *out = FloorDiv;
7455 return 0;
7456 }
7457
7458 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7459 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007460}
7461
7462int
7463obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7464{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007465 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007466
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007467 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7468 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007469 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007470 }
7471 if (isinstance) {
7472 *out = Invert;
7473 return 0;
7474 }
7475 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7476 if (isinstance == -1) {
7477 return 1;
7478 }
7479 if (isinstance) {
7480 *out = Not;
7481 return 0;
7482 }
7483 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7484 if (isinstance == -1) {
7485 return 1;
7486 }
7487 if (isinstance) {
7488 *out = UAdd;
7489 return 0;
7490 }
7491 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7492 if (isinstance == -1) {
7493 return 1;
7494 }
7495 if (isinstance) {
7496 *out = USub;
7497 return 0;
7498 }
7499
7500 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7501 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007502}
7503
7504int
7505obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7506{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007507 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007508
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007509 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7510 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007511 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007512 }
7513 if (isinstance) {
7514 *out = Eq;
7515 return 0;
7516 }
7517 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7518 if (isinstance == -1) {
7519 return 1;
7520 }
7521 if (isinstance) {
7522 *out = NotEq;
7523 return 0;
7524 }
7525 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7526 if (isinstance == -1) {
7527 return 1;
7528 }
7529 if (isinstance) {
7530 *out = Lt;
7531 return 0;
7532 }
7533 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7534 if (isinstance == -1) {
7535 return 1;
7536 }
7537 if (isinstance) {
7538 *out = LtE;
7539 return 0;
7540 }
7541 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7542 if (isinstance == -1) {
7543 return 1;
7544 }
7545 if (isinstance) {
7546 *out = Gt;
7547 return 0;
7548 }
7549 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
7550 if (isinstance == -1) {
7551 return 1;
7552 }
7553 if (isinstance) {
7554 *out = GtE;
7555 return 0;
7556 }
7557 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
7558 if (isinstance == -1) {
7559 return 1;
7560 }
7561 if (isinstance) {
7562 *out = Is;
7563 return 0;
7564 }
7565 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
7566 if (isinstance == -1) {
7567 return 1;
7568 }
7569 if (isinstance) {
7570 *out = IsNot;
7571 return 0;
7572 }
7573 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
7574 if (isinstance == -1) {
7575 return 1;
7576 }
7577 if (isinstance) {
7578 *out = In;
7579 return 0;
7580 }
7581 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
7582 if (isinstance == -1) {
7583 return 1;
7584 }
7585 if (isinstance) {
7586 *out = NotIn;
7587 return 0;
7588 }
7589
7590 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
7591 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007592}
7593
7594int
7595obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
7596{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007597 PyObject* tmp = NULL;
7598 expr_ty target;
7599 expr_ty iter;
7600 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007601 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007602
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007603 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
7604 return 1;
7605 }
7606 if (tmp == NULL) {
7607 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
7608 return 1;
7609 }
7610 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007611 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007612 res = obj2ast_expr(tmp, &target, arena);
7613 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007614 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007615 }
7616 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007617 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007618 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007619 if (tmp == NULL) {
7620 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
7621 return 1;
7622 }
7623 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007624 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007625 res = obj2ast_expr(tmp, &iter, arena);
7626 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007627 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007628 }
7629 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007630 return 1;
7631 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007632 if (tmp == NULL) {
7633 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
7634 return 1;
7635 }
7636 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007637 int res;
7638 Py_ssize_t len;
7639 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007640 if (!PyList_Check(tmp)) {
7641 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7642 goto failed;
7643 }
7644 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007645 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007646 if (ifs == NULL) goto failed;
7647 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007648 expr_ty val;
7649 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007650 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007651 if (len != PyList_GET_SIZE(tmp)) {
7652 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
7653 goto failed;
7654 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007655 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007656 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007657 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007658 }
7659 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007660 return 1;
7661 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007662 if (tmp == NULL) {
7663 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
7664 return 1;
7665 }
7666 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007667 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007668 res = obj2ast_int(tmp, &is_async, arena);
7669 if (res != 0) goto failed;
7670 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007671 }
7672 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007673 return 0;
7674failed:
7675 Py_XDECREF(tmp);
7676 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007677}
7678
7679int
7680obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
7681{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007682 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00007683
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007684 PyObject *tmp = NULL;
7685 int lineno;
7686 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007687
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007688 if (obj == Py_None) {
7689 *out = NULL;
7690 return 0;
7691 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007692 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7693 return 1;
7694 }
7695 if (tmp == NULL) {
7696 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
7697 return 1;
7698 }
7699 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007700 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007701 res = obj2ast_int(tmp, &lineno, arena);
7702 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007703 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007704 }
7705 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007706 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007707 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007708 if (tmp == NULL) {
7709 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
7710 return 1;
7711 }
7712 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007713 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007714 res = obj2ast_int(tmp, &col_offset, arena);
7715 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007716 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007717 }
7718 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
7719 if (isinstance == -1) {
7720 return 1;
7721 }
7722 if (isinstance) {
7723 expr_ty type;
7724 identifier name;
7725 asdl_seq* body;
7726
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007727 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
7728 return 1;
7729 }
7730 if (tmp == NULL || tmp == Py_None) {
7731 Py_CLEAR(tmp);
7732 type = NULL;
7733 }
7734 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007735 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007736 res = obj2ast_expr(tmp, &type, arena);
7737 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007738 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007739 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007740 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
7741 return 1;
7742 }
7743 if (tmp == NULL || tmp == Py_None) {
7744 Py_CLEAR(tmp);
7745 name = NULL;
7746 }
7747 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007748 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007749 res = obj2ast_identifier(tmp, &name, arena);
7750 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007751 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007752 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007753 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
7754 return 1;
7755 }
7756 if (tmp == NULL) {
7757 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
7758 return 1;
7759 }
7760 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007761 int res;
7762 Py_ssize_t len;
7763 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007764 if (!PyList_Check(tmp)) {
7765 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7766 goto failed;
7767 }
7768 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007769 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007770 if (body == NULL) goto failed;
7771 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007772 stmt_ty val;
7773 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007774 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007775 if (len != PyList_GET_SIZE(tmp)) {
7776 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
7777 goto failed;
7778 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007779 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007780 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007781 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007782 }
7783 *out = ExceptHandler(type, name, body, lineno, col_offset, arena);
7784 if (*out == NULL) goto failed;
7785 return 0;
7786 }
7787
7788 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
7789 failed:
7790 Py_XDECREF(tmp);
7791 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007792}
7793
7794int
7795obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
7796{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007797 PyObject* tmp = NULL;
7798 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007799 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007800 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007801 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007802 arg_ty kwarg;
7803 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007804
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007805 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
7806 return 1;
7807 }
7808 if (tmp == NULL) {
7809 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
7810 return 1;
7811 }
7812 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007813 int res;
7814 Py_ssize_t len;
7815 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007816 if (!PyList_Check(tmp)) {
7817 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7818 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007819 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007820 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007821 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007822 if (args == NULL) goto failed;
7823 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007824 arg_ty val;
7825 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007826 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007827 if (len != PyList_GET_SIZE(tmp)) {
7828 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
7829 goto failed;
7830 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007831 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007832 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007833 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007834 }
7835 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007836 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007837 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007838 if (tmp == NULL || tmp == Py_None) {
7839 Py_CLEAR(tmp);
7840 vararg = NULL;
7841 }
7842 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007843 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007844 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007845 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007846 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007847 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007848 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
7849 return 1;
7850 }
7851 if (tmp == NULL) {
7852 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
7853 return 1;
7854 }
7855 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007856 int res;
7857 Py_ssize_t len;
7858 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007859 if (!PyList_Check(tmp)) {
7860 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7861 goto failed;
7862 }
7863 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007864 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007865 if (kwonlyargs == NULL) goto failed;
7866 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007867 arg_ty val;
7868 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007869 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007870 if (len != PyList_GET_SIZE(tmp)) {
7871 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
7872 goto failed;
7873 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007874 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007875 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007876 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007877 }
7878 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007879 return 1;
7880 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007881 if (tmp == NULL) {
7882 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
7883 return 1;
7884 }
7885 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007886 int res;
7887 Py_ssize_t len;
7888 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007889 if (!PyList_Check(tmp)) {
7890 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7891 goto failed;
7892 }
7893 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007894 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007895 if (kw_defaults == NULL) goto failed;
7896 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007897 expr_ty val;
7898 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007899 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007900 if (len != PyList_GET_SIZE(tmp)) {
7901 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
7902 goto failed;
7903 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007904 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007905 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007906 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007907 }
7908 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007909 return 1;
7910 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007911 if (tmp == NULL || tmp == Py_None) {
7912 Py_CLEAR(tmp);
7913 kwarg = NULL;
7914 }
7915 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007916 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007917 res = obj2ast_arg(tmp, &kwarg, arena);
7918 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02007919 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007920 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007921 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
7922 return 1;
7923 }
7924 if (tmp == NULL) {
7925 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
7926 return 1;
7927 }
7928 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007929 int res;
7930 Py_ssize_t len;
7931 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007932 if (!PyList_Check(tmp)) {
7933 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7934 goto failed;
7935 }
7936 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007937 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007938 if (defaults == NULL) goto failed;
7939 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007940 expr_ty val;
7941 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007942 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007943 if (len != PyList_GET_SIZE(tmp)) {
7944 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
7945 goto failed;
7946 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007947 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007948 }
Victor Stinnerb3189902013-07-27 00:04:42 +02007949 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007950 }
7951 *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults,
7952 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007953 return 0;
7954failed:
7955 Py_XDECREF(tmp);
7956 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007957}
7958
7959int
7960obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
7961{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007962 PyObject* tmp = NULL;
7963 identifier arg;
7964 expr_ty annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01007965 int lineno;
7966 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007967
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007968 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
7969 return 1;
7970 }
7971 if (tmp == NULL) {
7972 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
7973 return 1;
7974 }
7975 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007976 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007977 res = obj2ast_identifier(tmp, &arg, arena);
7978 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007979 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007980 }
7981 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007982 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007983 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007984 if (tmp == NULL || tmp == Py_None) {
7985 Py_CLEAR(tmp);
7986 annotation = NULL;
7987 }
7988 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007989 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007990 res = obj2ast_expr(tmp, &annotation, arena);
7991 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007992 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007993 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007994 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7995 return 1;
7996 }
7997 if (tmp == NULL) {
7998 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
7999 return 1;
8000 }
8001 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008002 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008003 res = obj2ast_int(tmp, &lineno, arena);
8004 if (res != 0) goto failed;
8005 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008006 }
8007 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008008 return 1;
8009 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008010 if (tmp == NULL) {
8011 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
8012 return 1;
8013 }
8014 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008015 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008016 res = obj2ast_int(tmp, &col_offset, arena);
8017 if (res != 0) goto failed;
8018 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008019 }
8020 *out = arg(arg, annotation, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008021 return 0;
8022failed:
8023 Py_XDECREF(tmp);
8024 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008025}
8026
8027int
8028obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8029{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008030 PyObject* tmp = NULL;
8031 identifier arg;
8032 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008033
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008034 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8035 return 1;
8036 }
8037 if (tmp == NULL || tmp == Py_None) {
8038 Py_CLEAR(tmp);
8039 arg = NULL;
8040 }
8041 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008042 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008043 res = obj2ast_identifier(tmp, &arg, arena);
8044 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008045 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008046 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008047 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8048 return 1;
8049 }
8050 if (tmp == NULL) {
8051 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8052 return 1;
8053 }
8054 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008055 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008056 res = obj2ast_expr(tmp, &value, arena);
8057 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008058 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008059 }
8060 *out = keyword(arg, value, arena);
8061 return 0;
8062failed:
8063 Py_XDECREF(tmp);
8064 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008065}
8066
8067int
8068obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8069{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008070 PyObject* tmp = NULL;
8071 identifier name;
8072 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008073
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008074 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8075 return 1;
8076 }
8077 if (tmp == NULL) {
8078 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8079 return 1;
8080 }
8081 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008082 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008083 res = obj2ast_identifier(tmp, &name, arena);
8084 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008085 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008086 }
8087 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008088 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008089 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008090 if (tmp == NULL || tmp == Py_None) {
8091 Py_CLEAR(tmp);
8092 asname = NULL;
8093 }
8094 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008095 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008096 res = obj2ast_identifier(tmp, &asname, arena);
8097 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008098 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008099 }
8100 *out = alias(name, asname, arena);
8101 return 0;
8102failed:
8103 Py_XDECREF(tmp);
8104 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008105}
8106
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008107int
8108obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8109{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008110 PyObject* tmp = NULL;
8111 expr_ty context_expr;
8112 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008113
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008114 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8115 return 1;
8116 }
8117 if (tmp == NULL) {
8118 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8119 return 1;
8120 }
8121 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008122 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008123 res = obj2ast_expr(tmp, &context_expr, arena);
8124 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008125 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008126 }
8127 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008128 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008129 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008130 if (tmp == NULL || tmp == Py_None) {
8131 Py_CLEAR(tmp);
8132 optional_vars = NULL;
8133 }
8134 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008135 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008136 res = obj2ast_expr(tmp, &optional_vars, arena);
8137 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008138 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008139 }
8140 *out = withitem(context_expr, optional_vars, arena);
8141 return 0;
8142failed:
8143 Py_XDECREF(tmp);
8144 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008145}
8146
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008147
Martin v. Löwis1a214512008-06-11 05:26:20 +00008148static struct PyModuleDef _astmodule = {
8149 PyModuleDef_HEAD_INIT, "_ast"
8150};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008151PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008152PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008153{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008154 PyObject *m, *d;
8155 if (!init_types()) return NULL;
8156 m = PyModule_Create(&_astmodule);
8157 if (!m) return NULL;
8158 d = PyModule_GetDict(m);
8159 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008160 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008161 return NULL;
8162 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8163 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8164 NULL;
8165 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8166 0) return NULL;
8167 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8168 return NULL;
8169 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8170 NULL;
8171 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8172 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8173 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008174 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8175 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008176 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8177 return NULL;
8178 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8179 NULL;
8180 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8181 NULL;
8182 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8183 NULL;
8184 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8185 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008186 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8187 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008188 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008189 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8190 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008191 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8192 NULL;
8193 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8194 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008195 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8196 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008197 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8198 NULL;
8199 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8200 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8201 NULL;
8202 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8203 NULL;
8204 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8205 return NULL;
8206 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8207 NULL;
8208 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8209 return NULL;
8210 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8211 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8212 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8213 NULL;
8214 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8215 return NULL;
8216 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8217 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8218 NULL;
8219 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8220 NULL;
8221 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8222 NULL;
8223 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8224 NULL;
8225 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8226 NULL;
8227 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8228 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8229 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8230 return NULL;
8231 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8232 NULL;
8233 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8234 return NULL;
8235 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8236 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008237 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8238 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008239 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8240 NULL;
8241 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8242 return NULL;
8243 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8244 NULL;
8245 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
8246 if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return NULL;
8247 if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008248 if (PyDict_SetItemString(d, "FormattedValue",
8249 (PyObject*)FormattedValue_type) < 0) return NULL;
8250 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8251 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008252 if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return
8253 NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008254 if (PyDict_SetItemString(d, "NameConstant", (PyObject*)NameConstant_type) <
8255 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008256 if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
8257 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008258 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8259 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008260 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8261 return NULL;
8262 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8263 return NULL;
8264 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8265 NULL;
8266 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8267 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8268 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8269 NULL;
8270 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8271 0) return NULL;
8272 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8273 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8274 NULL;
8275 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8276 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8277 NULL;
8278 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8279 return NULL;
8280 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8281 NULL;
8282 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8283 NULL;
8284 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8285 NULL;
8286 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8287 return NULL;
8288 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8289 NULL;
8290 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8291 NULL;
8292 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8293 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8294 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8295 return NULL;
8296 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8297 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8298 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008299 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8300 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008301 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8302 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8303 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8304 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8305 NULL;
8306 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8307 NULL;
8308 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8309 NULL;
8310 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8311 NULL;
8312 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8313 NULL;
8314 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8315 return NULL;
8316 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8317 NULL;
8318 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8319 NULL;
8320 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8321 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8322 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8323 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8324 NULL;
8325 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8326 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8327 NULL;
8328 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8329 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8330 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8331 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8332 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8333 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8334 NULL;
8335 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8336 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8337 NULL;
8338 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8339 < 0) return NULL;
8340 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8341 < 0) return NULL;
8342 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8343 < 0) return NULL;
8344 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8345 return NULL;
8346 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8347 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8348 NULL;
8349 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8350 NULL;
8351 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8352 return NULL;
8353 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008354}
8355
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008356
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008357PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008358{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008359 if (!init_types())
8360 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008361 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008362}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008363
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008364/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8365mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008366{
8367 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008368 PyObject *req_type[3];
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008369 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008370 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008371
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008372 req_type[0] = (PyObject*)Module_type;
8373 req_type[1] = (PyObject*)Expression_type;
8374 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008375
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008376 assert(0 <= mode && mode <= 2);
8377
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008378 if (!init_types())
8379 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008380
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008381 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8382 if (isinstance == -1)
8383 return NULL;
8384 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008385 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8386 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008387 return NULL;
8388 }
8389 if (obj2ast_mod(ast, &res, arena) != 0)
8390 return NULL;
8391 else
8392 return res;
8393}
8394
8395int PyAST_Check(PyObject* obj)
8396{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008397 if (!init_types())
8398 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00008399 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008400}
8401
Martin v. Löwis5b222132007-06-10 09:51:05 +00008402