blob: 6a2f28e0e712d52c3aed471202e5a21dec539e95 [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
Miss Islington (bot)a4dd46a2018-05-30 22:31:21 -0700531static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700532ast_clear(AST_object *self)
533{
534 Py_CLEAR(self->dict);
Miss Islington (bot)a4dd46a2018-05-30 22:31:21 -0700535 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700536}
537
538static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000539ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
540{
541 Py_ssize_t i, numfields = 0;
542 int res = -1;
543 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200544 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
545 goto cleanup;
546 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000547 if (fields) {
548 numfields = PySequence_Size(fields);
549 if (numfields == -1)
550 goto cleanup;
551 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900552
Neal Norwitz207c9f32008-03-31 04:42:11 +0000553 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900554 if (numfields < PyTuple_GET_SIZE(args)) {
555 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
556 "%zd positional argument%s",
557 Py_TYPE(self)->tp_name,
558 numfields, numfields == 1 ? "" : "s");
559 res = -1;
560 goto cleanup;
561 }
562 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
563 /* cannot be reached when fields is NULL */
564 PyObject *name = PySequence_GetItem(fields, i);
565 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000566 res = -1;
567 goto cleanup;
568 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900569 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
570 Py_DECREF(name);
571 if (res < 0)
572 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000573 }
574 if (kw) {
575 i = 0; /* needed by PyDict_Next */
576 while (PyDict_Next(kw, &i, &key, &value)) {
577 res = PyObject_SetAttr(self, key, value);
578 if (res < 0)
579 goto cleanup;
580 }
581 }
582 cleanup:
583 Py_XDECREF(fields);
584 return res;
585}
586
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000587/* Pickling support */
588static PyObject *
589ast_type_reduce(PyObject *self, PyObject *unused)
590{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200591 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200592 PyObject *dict;
593 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
594 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000595 }
596 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200597 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000598 }
599 return Py_BuildValue("O()", Py_TYPE(self));
600}
601
602static PyMethodDef ast_type_methods[] = {
603 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
604 {NULL}
605};
606
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700607static PyGetSetDef ast_type_getsets[] = {
608 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
609 {NULL}
610};
611
Neal Norwitz207c9f32008-03-31 04:42:11 +0000612static PyTypeObject AST_type = {
613 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000614 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700615 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000616 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500617 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000618 0, /* tp_print */
619 0, /* tp_getattr */
620 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000621 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000622 0, /* tp_repr */
623 0, /* tp_as_number */
624 0, /* tp_as_sequence */
625 0, /* tp_as_mapping */
626 0, /* tp_hash */
627 0, /* tp_call */
628 0, /* tp_str */
629 PyObject_GenericGetAttr, /* tp_getattro */
630 PyObject_GenericSetAttr, /* tp_setattro */
631 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700632 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000633 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700634 (traverseproc)ast_traverse, /* tp_traverse */
635 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000636 0, /* tp_richcompare */
637 0, /* tp_weaklistoffset */
638 0, /* tp_iter */
639 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000640 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000641 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700642 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000643 0, /* tp_base */
644 0, /* tp_dict */
645 0, /* tp_descr_get */
646 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700647 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000648 (initproc)ast_type_init, /* tp_init */
649 PyType_GenericAlloc, /* tp_alloc */
650 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700651 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000652};
653
654
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000655static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
656{
INADA Naokifc489082017-01-25 22:33:43 +0900657 _Py_IDENTIFIER(__module__);
658 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000659 PyObject *fnames, *result;
660 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000661 fnames = PyTuple_New(num_fields);
662 if (!fnames) return NULL;
663 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000664 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000665 if (!field) {
666 Py_DECREF(fnames);
667 return NULL;
668 }
669 PyTuple_SET_ITEM(fnames, i, field);
670 }
INADA Naokifc489082017-01-25 22:33:43 +0900671 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
672 type, base,
673 _PyUnicode_FromId(&PyId__fields), fnames,
674 _PyUnicode_FromId(&PyId___module__),
675 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000676 Py_DECREF(fnames);
677 return (PyTypeObject*)result;
678}
679
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000680static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
681{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000682 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000683 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000684 if (!l)
685 return 0;
686 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000687 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000688 if (!s) {
689 Py_DECREF(l);
690 return 0;
691 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000692 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000693 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200694 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000695 Py_DECREF(l);
696 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000697}
698
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000699/* Conversion AST -> Python */
700
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000701static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
702{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700703 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000704 PyObject *result = PyList_New(n);
705 PyObject *value;
706 if (!result)
707 return NULL;
708 for (i = 0; i < n; i++) {
709 value = func(asdl_seq_GET(seq, i));
710 if (!value) {
711 Py_DECREF(result);
712 return NULL;
713 }
714 PyList_SET_ITEM(result, i, value);
715 }
716 return result;
717}
718
719static PyObject* ast2obj_object(void *o)
720{
721 if (!o)
722 o = Py_None;
723 Py_INCREF((PyObject*)o);
724 return (PyObject*)o;
725}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500726#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100727#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000728#define ast2obj_identifier ast2obj_object
729#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500730#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000731
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000732static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000733{
Christian Heimes217cfd12007-12-02 14:31:20 +0000734 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000735}
736
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000737/* Conversion Python -> AST */
738
Benjamin Peterson442f2092012-12-06 17:41:04 -0500739static int obj2ast_singleton(PyObject *obj, PyObject** out, PyArena* arena)
740{
741 if (obj != Py_None && obj != Py_True && obj != Py_False) {
742 PyErr_SetString(PyExc_ValueError,
743 "AST singleton must be True, False, or None");
744 return 1;
745 }
746 *out = obj;
747 return 0;
748}
749
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000750static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
751{
752 if (obj == Py_None)
753 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200754 if (obj) {
755 if (PyArena_AddPyObject(arena, obj) < 0) {
756 *out = NULL;
757 return -1;
758 }
759 Py_INCREF(obj);
760 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000761 *out = obj;
762 return 0;
763}
764
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100765static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
766{
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100767 if (obj) {
768 if (PyArena_AddPyObject(arena, obj) < 0) {
769 *out = NULL;
770 return -1;
771 }
772 Py_INCREF(obj);
773 }
774 *out = obj;
775 return 0;
776}
777
Benjamin Peterson180e6352011-07-22 11:09:07 -0500778static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500779{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500780 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
781 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500782 return 1;
783 }
784 return obj2ast_object(obj, out, arena);
785}
786
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500787static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
788{
Benjamin Peterson0224d4e2011-08-31 22:13:03 -0400789 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
Benjamin Peterson180e6352011-07-22 11:09:07 -0500790 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
791 return 1;
792 }
793 return obj2ast_object(obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500794}
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000795
Benjamin Petersone2498412011-08-09 16:08:39 -0500796static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
797{
798 if (!PyBytes_CheckExact(obj)) {
799 PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
800 return 1;
801 }
802 return obj2ast_object(obj, out, arena);
803}
804
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000805static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
806{
807 int i;
808 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100809 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000810 return 1;
811 }
812
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300813 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000814 if (i == -1 && PyErr_Occurred())
815 return 1;
816 *out = i;
817 return 0;
818}
819
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000820static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000821{
822 PyObject *empty_tuple, *d;
823 if (PyType_Ready(&AST_type) < 0)
824 return -1;
825 d = AST_type.tp_dict;
826 empty_tuple = PyTuple_New(0);
827 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900828 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
829 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000830 Py_XDECREF(empty_tuple);
831 return -1;
832 }
833 Py_DECREF(empty_tuple);
834 return 0;
835}
836
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000837
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000838static int init_types(void)
839{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200840 static int initialized;
841 if (initialized) return 1;
842 if (add_ast_fields() < 0) return 0;
843 mod_type = make_type("mod", &AST_type, NULL, 0);
844 if (!mod_type) return 0;
845 if (!add_attributes(mod_type, NULL, 0)) return 0;
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300846 Module_type = make_type("Module", mod_type, Module_fields, 1);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200847 if (!Module_type) return 0;
848 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
849 1);
850 if (!Interactive_type) return 0;
851 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
852 if (!Expression_type) return 0;
853 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
854 if (!Suite_type) return 0;
855 stmt_type = make_type("stmt", &AST_type, NULL, 0);
856 if (!stmt_type) return 0;
857 if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
858 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300859 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200860 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400861 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300862 AsyncFunctionDef_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400863 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka2641ee52018-05-29 10:49:10 +0300864 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200865 if (!ClassDef_type) return 0;
866 Return_type = make_type("Return", stmt_type, Return_fields, 1);
867 if (!Return_type) return 0;
868 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
869 if (!Delete_type) return 0;
870 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
871 if (!Assign_type) return 0;
872 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
873 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700874 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
875 if (!AnnAssign_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200876 For_type = make_type("For", stmt_type, For_fields, 4);
877 if (!For_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400878 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4);
879 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200880 While_type = make_type("While", stmt_type, While_fields, 3);
881 if (!While_type) return 0;
882 If_type = make_type("If", stmt_type, If_fields, 3);
883 if (!If_type) return 0;
884 With_type = make_type("With", stmt_type, With_fields, 2);
885 if (!With_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400886 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 2);
887 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200888 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
889 if (!Raise_type) return 0;
890 Try_type = make_type("Try", stmt_type, Try_fields, 4);
891 if (!Try_type) return 0;
892 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
893 if (!Assert_type) return 0;
894 Import_type = make_type("Import", stmt_type, Import_fields, 1);
895 if (!Import_type) return 0;
896 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
897 if (!ImportFrom_type) return 0;
898 Global_type = make_type("Global", stmt_type, Global_fields, 1);
899 if (!Global_type) return 0;
900 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
901 if (!Nonlocal_type) return 0;
902 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
903 if (!Expr_type) return 0;
904 Pass_type = make_type("Pass", stmt_type, NULL, 0);
905 if (!Pass_type) return 0;
906 Break_type = make_type("Break", stmt_type, NULL, 0);
907 if (!Break_type) return 0;
908 Continue_type = make_type("Continue", stmt_type, NULL, 0);
909 if (!Continue_type) return 0;
910 expr_type = make_type("expr", &AST_type, NULL, 0);
911 if (!expr_type) return 0;
912 if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
913 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
914 if (!BoolOp_type) return 0;
915 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
916 if (!BinOp_type) return 0;
917 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
918 if (!UnaryOp_type) return 0;
919 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
920 if (!Lambda_type) return 0;
921 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
922 if (!IfExp_type) return 0;
923 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
924 if (!Dict_type) return 0;
925 Set_type = make_type("Set", expr_type, Set_fields, 1);
926 if (!Set_type) return 0;
927 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
928 if (!ListComp_type) return 0;
929 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
930 if (!SetComp_type) return 0;
931 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
932 if (!DictComp_type) return 0;
933 GeneratorExp_type = make_type("GeneratorExp", expr_type,
934 GeneratorExp_fields, 2);
935 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400936 Await_type = make_type("Await", expr_type, Await_fields, 1);
937 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200938 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
939 if (!Yield_type) return 0;
940 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
941 if (!YieldFrom_type) return 0;
942 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
943 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400944 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200945 if (!Call_type) return 0;
946 Num_type = make_type("Num", expr_type, Num_fields, 1);
947 if (!Num_type) return 0;
948 Str_type = make_type("Str", expr_type, Str_fields, 1);
949 if (!Str_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400950 FormattedValue_type = make_type("FormattedValue", expr_type,
951 FormattedValue_fields, 3);
952 if (!FormattedValue_type) return 0;
953 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
954 if (!JoinedStr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200955 Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);
956 if (!Bytes_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +0200957 NameConstant_type = make_type("NameConstant", expr_type,
958 NameConstant_fields, 1);
959 if (!NameConstant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200960 Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);
961 if (!Ellipsis_type) return 0;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100962 Constant_type = make_type("Constant", expr_type, Constant_fields, 1);
963 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200964 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
965 if (!Attribute_type) return 0;
966 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
967 if (!Subscript_type) return 0;
968 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
969 if (!Starred_type) return 0;
970 Name_type = make_type("Name", expr_type, Name_fields, 2);
971 if (!Name_type) return 0;
972 List_type = make_type("List", expr_type, List_fields, 2);
973 if (!List_type) return 0;
974 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
975 if (!Tuple_type) return 0;
976 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
977 if (!expr_context_type) return 0;
978 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
979 Load_type = make_type("Load", expr_context_type, NULL, 0);
980 if (!Load_type) return 0;
981 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
982 if (!Load_singleton) return 0;
983 Store_type = make_type("Store", expr_context_type, NULL, 0);
984 if (!Store_type) return 0;
985 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
986 if (!Store_singleton) return 0;
987 Del_type = make_type("Del", expr_context_type, NULL, 0);
988 if (!Del_type) return 0;
989 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
990 if (!Del_singleton) return 0;
991 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
992 if (!AugLoad_type) return 0;
993 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
994 if (!AugLoad_singleton) return 0;
995 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
996 if (!AugStore_type) return 0;
997 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
998 if (!AugStore_singleton) return 0;
999 Param_type = make_type("Param", expr_context_type, NULL, 0);
1000 if (!Param_type) return 0;
1001 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
1002 if (!Param_singleton) return 0;
1003 slice_type = make_type("slice", &AST_type, NULL, 0);
1004 if (!slice_type) return 0;
1005 if (!add_attributes(slice_type, NULL, 0)) return 0;
1006 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1007 if (!Slice_type) return 0;
1008 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1009 if (!ExtSlice_type) return 0;
1010 Index_type = make_type("Index", slice_type, Index_fields, 1);
1011 if (!Index_type) return 0;
1012 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1013 if (!boolop_type) return 0;
1014 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1015 And_type = make_type("And", boolop_type, NULL, 0);
1016 if (!And_type) return 0;
1017 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1018 if (!And_singleton) return 0;
1019 Or_type = make_type("Or", boolop_type, NULL, 0);
1020 if (!Or_type) return 0;
1021 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1022 if (!Or_singleton) return 0;
1023 operator_type = make_type("operator", &AST_type, NULL, 0);
1024 if (!operator_type) return 0;
1025 if (!add_attributes(operator_type, NULL, 0)) return 0;
1026 Add_type = make_type("Add", operator_type, NULL, 0);
1027 if (!Add_type) return 0;
1028 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1029 if (!Add_singleton) return 0;
1030 Sub_type = make_type("Sub", operator_type, NULL, 0);
1031 if (!Sub_type) return 0;
1032 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1033 if (!Sub_singleton) return 0;
1034 Mult_type = make_type("Mult", operator_type, NULL, 0);
1035 if (!Mult_type) return 0;
1036 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1037 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001038 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1039 if (!MatMult_type) return 0;
1040 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1041 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001042 Div_type = make_type("Div", operator_type, NULL, 0);
1043 if (!Div_type) return 0;
1044 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1045 if (!Div_singleton) return 0;
1046 Mod_type = make_type("Mod", operator_type, NULL, 0);
1047 if (!Mod_type) return 0;
1048 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1049 if (!Mod_singleton) return 0;
1050 Pow_type = make_type("Pow", operator_type, NULL, 0);
1051 if (!Pow_type) return 0;
1052 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1053 if (!Pow_singleton) return 0;
1054 LShift_type = make_type("LShift", operator_type, NULL, 0);
1055 if (!LShift_type) return 0;
1056 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1057 if (!LShift_singleton) return 0;
1058 RShift_type = make_type("RShift", operator_type, NULL, 0);
1059 if (!RShift_type) return 0;
1060 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1061 if (!RShift_singleton) return 0;
1062 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1063 if (!BitOr_type) return 0;
1064 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1065 if (!BitOr_singleton) return 0;
1066 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1067 if (!BitXor_type) return 0;
1068 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1069 if (!BitXor_singleton) return 0;
1070 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1071 if (!BitAnd_type) return 0;
1072 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1073 if (!BitAnd_singleton) return 0;
1074 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1075 if (!FloorDiv_type) return 0;
1076 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1077 if (!FloorDiv_singleton) return 0;
1078 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1079 if (!unaryop_type) return 0;
1080 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1081 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1082 if (!Invert_type) return 0;
1083 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1084 if (!Invert_singleton) return 0;
1085 Not_type = make_type("Not", unaryop_type, NULL, 0);
1086 if (!Not_type) return 0;
1087 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1088 if (!Not_singleton) return 0;
1089 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1090 if (!UAdd_type) return 0;
1091 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1092 if (!UAdd_singleton) return 0;
1093 USub_type = make_type("USub", unaryop_type, NULL, 0);
1094 if (!USub_type) return 0;
1095 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1096 if (!USub_singleton) return 0;
1097 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1098 if (!cmpop_type) return 0;
1099 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1100 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1101 if (!Eq_type) return 0;
1102 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1103 if (!Eq_singleton) return 0;
1104 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1105 if (!NotEq_type) return 0;
1106 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1107 if (!NotEq_singleton) return 0;
1108 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1109 if (!Lt_type) return 0;
1110 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1111 if (!Lt_singleton) return 0;
1112 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1113 if (!LtE_type) return 0;
1114 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1115 if (!LtE_singleton) return 0;
1116 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1117 if (!Gt_type) return 0;
1118 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1119 if (!Gt_singleton) return 0;
1120 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1121 if (!GtE_type) return 0;
1122 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1123 if (!GtE_singleton) return 0;
1124 Is_type = make_type("Is", cmpop_type, NULL, 0);
1125 if (!Is_type) return 0;
1126 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1127 if (!Is_singleton) return 0;
1128 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1129 if (!IsNot_type) return 0;
1130 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1131 if (!IsNot_singleton) return 0;
1132 In_type = make_type("In", cmpop_type, NULL, 0);
1133 if (!In_type) return 0;
1134 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1135 if (!In_singleton) return 0;
1136 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1137 if (!NotIn_type) return 0;
1138 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1139 if (!NotIn_singleton) return 0;
1140 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001141 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001142 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001143 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001144 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1145 if (!excepthandler_type) return 0;
1146 if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
1147 return 0;
1148 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1149 ExceptHandler_fields, 3);
1150 if (!ExceptHandler_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001151 arguments_type = make_type("arguments", &AST_type, arguments_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001152 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001153 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001154 arg_type = make_type("arg", &AST_type, arg_fields, 2);
1155 if (!arg_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001156 if (!add_attributes(arg_type, arg_attributes, 2)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001157 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1158 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001159 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001160 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1161 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001162 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001163 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1164 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001165 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001166 initialized = 1;
1167 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001168}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001169
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001170static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1171static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1172static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1173static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1174 arena);
1175static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1176static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1177static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1178static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1179static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1180static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1181 arena);
1182static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1183 arena);
1184static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1185static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1186static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1187static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001188static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001189
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190mod_ty
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001191Module(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001193 mod_ty p;
1194 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1195 if (!p)
1196 return NULL;
1197 p->kind = Module_kind;
1198 p->v.Module.body = body;
1199 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200}
1201
1202mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001203Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001205 mod_ty p;
1206 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1207 if (!p)
1208 return NULL;
1209 p->kind = Interactive_kind;
1210 p->v.Interactive.body = body;
1211 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212}
1213
1214mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001215Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001217 mod_ty p;
1218 if (!body) {
1219 PyErr_SetString(PyExc_ValueError,
1220 "field body is required for Expression");
1221 return NULL;
1222 }
1223 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1224 if (!p)
1225 return NULL;
1226 p->kind = Expression_kind;
1227 p->v.Expression.body = body;
1228 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229}
1230
1231mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001232Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001234 mod_ty p;
1235 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1236 if (!p)
1237 return NULL;
1238 p->kind = Suite_kind;
1239 p->v.Suite.body = body;
1240 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241}
1242
1243stmt_ty
1244FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001245 decorator_list, expr_ty returns, int lineno, int col_offset,
1246 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001248 stmt_ty p;
1249 if (!name) {
1250 PyErr_SetString(PyExc_ValueError,
1251 "field name is required for FunctionDef");
1252 return NULL;
1253 }
1254 if (!args) {
1255 PyErr_SetString(PyExc_ValueError,
1256 "field args is required for FunctionDef");
1257 return NULL;
1258 }
1259 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1260 if (!p)
1261 return NULL;
1262 p->kind = FunctionDef_kind;
1263 p->v.FunctionDef.name = name;
1264 p->v.FunctionDef.args = args;
1265 p->v.FunctionDef.body = body;
1266 p->v.FunctionDef.decorator_list = decorator_list;
1267 p->v.FunctionDef.returns = returns;
1268 p->lineno = lineno;
1269 p->col_offset = col_offset;
1270 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271}
1272
1273stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001274AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001275 * decorator_list, expr_ty returns, int lineno, int col_offset,
1276 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001277{
1278 stmt_ty p;
1279 if (!name) {
1280 PyErr_SetString(PyExc_ValueError,
1281 "field name is required for AsyncFunctionDef");
1282 return NULL;
1283 }
1284 if (!args) {
1285 PyErr_SetString(PyExc_ValueError,
1286 "field args is required for AsyncFunctionDef");
1287 return NULL;
1288 }
1289 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1290 if (!p)
1291 return NULL;
1292 p->kind = AsyncFunctionDef_kind;
1293 p->v.AsyncFunctionDef.name = name;
1294 p->v.AsyncFunctionDef.args = args;
1295 p->v.AsyncFunctionDef.body = body;
1296 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1297 p->v.AsyncFunctionDef.returns = returns;
1298 p->lineno = lineno;
1299 p->col_offset = col_offset;
1300 return p;
1301}
1302
1303stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001304ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03001305 body, asdl_seq * decorator_list, int lineno, int col_offset, PyArena
1306 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001308 stmt_ty p;
1309 if (!name) {
1310 PyErr_SetString(PyExc_ValueError,
1311 "field name is required for ClassDef");
1312 return NULL;
1313 }
1314 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1315 if (!p)
1316 return NULL;
1317 p->kind = ClassDef_kind;
1318 p->v.ClassDef.name = name;
1319 p->v.ClassDef.bases = bases;
1320 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001321 p->v.ClassDef.body = body;
1322 p->v.ClassDef.decorator_list = decorator_list;
1323 p->lineno = lineno;
1324 p->col_offset = col_offset;
1325 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001326}
1327
1328stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001329Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001331 stmt_ty p;
1332 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1333 if (!p)
1334 return NULL;
1335 p->kind = Return_kind;
1336 p->v.Return.value = value;
1337 p->lineno = lineno;
1338 p->col_offset = col_offset;
1339 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340}
1341
1342stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001343Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001345 stmt_ty p;
1346 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1347 if (!p)
1348 return NULL;
1349 p->kind = Delete_kind;
1350 p->v.Delete.targets = targets;
1351 p->lineno = lineno;
1352 p->col_offset = col_offset;
1353 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354}
1355
1356stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001357Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1358 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001360 stmt_ty p;
1361 if (!value) {
1362 PyErr_SetString(PyExc_ValueError,
1363 "field value is required for Assign");
1364 return NULL;
1365 }
1366 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1367 if (!p)
1368 return NULL;
1369 p->kind = Assign_kind;
1370 p->v.Assign.targets = targets;
1371 p->v.Assign.value = value;
1372 p->lineno = lineno;
1373 p->col_offset = col_offset;
1374 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375}
1376
1377stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001378AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1379 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001381 stmt_ty p;
1382 if (!target) {
1383 PyErr_SetString(PyExc_ValueError,
1384 "field target is required for AugAssign");
1385 return NULL;
1386 }
1387 if (!op) {
1388 PyErr_SetString(PyExc_ValueError,
1389 "field op is required for AugAssign");
1390 return NULL;
1391 }
1392 if (!value) {
1393 PyErr_SetString(PyExc_ValueError,
1394 "field value is required for AugAssign");
1395 return NULL;
1396 }
1397 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1398 if (!p)
1399 return NULL;
1400 p->kind = AugAssign_kind;
1401 p->v.AugAssign.target = target;
1402 p->v.AugAssign.op = op;
1403 p->v.AugAssign.value = value;
1404 p->lineno = lineno;
1405 p->col_offset = col_offset;
1406 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407}
1408
1409stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001410AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
1411 lineno, int col_offset, PyArena *arena)
1412{
1413 stmt_ty p;
1414 if (!target) {
1415 PyErr_SetString(PyExc_ValueError,
1416 "field target is required for AnnAssign");
1417 return NULL;
1418 }
1419 if (!annotation) {
1420 PyErr_SetString(PyExc_ValueError,
1421 "field annotation is required for AnnAssign");
1422 return NULL;
1423 }
1424 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1425 if (!p)
1426 return NULL;
1427 p->kind = AnnAssign_kind;
1428 p->v.AnnAssign.target = target;
1429 p->v.AnnAssign.annotation = annotation;
1430 p->v.AnnAssign.value = value;
1431 p->v.AnnAssign.simple = simple;
1432 p->lineno = lineno;
1433 p->col_offset = col_offset;
1434 return p;
1435}
1436
1437stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001439 lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001441 stmt_ty p;
1442 if (!target) {
1443 PyErr_SetString(PyExc_ValueError,
1444 "field target is required for For");
1445 return NULL;
1446 }
1447 if (!iter) {
1448 PyErr_SetString(PyExc_ValueError,
1449 "field iter is required for For");
1450 return NULL;
1451 }
1452 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1453 if (!p)
1454 return NULL;
1455 p->kind = For_kind;
1456 p->v.For.target = target;
1457 p->v.For.iter = iter;
1458 p->v.For.body = body;
1459 p->v.For.orelse = orelse;
1460 p->lineno = lineno;
1461 p->col_offset = col_offset;
1462 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463}
1464
1465stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001466AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
1467 lineno, int col_offset, PyArena *arena)
1468{
1469 stmt_ty p;
1470 if (!target) {
1471 PyErr_SetString(PyExc_ValueError,
1472 "field target is required for AsyncFor");
1473 return NULL;
1474 }
1475 if (!iter) {
1476 PyErr_SetString(PyExc_ValueError,
1477 "field iter is required for AsyncFor");
1478 return NULL;
1479 }
1480 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1481 if (!p)
1482 return NULL;
1483 p->kind = AsyncFor_kind;
1484 p->v.AsyncFor.target = target;
1485 p->v.AsyncFor.iter = iter;
1486 p->v.AsyncFor.body = body;
1487 p->v.AsyncFor.orelse = orelse;
1488 p->lineno = lineno;
1489 p->col_offset = col_offset;
1490 return p;
1491}
1492
1493stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001494While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1495 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001497 stmt_ty p;
1498 if (!test) {
1499 PyErr_SetString(PyExc_ValueError,
1500 "field test is required for While");
1501 return NULL;
1502 }
1503 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1504 if (!p)
1505 return NULL;
1506 p->kind = While_kind;
1507 p->v.While.test = test;
1508 p->v.While.body = body;
1509 p->v.While.orelse = orelse;
1510 p->lineno = lineno;
1511 p->col_offset = col_offset;
1512 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513}
1514
1515stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001516If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1517 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001519 stmt_ty p;
1520 if (!test) {
1521 PyErr_SetString(PyExc_ValueError,
1522 "field test is required for If");
1523 return NULL;
1524 }
1525 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1526 if (!p)
1527 return NULL;
1528 p->kind = If_kind;
1529 p->v.If.test = test;
1530 p->v.If.body = body;
1531 p->v.If.orelse = orelse;
1532 p->lineno = lineno;
1533 p->col_offset = col_offset;
1534 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535}
1536
1537stmt_ty
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001538With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
1539 *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001540{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001541 stmt_ty p;
1542 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1543 if (!p)
1544 return NULL;
1545 p->kind = With_kind;
1546 p->v.With.items = items;
1547 p->v.With.body = body;
1548 p->lineno = lineno;
1549 p->col_offset = col_offset;
1550 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001551}
1552
1553stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001554AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset,
1555 PyArena *arena)
1556{
1557 stmt_ty p;
1558 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1559 if (!p)
1560 return NULL;
1561 p->kind = AsyncWith_kind;
1562 p->v.AsyncWith.items = items;
1563 p->v.AsyncWith.body = body;
1564 p->lineno = lineno;
1565 p->col_offset = col_offset;
1566 return p;
1567}
1568
1569stmt_ty
Collin Winter828f04a2007-08-31 00:04:24 +00001570Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001572 stmt_ty p;
1573 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1574 if (!p)
1575 return NULL;
1576 p->kind = Raise_kind;
1577 p->v.Raise.exc = exc;
1578 p->v.Raise.cause = cause;
1579 p->lineno = lineno;
1580 p->col_offset = col_offset;
1581 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582}
1583
1584stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001585Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
1586 finalbody, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001588 stmt_ty p;
1589 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1590 if (!p)
1591 return NULL;
1592 p->kind = Try_kind;
1593 p->v.Try.body = body;
1594 p->v.Try.handlers = handlers;
1595 p->v.Try.orelse = orelse;
1596 p->v.Try.finalbody = finalbody;
1597 p->lineno = lineno;
1598 p->col_offset = col_offset;
1599 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001600}
1601
1602stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001603Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001605 stmt_ty p;
1606 if (!test) {
1607 PyErr_SetString(PyExc_ValueError,
1608 "field test is required for Assert");
1609 return NULL;
1610 }
1611 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1612 if (!p)
1613 return NULL;
1614 p->kind = Assert_kind;
1615 p->v.Assert.test = test;
1616 p->v.Assert.msg = msg;
1617 p->lineno = lineno;
1618 p->col_offset = col_offset;
1619 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620}
1621
1622stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001623Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001625 stmt_ty p;
1626 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1627 if (!p)
1628 return NULL;
1629 p->kind = Import_kind;
1630 p->v.Import.names = names;
1631 p->lineno = lineno;
1632 p->col_offset = col_offset;
1633 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001634}
1635
1636stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001637ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1638 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001639{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001640 stmt_ty p;
1641 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1642 if (!p)
1643 return NULL;
1644 p->kind = ImportFrom_kind;
1645 p->v.ImportFrom.module = module;
1646 p->v.ImportFrom.names = names;
1647 p->v.ImportFrom.level = level;
1648 p->lineno = lineno;
1649 p->col_offset = col_offset;
1650 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651}
1652
1653stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001654Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001655{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001656 stmt_ty p;
1657 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1658 if (!p)
1659 return NULL;
1660 p->kind = Global_kind;
1661 p->v.Global.names = names;
1662 p->lineno = lineno;
1663 p->col_offset = col_offset;
1664 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001665}
1666
1667stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00001668Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1669{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001670 stmt_ty p;
1671 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1672 if (!p)
1673 return NULL;
1674 p->kind = Nonlocal_kind;
1675 p->v.Nonlocal.names = names;
1676 p->lineno = lineno;
1677 p->col_offset = col_offset;
1678 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001679}
1680
1681stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001682Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001684 stmt_ty p;
1685 if (!value) {
1686 PyErr_SetString(PyExc_ValueError,
1687 "field value is required for Expr");
1688 return NULL;
1689 }
1690 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1691 if (!p)
1692 return NULL;
1693 p->kind = Expr_kind;
1694 p->v.Expr.value = value;
1695 p->lineno = lineno;
1696 p->col_offset = col_offset;
1697 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698}
1699
1700stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001701Pass(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001703 stmt_ty p;
1704 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1705 if (!p)
1706 return NULL;
1707 p->kind = Pass_kind;
1708 p->lineno = lineno;
1709 p->col_offset = col_offset;
1710 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711}
1712
1713stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001714Break(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001715{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001716 stmt_ty p;
1717 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1718 if (!p)
1719 return NULL;
1720 p->kind = Break_kind;
1721 p->lineno = lineno;
1722 p->col_offset = col_offset;
1723 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001724}
1725
1726stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001727Continue(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001729 stmt_ty p;
1730 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1731 if (!p)
1732 return NULL;
1733 p->kind = Continue_kind;
1734 p->lineno = lineno;
1735 p->col_offset = col_offset;
1736 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737}
1738
1739expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001740BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1741 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001742{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001743 expr_ty p;
1744 if (!op) {
1745 PyErr_SetString(PyExc_ValueError,
1746 "field op is required for BoolOp");
1747 return NULL;
1748 }
1749 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1750 if (!p)
1751 return NULL;
1752 p->kind = BoolOp_kind;
1753 p->v.BoolOp.op = op;
1754 p->v.BoolOp.values = values;
1755 p->lineno = lineno;
1756 p->col_offset = col_offset;
1757 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758}
1759
1760expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001761BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1762 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001764 expr_ty p;
1765 if (!left) {
1766 PyErr_SetString(PyExc_ValueError,
1767 "field left is required for BinOp");
1768 return NULL;
1769 }
1770 if (!op) {
1771 PyErr_SetString(PyExc_ValueError,
1772 "field op is required for BinOp");
1773 return NULL;
1774 }
1775 if (!right) {
1776 PyErr_SetString(PyExc_ValueError,
1777 "field right is required for BinOp");
1778 return NULL;
1779 }
1780 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1781 if (!p)
1782 return NULL;
1783 p->kind = BinOp_kind;
1784 p->v.BinOp.left = left;
1785 p->v.BinOp.op = op;
1786 p->v.BinOp.right = right;
1787 p->lineno = lineno;
1788 p->col_offset = col_offset;
1789 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790}
1791
1792expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001793UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1794 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001796 expr_ty p;
1797 if (!op) {
1798 PyErr_SetString(PyExc_ValueError,
1799 "field op is required for UnaryOp");
1800 return NULL;
1801 }
1802 if (!operand) {
1803 PyErr_SetString(PyExc_ValueError,
1804 "field operand is required for UnaryOp");
1805 return NULL;
1806 }
1807 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1808 if (!p)
1809 return NULL;
1810 p->kind = UnaryOp_kind;
1811 p->v.UnaryOp.op = op;
1812 p->v.UnaryOp.operand = operand;
1813 p->lineno = lineno;
1814 p->col_offset = col_offset;
1815 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816}
1817
1818expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001819Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
1820 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001822 expr_ty p;
1823 if (!args) {
1824 PyErr_SetString(PyExc_ValueError,
1825 "field args is required for Lambda");
1826 return NULL;
1827 }
1828 if (!body) {
1829 PyErr_SetString(PyExc_ValueError,
1830 "field body is required for Lambda");
1831 return NULL;
1832 }
1833 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1834 if (!p)
1835 return NULL;
1836 p->kind = Lambda_kind;
1837 p->v.Lambda.args = args;
1838 p->v.Lambda.body = body;
1839 p->lineno = lineno;
1840 p->col_offset = col_offset;
1841 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842}
1843
1844expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001845IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1846 PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001847{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001848 expr_ty p;
1849 if (!test) {
1850 PyErr_SetString(PyExc_ValueError,
1851 "field test is required for IfExp");
1852 return NULL;
1853 }
1854 if (!body) {
1855 PyErr_SetString(PyExc_ValueError,
1856 "field body is required for IfExp");
1857 return NULL;
1858 }
1859 if (!orelse) {
1860 PyErr_SetString(PyExc_ValueError,
1861 "field orelse is required for IfExp");
1862 return NULL;
1863 }
1864 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1865 if (!p)
1866 return NULL;
1867 p->kind = IfExp_kind;
1868 p->v.IfExp.test = test;
1869 p->v.IfExp.body = body;
1870 p->v.IfExp.orelse = orelse;
1871 p->lineno = lineno;
1872 p->col_offset = col_offset;
1873 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001874}
1875
1876expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001877Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1878 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001880 expr_ty p;
1881 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1882 if (!p)
1883 return NULL;
1884 p->kind = Dict_kind;
1885 p->v.Dict.keys = keys;
1886 p->v.Dict.values = values;
1887 p->lineno = lineno;
1888 p->col_offset = col_offset;
1889 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890}
1891
1892expr_ty
Guido van Rossum86e58e22006-08-28 15:27:34 +00001893Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1894{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001895 expr_ty p;
1896 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1897 if (!p)
1898 return NULL;
1899 p->kind = Set_kind;
1900 p->v.Set.elts = elts;
1901 p->lineno = lineno;
1902 p->col_offset = col_offset;
1903 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001904}
1905
1906expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001907ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1908 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001910 expr_ty p;
1911 if (!elt) {
1912 PyErr_SetString(PyExc_ValueError,
1913 "field elt is required for ListComp");
1914 return NULL;
1915 }
1916 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1917 if (!p)
1918 return NULL;
1919 p->kind = ListComp_kind;
1920 p->v.ListComp.elt = elt;
1921 p->v.ListComp.generators = generators;
1922 p->lineno = lineno;
1923 p->col_offset = col_offset;
1924 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925}
1926
1927expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1929 *arena)
1930{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001931 expr_ty p;
1932 if (!elt) {
1933 PyErr_SetString(PyExc_ValueError,
1934 "field elt is required for SetComp");
1935 return NULL;
1936 }
1937 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1938 if (!p)
1939 return NULL;
1940 p->kind = SetComp_kind;
1941 p->v.SetComp.elt = elt;
1942 p->v.SetComp.generators = generators;
1943 p->lineno = lineno;
1944 p->col_offset = col_offset;
1945 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001946}
1947
1948expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001949DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1950 col_offset, PyArena *arena)
1951{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001952 expr_ty p;
1953 if (!key) {
1954 PyErr_SetString(PyExc_ValueError,
1955 "field key is required for DictComp");
1956 return NULL;
1957 }
1958 if (!value) {
1959 PyErr_SetString(PyExc_ValueError,
1960 "field value is required for DictComp");
1961 return NULL;
1962 }
1963 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1964 if (!p)
1965 return NULL;
1966 p->kind = DictComp_kind;
1967 p->v.DictComp.key = key;
1968 p->v.DictComp.value = value;
1969 p->v.DictComp.generators = generators;
1970 p->lineno = lineno;
1971 p->col_offset = col_offset;
1972 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001973}
1974
1975expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001976GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1977 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001979 expr_ty p;
1980 if (!elt) {
1981 PyErr_SetString(PyExc_ValueError,
1982 "field elt is required for GeneratorExp");
1983 return NULL;
1984 }
1985 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1986 if (!p)
1987 return NULL;
1988 p->kind = GeneratorExp_kind;
1989 p->v.GeneratorExp.elt = elt;
1990 p->v.GeneratorExp.generators = generators;
1991 p->lineno = lineno;
1992 p->col_offset = col_offset;
1993 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994}
1995
1996expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001997Await(expr_ty value, int lineno, int col_offset, PyArena *arena)
1998{
1999 expr_ty p;
2000 if (!value) {
2001 PyErr_SetString(PyExc_ValueError,
2002 "field value is required for Await");
2003 return NULL;
2004 }
2005 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2006 if (!p)
2007 return NULL;
2008 p->kind = Await_kind;
2009 p->v.Await.value = value;
2010 p->lineno = lineno;
2011 p->col_offset = col_offset;
2012 return p;
2013}
2014
2015expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002016Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002018 expr_ty p;
2019 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2020 if (!p)
2021 return NULL;
2022 p->kind = Yield_kind;
2023 p->v.Yield.value = value;
2024 p->lineno = lineno;
2025 p->col_offset = col_offset;
2026 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027}
2028
2029expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002030YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena)
2031{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002032 expr_ty p;
2033 if (!value) {
2034 PyErr_SetString(PyExc_ValueError,
2035 "field value is required for YieldFrom");
2036 return NULL;
2037 }
2038 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2039 if (!p)
2040 return NULL;
2041 p->kind = YieldFrom_kind;
2042 p->v.YieldFrom.value = value;
2043 p->lineno = lineno;
2044 p->col_offset = col_offset;
2045 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002046}
2047
2048expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002049Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
2050 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002052 expr_ty p;
2053 if (!left) {
2054 PyErr_SetString(PyExc_ValueError,
2055 "field left is required for Compare");
2056 return NULL;
2057 }
2058 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2059 if (!p)
2060 return NULL;
2061 p->kind = Compare_kind;
2062 p->v.Compare.left = left;
2063 p->v.Compare.ops = ops;
2064 p->v.Compare.comparators = comparators;
2065 p->lineno = lineno;
2066 p->col_offset = col_offset;
2067 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068}
2069
2070expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002071Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
2072 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002074 expr_ty p;
2075 if (!func) {
2076 PyErr_SetString(PyExc_ValueError,
2077 "field func is required for Call");
2078 return NULL;
2079 }
2080 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2081 if (!p)
2082 return NULL;
2083 p->kind = Call_kind;
2084 p->v.Call.func = func;
2085 p->v.Call.args = args;
2086 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002087 p->lineno = lineno;
2088 p->col_offset = col_offset;
2089 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090}
2091
2092expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002093Num(object n, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002095 expr_ty p;
2096 if (!n) {
2097 PyErr_SetString(PyExc_ValueError,
2098 "field n is required for Num");
2099 return NULL;
2100 }
2101 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2102 if (!p)
2103 return NULL;
2104 p->kind = Num_kind;
2105 p->v.Num.n = n;
2106 p->lineno = lineno;
2107 p->col_offset = col_offset;
2108 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109}
2110
2111expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002112Str(string s, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002114 expr_ty p;
2115 if (!s) {
2116 PyErr_SetString(PyExc_ValueError,
2117 "field s is required for Str");
2118 return NULL;
2119 }
2120 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2121 if (!p)
2122 return NULL;
2123 p->kind = Str_kind;
2124 p->v.Str.s = s;
2125 p->lineno = lineno;
2126 p->col_offset = col_offset;
2127 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128}
2129
2130expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002131FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
2132 int col_offset, PyArena *arena)
2133{
2134 expr_ty p;
2135 if (!value) {
2136 PyErr_SetString(PyExc_ValueError,
2137 "field value is required for FormattedValue");
2138 return NULL;
2139 }
2140 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2141 if (!p)
2142 return NULL;
2143 p->kind = FormattedValue_kind;
2144 p->v.FormattedValue.value = value;
2145 p->v.FormattedValue.conversion = conversion;
2146 p->v.FormattedValue.format_spec = format_spec;
2147 p->lineno = lineno;
2148 p->col_offset = col_offset;
2149 return p;
2150}
2151
2152expr_ty
2153JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena *arena)
2154{
2155 expr_ty p;
2156 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2157 if (!p)
2158 return NULL;
2159 p->kind = JoinedStr_kind;
2160 p->v.JoinedStr.values = values;
2161 p->lineno = lineno;
2162 p->col_offset = col_offset;
2163 return p;
2164}
2165
2166expr_ty
Benjamin Petersone2498412011-08-09 16:08:39 -05002167Bytes(bytes s, int lineno, int col_offset, PyArena *arena)
Thomas Wouters00e41de2007-02-23 19:56:57 +00002168{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002169 expr_ty p;
2170 if (!s) {
2171 PyErr_SetString(PyExc_ValueError,
2172 "field s is required for Bytes");
2173 return NULL;
2174 }
2175 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2176 if (!p)
2177 return NULL;
2178 p->kind = Bytes_kind;
2179 p->v.Bytes.s = s;
2180 p->lineno = lineno;
2181 p->col_offset = col_offset;
2182 return p;
Thomas Wouters00e41de2007-02-23 19:56:57 +00002183}
2184
2185expr_ty
Benjamin Peterson442f2092012-12-06 17:41:04 -05002186NameConstant(singleton value, int lineno, int col_offset, PyArena *arena)
2187{
Victor Stinneree4b59c2013-07-27 00:01:35 +02002188 expr_ty p;
2189 if (!value) {
2190 PyErr_SetString(PyExc_ValueError,
2191 "field value is required for NameConstant");
2192 return NULL;
2193 }
2194 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2195 if (!p)
2196 return NULL;
2197 p->kind = NameConstant_kind;
2198 p->v.NameConstant.value = value;
2199 p->lineno = lineno;
2200 p->col_offset = col_offset;
2201 return p;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002202}
2203
2204expr_ty
Georg Brandl52318d62006-09-06 07:06:08 +00002205Ellipsis(int lineno, int col_offset, PyArena *arena)
2206{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002207 expr_ty p;
2208 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2209 if (!p)
2210 return NULL;
2211 p->kind = Ellipsis_kind;
2212 p->lineno = lineno;
2213 p->col_offset = col_offset;
2214 return p;
Georg Brandl52318d62006-09-06 07:06:08 +00002215}
2216
2217expr_ty
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002218Constant(constant value, int lineno, int col_offset, PyArena *arena)
2219{
2220 expr_ty p;
2221 if (!value) {
2222 PyErr_SetString(PyExc_ValueError,
2223 "field value is required for Constant");
2224 return NULL;
2225 }
2226 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2227 if (!p)
2228 return NULL;
2229 p->kind = Constant_kind;
2230 p->v.Constant.value = value;
2231 p->lineno = lineno;
2232 p->col_offset = col_offset;
2233 return p;
2234}
2235
2236expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002237Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
2238 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002240 expr_ty p;
2241 if (!value) {
2242 PyErr_SetString(PyExc_ValueError,
2243 "field value is required for Attribute");
2244 return NULL;
2245 }
2246 if (!attr) {
2247 PyErr_SetString(PyExc_ValueError,
2248 "field attr is required for Attribute");
2249 return NULL;
2250 }
2251 if (!ctx) {
2252 PyErr_SetString(PyExc_ValueError,
2253 "field ctx is required for Attribute");
2254 return NULL;
2255 }
2256 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2257 if (!p)
2258 return NULL;
2259 p->kind = Attribute_kind;
2260 p->v.Attribute.value = value;
2261 p->v.Attribute.attr = attr;
2262 p->v.Attribute.ctx = ctx;
2263 p->lineno = lineno;
2264 p->col_offset = col_offset;
2265 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266}
2267
2268expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002269Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
2270 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002272 expr_ty p;
2273 if (!value) {
2274 PyErr_SetString(PyExc_ValueError,
2275 "field value is required for Subscript");
2276 return NULL;
2277 }
2278 if (!slice) {
2279 PyErr_SetString(PyExc_ValueError,
2280 "field slice is required for Subscript");
2281 return NULL;
2282 }
2283 if (!ctx) {
2284 PyErr_SetString(PyExc_ValueError,
2285 "field ctx is required for Subscript");
2286 return NULL;
2287 }
2288 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2289 if (!p)
2290 return NULL;
2291 p->kind = Subscript_kind;
2292 p->v.Subscript.value = value;
2293 p->v.Subscript.slice = slice;
2294 p->v.Subscript.ctx = ctx;
2295 p->lineno = lineno;
2296 p->col_offset = col_offset;
2297 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298}
2299
2300expr_ty
Guido van Rossum0368b722007-05-11 16:50:42 +00002301Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
2302 *arena)
2303{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002304 expr_ty p;
2305 if (!value) {
2306 PyErr_SetString(PyExc_ValueError,
2307 "field value is required for Starred");
2308 return NULL;
2309 }
2310 if (!ctx) {
2311 PyErr_SetString(PyExc_ValueError,
2312 "field ctx is required for Starred");
2313 return NULL;
2314 }
2315 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2316 if (!p)
2317 return NULL;
2318 p->kind = Starred_kind;
2319 p->v.Starred.value = value;
2320 p->v.Starred.ctx = ctx;
2321 p->lineno = lineno;
2322 p->col_offset = col_offset;
2323 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002324}
2325
2326expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002327Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
2328 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002330 expr_ty p;
2331 if (!id) {
2332 PyErr_SetString(PyExc_ValueError,
2333 "field id is required for Name");
2334 return NULL;
2335 }
2336 if (!ctx) {
2337 PyErr_SetString(PyExc_ValueError,
2338 "field ctx is required for Name");
2339 return NULL;
2340 }
2341 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2342 if (!p)
2343 return NULL;
2344 p->kind = Name_kind;
2345 p->v.Name.id = id;
2346 p->v.Name.ctx = ctx;
2347 p->lineno = lineno;
2348 p->col_offset = col_offset;
2349 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350}
2351
2352expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002353List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2354 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002356 expr_ty p;
2357 if (!ctx) {
2358 PyErr_SetString(PyExc_ValueError,
2359 "field ctx is required for List");
2360 return NULL;
2361 }
2362 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2363 if (!p)
2364 return NULL;
2365 p->kind = List_kind;
2366 p->v.List.elts = elts;
2367 p->v.List.ctx = ctx;
2368 p->lineno = lineno;
2369 p->col_offset = col_offset;
2370 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371}
2372
2373expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002374Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2375 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002377 expr_ty p;
2378 if (!ctx) {
2379 PyErr_SetString(PyExc_ValueError,
2380 "field ctx is required for Tuple");
2381 return NULL;
2382 }
2383 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2384 if (!p)
2385 return NULL;
2386 p->kind = Tuple_kind;
2387 p->v.Tuple.elts = elts;
2388 p->v.Tuple.ctx = ctx;
2389 p->lineno = lineno;
2390 p->col_offset = col_offset;
2391 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392}
2393
2394slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002395Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002397 slice_ty p;
2398 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2399 if (!p)
2400 return NULL;
2401 p->kind = Slice_kind;
2402 p->v.Slice.lower = lower;
2403 p->v.Slice.upper = upper;
2404 p->v.Slice.step = step;
2405 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406}
2407
2408slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002409ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002411 slice_ty p;
2412 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2413 if (!p)
2414 return NULL;
2415 p->kind = ExtSlice_kind;
2416 p->v.ExtSlice.dims = dims;
2417 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418}
2419
2420slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002421Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002423 slice_ty p;
2424 if (!value) {
2425 PyErr_SetString(PyExc_ValueError,
2426 "field value is required for Index");
2427 return NULL;
2428 }
2429 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2430 if (!p)
2431 return NULL;
2432 p->kind = Index_kind;
2433 p->v.Index.value = value;
2434 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435}
2436
2437comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002438comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2439 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002441 comprehension_ty p;
2442 if (!target) {
2443 PyErr_SetString(PyExc_ValueError,
2444 "field target is required for comprehension");
2445 return NULL;
2446 }
2447 if (!iter) {
2448 PyErr_SetString(PyExc_ValueError,
2449 "field iter is required for comprehension");
2450 return NULL;
2451 }
2452 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2453 if (!p)
2454 return NULL;
2455 p->target = target;
2456 p->iter = iter;
2457 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002458 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002459 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460}
2461
2462excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002463ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002464 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002466 excepthandler_ty p;
2467 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2468 if (!p)
2469 return NULL;
2470 p->kind = ExceptHandler_kind;
2471 p->v.ExceptHandler.type = type;
2472 p->v.ExceptHandler.name = name;
2473 p->v.ExceptHandler.body = body;
2474 p->lineno = lineno;
2475 p->col_offset = col_offset;
2476 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477}
2478
2479arguments_ty
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002480arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
2481 kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002483 arguments_ty p;
2484 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2485 if (!p)
2486 return NULL;
2487 p->args = args;
2488 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002489 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002490 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002491 p->kwarg = kwarg;
2492 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002493 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494}
2495
Neal Norwitzc1505362006-12-28 06:47:50 +00002496arg_ty
Victor Stinnerc106c682015-11-06 17:01:48 +01002497arg(identifier arg, expr_ty annotation, int lineno, int col_offset, PyArena
2498 *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002499{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002500 arg_ty p;
2501 if (!arg) {
2502 PyErr_SetString(PyExc_ValueError,
2503 "field arg is required for arg");
2504 return NULL;
2505 }
2506 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2507 if (!p)
2508 return NULL;
2509 p->arg = arg;
2510 p->annotation = annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01002511 p->lineno = lineno;
2512 p->col_offset = col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002513 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002514}
2515
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002517keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002519 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002520 if (!value) {
2521 PyErr_SetString(PyExc_ValueError,
2522 "field value is required for keyword");
2523 return NULL;
2524 }
2525 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2526 if (!p)
2527 return NULL;
2528 p->arg = arg;
2529 p->value = value;
2530 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002531}
2532
2533alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002534alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002536 alias_ty p;
2537 if (!name) {
2538 PyErr_SetString(PyExc_ValueError,
2539 "field name is required for alias");
2540 return NULL;
2541 }
2542 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2543 if (!p)
2544 return NULL;
2545 p->name = name;
2546 p->asname = asname;
2547 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548}
2549
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002550withitem_ty
2551withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2552{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002553 withitem_ty p;
2554 if (!context_expr) {
2555 PyErr_SetString(PyExc_ValueError,
2556 "field context_expr is required for withitem");
2557 return NULL;
2558 }
2559 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2560 if (!p)
2561 return NULL;
2562 p->context_expr = context_expr;
2563 p->optional_vars = optional_vars;
2564 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002565}
2566
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002567
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002568PyObject*
2569ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002570{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002571 mod_ty o = (mod_ty)_o;
2572 PyObject *result = NULL, *value = NULL;
2573 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002574 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002575 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002576
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002577 switch (o->kind) {
2578 case Module_kind:
2579 result = PyType_GenericNew(Module_type, NULL, NULL);
2580 if (!result) goto failed;
2581 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2582 if (!value) goto failed;
2583 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2584 goto failed;
2585 Py_DECREF(value);
2586 break;
2587 case Interactive_kind:
2588 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2589 if (!result) goto failed;
2590 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2591 if (!value) goto failed;
2592 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2593 goto failed;
2594 Py_DECREF(value);
2595 break;
2596 case Expression_kind:
2597 result = PyType_GenericNew(Expression_type, NULL, NULL);
2598 if (!result) goto failed;
2599 value = ast2obj_expr(o->v.Expression.body);
2600 if (!value) goto failed;
2601 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2602 goto failed;
2603 Py_DECREF(value);
2604 break;
2605 case Suite_kind:
2606 result = PyType_GenericNew(Suite_type, NULL, NULL);
2607 if (!result) goto failed;
2608 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2609 if (!value) goto failed;
2610 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2611 goto failed;
2612 Py_DECREF(value);
2613 break;
2614 }
2615 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002616failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002617 Py_XDECREF(value);
2618 Py_XDECREF(result);
2619 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620}
2621
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002622PyObject*
2623ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002625 stmt_ty o = (stmt_ty)_o;
2626 PyObject *result = NULL, *value = NULL;
2627 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002628 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002629 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002630
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002631 switch (o->kind) {
2632 case FunctionDef_kind:
2633 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2634 if (!result) goto failed;
2635 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002636 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002637 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2638 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002639 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002640 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002641 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002642 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2643 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002644 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002645 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2646 if (!value) goto failed;
2647 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2648 goto failed;
2649 Py_DECREF(value);
2650 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2651 if (!value) goto failed;
2652 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2653 goto failed;
2654 Py_DECREF(value);
2655 value = ast2obj_expr(o->v.FunctionDef.returns);
2656 if (!value) goto failed;
2657 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2658 goto failed;
2659 Py_DECREF(value);
2660 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002661 case AsyncFunctionDef_kind:
2662 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2663 if (!result) goto failed;
2664 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2665 if (!value) goto failed;
2666 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2667 goto failed;
2668 Py_DECREF(value);
2669 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2670 if (!value) goto failed;
2671 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2672 goto failed;
2673 Py_DECREF(value);
2674 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2675 if (!value) goto failed;
2676 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2677 goto failed;
2678 Py_DECREF(value);
2679 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2680 ast2obj_expr);
2681 if (!value) goto failed;
2682 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2683 goto failed;
2684 Py_DECREF(value);
2685 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2686 if (!value) goto failed;
2687 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2688 goto failed;
2689 Py_DECREF(value);
2690 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002691 case ClassDef_kind:
2692 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2693 if (!result) goto failed;
2694 value = ast2obj_identifier(o->v.ClassDef.name);
2695 if (!value) goto failed;
2696 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2697 goto failed;
2698 Py_DECREF(value);
2699 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2700 if (!value) goto failed;
2701 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2702 goto failed;
2703 Py_DECREF(value);
2704 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2705 if (!value) goto failed;
2706 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2707 goto failed;
2708 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002709 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2710 if (!value) goto failed;
2711 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2712 goto failed;
2713 Py_DECREF(value);
2714 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2715 if (!value) goto failed;
2716 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2717 goto failed;
2718 Py_DECREF(value);
2719 break;
2720 case Return_kind:
2721 result = PyType_GenericNew(Return_type, NULL, NULL);
2722 if (!result) goto failed;
2723 value = ast2obj_expr(o->v.Return.value);
2724 if (!value) goto failed;
2725 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2726 goto failed;
2727 Py_DECREF(value);
2728 break;
2729 case Delete_kind:
2730 result = PyType_GenericNew(Delete_type, NULL, NULL);
2731 if (!result) goto failed;
2732 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2733 if (!value) goto failed;
2734 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2735 goto failed;
2736 Py_DECREF(value);
2737 break;
2738 case Assign_kind:
2739 result = PyType_GenericNew(Assign_type, NULL, NULL);
2740 if (!result) goto failed;
2741 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2742 if (!value) goto failed;
2743 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2744 goto failed;
2745 Py_DECREF(value);
2746 value = ast2obj_expr(o->v.Assign.value);
2747 if (!value) goto failed;
2748 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2749 goto failed;
2750 Py_DECREF(value);
2751 break;
2752 case AugAssign_kind:
2753 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2754 if (!result) goto failed;
2755 value = ast2obj_expr(o->v.AugAssign.target);
2756 if (!value) goto failed;
2757 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2758 goto failed;
2759 Py_DECREF(value);
2760 value = ast2obj_operator(o->v.AugAssign.op);
2761 if (!value) goto failed;
2762 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2763 goto failed;
2764 Py_DECREF(value);
2765 value = ast2obj_expr(o->v.AugAssign.value);
2766 if (!value) goto failed;
2767 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2768 goto failed;
2769 Py_DECREF(value);
2770 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002771 case AnnAssign_kind:
2772 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2773 if (!result) goto failed;
2774 value = ast2obj_expr(o->v.AnnAssign.target);
2775 if (!value) goto failed;
2776 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2777 goto failed;
2778 Py_DECREF(value);
2779 value = ast2obj_expr(o->v.AnnAssign.annotation);
2780 if (!value) goto failed;
2781 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2782 goto failed;
2783 Py_DECREF(value);
2784 value = ast2obj_expr(o->v.AnnAssign.value);
2785 if (!value) goto failed;
2786 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2787 goto failed;
2788 Py_DECREF(value);
2789 value = ast2obj_int(o->v.AnnAssign.simple);
2790 if (!value) goto failed;
2791 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2792 goto failed;
2793 Py_DECREF(value);
2794 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002795 case For_kind:
2796 result = PyType_GenericNew(For_type, NULL, NULL);
2797 if (!result) goto failed;
2798 value = ast2obj_expr(o->v.For.target);
2799 if (!value) goto failed;
2800 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2801 goto failed;
2802 Py_DECREF(value);
2803 value = ast2obj_expr(o->v.For.iter);
2804 if (!value) goto failed;
2805 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2806 goto failed;
2807 Py_DECREF(value);
2808 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2809 if (!value) goto failed;
2810 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2811 goto failed;
2812 Py_DECREF(value);
2813 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2814 if (!value) goto failed;
2815 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2816 goto failed;
2817 Py_DECREF(value);
2818 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002819 case AsyncFor_kind:
2820 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2821 if (!result) goto failed;
2822 value = ast2obj_expr(o->v.AsyncFor.target);
2823 if (!value) goto failed;
2824 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2825 goto failed;
2826 Py_DECREF(value);
2827 value = ast2obj_expr(o->v.AsyncFor.iter);
2828 if (!value) goto failed;
2829 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2830 goto failed;
2831 Py_DECREF(value);
2832 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2833 if (!value) goto failed;
2834 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2835 goto failed;
2836 Py_DECREF(value);
2837 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2838 if (!value) goto failed;
2839 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2840 goto failed;
2841 Py_DECREF(value);
2842 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002843 case While_kind:
2844 result = PyType_GenericNew(While_type, NULL, NULL);
2845 if (!result) goto failed;
2846 value = ast2obj_expr(o->v.While.test);
2847 if (!value) goto failed;
2848 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2849 goto failed;
2850 Py_DECREF(value);
2851 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2852 if (!value) goto failed;
2853 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2854 goto failed;
2855 Py_DECREF(value);
2856 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2857 if (!value) goto failed;
2858 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2859 goto failed;
2860 Py_DECREF(value);
2861 break;
2862 case If_kind:
2863 result = PyType_GenericNew(If_type, NULL, NULL);
2864 if (!result) goto failed;
2865 value = ast2obj_expr(o->v.If.test);
2866 if (!value) goto failed;
2867 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2868 goto failed;
2869 Py_DECREF(value);
2870 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2871 if (!value) goto failed;
2872 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2873 goto failed;
2874 Py_DECREF(value);
2875 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2876 if (!value) goto failed;
2877 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2878 goto failed;
2879 Py_DECREF(value);
2880 break;
2881 case With_kind:
2882 result = PyType_GenericNew(With_type, NULL, NULL);
2883 if (!result) goto failed;
2884 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
2885 if (!value) goto failed;
2886 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2887 goto failed;
2888 Py_DECREF(value);
2889 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2890 if (!value) goto failed;
2891 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2892 goto failed;
2893 Py_DECREF(value);
2894 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002895 case AsyncWith_kind:
2896 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
2897 if (!result) goto failed;
2898 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
2899 if (!value) goto failed;
2900 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2901 goto failed;
2902 Py_DECREF(value);
2903 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
2904 if (!value) goto failed;
2905 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2906 goto failed;
2907 Py_DECREF(value);
2908 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002909 case Raise_kind:
2910 result = PyType_GenericNew(Raise_type, NULL, NULL);
2911 if (!result) goto failed;
2912 value = ast2obj_expr(o->v.Raise.exc);
2913 if (!value) goto failed;
2914 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
2915 goto failed;
2916 Py_DECREF(value);
2917 value = ast2obj_expr(o->v.Raise.cause);
2918 if (!value) goto failed;
2919 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
2920 goto failed;
2921 Py_DECREF(value);
2922 break;
2923 case Try_kind:
2924 result = PyType_GenericNew(Try_type, NULL, NULL);
2925 if (!result) goto failed;
2926 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
2927 if (!value) goto failed;
2928 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2929 goto failed;
2930 Py_DECREF(value);
2931 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
2932 if (!value) goto failed;
2933 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
2934 goto failed;
2935 Py_DECREF(value);
2936 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
2937 if (!value) goto failed;
2938 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2939 goto failed;
2940 Py_DECREF(value);
2941 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
2942 if (!value) goto failed;
2943 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
2944 goto failed;
2945 Py_DECREF(value);
2946 break;
2947 case Assert_kind:
2948 result = PyType_GenericNew(Assert_type, NULL, NULL);
2949 if (!result) goto failed;
2950 value = ast2obj_expr(o->v.Assert.test);
2951 if (!value) goto failed;
2952 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2953 goto failed;
2954 Py_DECREF(value);
2955 value = ast2obj_expr(o->v.Assert.msg);
2956 if (!value) goto failed;
2957 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
2958 goto failed;
2959 Py_DECREF(value);
2960 break;
2961 case Import_kind:
2962 result = PyType_GenericNew(Import_type, NULL, NULL);
2963 if (!result) goto failed;
2964 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2965 if (!value) goto failed;
2966 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2967 goto failed;
2968 Py_DECREF(value);
2969 break;
2970 case ImportFrom_kind:
2971 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
2972 if (!result) goto failed;
2973 value = ast2obj_identifier(o->v.ImportFrom.module);
2974 if (!value) goto failed;
2975 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
2976 goto failed;
2977 Py_DECREF(value);
2978 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
2979 if (!value) goto failed;
2980 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2981 goto failed;
2982 Py_DECREF(value);
2983 value = ast2obj_int(o->v.ImportFrom.level);
2984 if (!value) goto failed;
2985 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
2986 goto failed;
2987 Py_DECREF(value);
2988 break;
2989 case Global_kind:
2990 result = PyType_GenericNew(Global_type, NULL, NULL);
2991 if (!result) goto failed;
2992 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
2993 if (!value) goto failed;
2994 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2995 goto failed;
2996 Py_DECREF(value);
2997 break;
2998 case Nonlocal_kind:
2999 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3000 if (!result) goto failed;
3001 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3002 if (!value) goto failed;
3003 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3004 goto failed;
3005 Py_DECREF(value);
3006 break;
3007 case Expr_kind:
3008 result = PyType_GenericNew(Expr_type, NULL, NULL);
3009 if (!result) goto failed;
3010 value = ast2obj_expr(o->v.Expr.value);
3011 if (!value) goto failed;
3012 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3013 goto failed;
3014 Py_DECREF(value);
3015 break;
3016 case Pass_kind:
3017 result = PyType_GenericNew(Pass_type, NULL, NULL);
3018 if (!result) goto failed;
3019 break;
3020 case Break_kind:
3021 result = PyType_GenericNew(Break_type, NULL, NULL);
3022 if (!result) goto failed;
3023 break;
3024 case Continue_kind:
3025 result = PyType_GenericNew(Continue_type, NULL, NULL);
3026 if (!result) goto failed;
3027 break;
3028 }
3029 value = ast2obj_int(o->lineno);
3030 if (!value) goto failed;
3031 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3032 goto failed;
3033 Py_DECREF(value);
3034 value = ast2obj_int(o->col_offset);
3035 if (!value) goto failed;
3036 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3037 goto failed;
3038 Py_DECREF(value);
3039 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003040failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003041 Py_XDECREF(value);
3042 Py_XDECREF(result);
3043 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044}
3045
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003046PyObject*
3047ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003049 expr_ty o = (expr_ty)_o;
3050 PyObject *result = NULL, *value = NULL;
3051 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003052 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003053 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003054
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003055 switch (o->kind) {
3056 case BoolOp_kind:
3057 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3058 if (!result) goto failed;
3059 value = ast2obj_boolop(o->v.BoolOp.op);
3060 if (!value) goto failed;
3061 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3062 goto failed;
3063 Py_DECREF(value);
3064 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3065 if (!value) goto failed;
3066 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3067 goto failed;
3068 Py_DECREF(value);
3069 break;
3070 case BinOp_kind:
3071 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3072 if (!result) goto failed;
3073 value = ast2obj_expr(o->v.BinOp.left);
3074 if (!value) goto failed;
3075 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3076 goto failed;
3077 Py_DECREF(value);
3078 value = ast2obj_operator(o->v.BinOp.op);
3079 if (!value) goto failed;
3080 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3081 goto failed;
3082 Py_DECREF(value);
3083 value = ast2obj_expr(o->v.BinOp.right);
3084 if (!value) goto failed;
3085 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3086 goto failed;
3087 Py_DECREF(value);
3088 break;
3089 case UnaryOp_kind:
3090 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3091 if (!result) goto failed;
3092 value = ast2obj_unaryop(o->v.UnaryOp.op);
3093 if (!value) goto failed;
3094 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3095 goto failed;
3096 Py_DECREF(value);
3097 value = ast2obj_expr(o->v.UnaryOp.operand);
3098 if (!value) goto failed;
3099 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3100 goto failed;
3101 Py_DECREF(value);
3102 break;
3103 case Lambda_kind:
3104 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3105 if (!result) goto failed;
3106 value = ast2obj_arguments(o->v.Lambda.args);
3107 if (!value) goto failed;
3108 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3109 goto failed;
3110 Py_DECREF(value);
3111 value = ast2obj_expr(o->v.Lambda.body);
3112 if (!value) goto failed;
3113 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3114 goto failed;
3115 Py_DECREF(value);
3116 break;
3117 case IfExp_kind:
3118 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3119 if (!result) goto failed;
3120 value = ast2obj_expr(o->v.IfExp.test);
3121 if (!value) goto failed;
3122 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3123 goto failed;
3124 Py_DECREF(value);
3125 value = ast2obj_expr(o->v.IfExp.body);
3126 if (!value) goto failed;
3127 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3128 goto failed;
3129 Py_DECREF(value);
3130 value = ast2obj_expr(o->v.IfExp.orelse);
3131 if (!value) goto failed;
3132 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3133 goto failed;
3134 Py_DECREF(value);
3135 break;
3136 case Dict_kind:
3137 result = PyType_GenericNew(Dict_type, NULL, NULL);
3138 if (!result) goto failed;
3139 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3140 if (!value) goto failed;
3141 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3142 goto failed;
3143 Py_DECREF(value);
3144 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3145 if (!value) goto failed;
3146 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3147 goto failed;
3148 Py_DECREF(value);
3149 break;
3150 case Set_kind:
3151 result = PyType_GenericNew(Set_type, NULL, NULL);
3152 if (!result) goto failed;
3153 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3154 if (!value) goto failed;
3155 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3156 goto failed;
3157 Py_DECREF(value);
3158 break;
3159 case ListComp_kind:
3160 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3161 if (!result) goto failed;
3162 value = ast2obj_expr(o->v.ListComp.elt);
3163 if (!value) goto failed;
3164 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3165 goto failed;
3166 Py_DECREF(value);
3167 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3168 if (!value) goto failed;
3169 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3170 goto failed;
3171 Py_DECREF(value);
3172 break;
3173 case SetComp_kind:
3174 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3175 if (!result) goto failed;
3176 value = ast2obj_expr(o->v.SetComp.elt);
3177 if (!value) goto failed;
3178 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3179 goto failed;
3180 Py_DECREF(value);
3181 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3182 if (!value) goto failed;
3183 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3184 goto failed;
3185 Py_DECREF(value);
3186 break;
3187 case DictComp_kind:
3188 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3189 if (!result) goto failed;
3190 value = ast2obj_expr(o->v.DictComp.key);
3191 if (!value) goto failed;
3192 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3193 goto failed;
3194 Py_DECREF(value);
3195 value = ast2obj_expr(o->v.DictComp.value);
3196 if (!value) goto failed;
3197 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3198 goto failed;
3199 Py_DECREF(value);
3200 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3201 if (!value) goto failed;
3202 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3203 goto failed;
3204 Py_DECREF(value);
3205 break;
3206 case GeneratorExp_kind:
3207 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3208 if (!result) goto failed;
3209 value = ast2obj_expr(o->v.GeneratorExp.elt);
3210 if (!value) goto failed;
3211 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3212 goto failed;
3213 Py_DECREF(value);
3214 value = ast2obj_list(o->v.GeneratorExp.generators,
3215 ast2obj_comprehension);
3216 if (!value) goto failed;
3217 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3218 goto failed;
3219 Py_DECREF(value);
3220 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003221 case Await_kind:
3222 result = PyType_GenericNew(Await_type, NULL, NULL);
3223 if (!result) goto failed;
3224 value = ast2obj_expr(o->v.Await.value);
3225 if (!value) goto failed;
3226 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3227 goto failed;
3228 Py_DECREF(value);
3229 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003230 case Yield_kind:
3231 result = PyType_GenericNew(Yield_type, NULL, NULL);
3232 if (!result) goto failed;
3233 value = ast2obj_expr(o->v.Yield.value);
3234 if (!value) goto failed;
3235 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3236 goto failed;
3237 Py_DECREF(value);
3238 break;
3239 case YieldFrom_kind:
3240 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3241 if (!result) goto failed;
3242 value = ast2obj_expr(o->v.YieldFrom.value);
3243 if (!value) goto failed;
3244 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3245 goto failed;
3246 Py_DECREF(value);
3247 break;
3248 case Compare_kind:
3249 result = PyType_GenericNew(Compare_type, NULL, NULL);
3250 if (!result) goto failed;
3251 value = ast2obj_expr(o->v.Compare.left);
3252 if (!value) goto failed;
3253 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3254 goto failed;
3255 Py_DECREF(value);
3256 {
3257 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3258 value = PyList_New(n);
3259 if (!value) goto failed;
3260 for(i = 0; i < n; i++)
3261 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003263 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003264 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3265 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003266 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003267 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003268 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003269 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3270 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003271 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003272 break;
3273 case Call_kind:
3274 result = PyType_GenericNew(Call_type, NULL, NULL);
3275 if (!result) goto failed;
3276 value = ast2obj_expr(o->v.Call.func);
3277 if (!value) goto failed;
3278 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3279 goto failed;
3280 Py_DECREF(value);
3281 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3282 if (!value) goto failed;
3283 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3284 goto failed;
3285 Py_DECREF(value);
3286 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3287 if (!value) goto failed;
3288 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3289 goto failed;
3290 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003291 break;
3292 case Num_kind:
3293 result = PyType_GenericNew(Num_type, NULL, NULL);
3294 if (!result) goto failed;
3295 value = ast2obj_object(o->v.Num.n);
3296 if (!value) goto failed;
3297 if (_PyObject_SetAttrId(result, &PyId_n, value) == -1)
3298 goto failed;
3299 Py_DECREF(value);
3300 break;
3301 case Str_kind:
3302 result = PyType_GenericNew(Str_type, NULL, NULL);
3303 if (!result) goto failed;
3304 value = ast2obj_string(o->v.Str.s);
3305 if (!value) goto failed;
3306 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3307 goto failed;
3308 Py_DECREF(value);
3309 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003310 case FormattedValue_kind:
3311 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3312 if (!result) goto failed;
3313 value = ast2obj_expr(o->v.FormattedValue.value);
3314 if (!value) goto failed;
3315 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3316 goto failed;
3317 Py_DECREF(value);
3318 value = ast2obj_int(o->v.FormattedValue.conversion);
3319 if (!value) goto failed;
3320 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3321 goto failed;
3322 Py_DECREF(value);
3323 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3324 if (!value) goto failed;
3325 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3326 goto failed;
3327 Py_DECREF(value);
3328 break;
3329 case JoinedStr_kind:
3330 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3331 if (!result) goto failed;
3332 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3333 if (!value) goto failed;
3334 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3335 goto failed;
3336 Py_DECREF(value);
3337 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003338 case Bytes_kind:
3339 result = PyType_GenericNew(Bytes_type, NULL, NULL);
3340 if (!result) goto failed;
3341 value = ast2obj_bytes(o->v.Bytes.s);
3342 if (!value) goto failed;
3343 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3344 goto failed;
3345 Py_DECREF(value);
3346 break;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003347 case NameConstant_kind:
3348 result = PyType_GenericNew(NameConstant_type, NULL, NULL);
3349 if (!result) goto failed;
3350 value = ast2obj_singleton(o->v.NameConstant.value);
3351 if (!value) goto failed;
3352 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3353 goto failed;
3354 Py_DECREF(value);
3355 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003356 case Ellipsis_kind:
3357 result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
3358 if (!result) goto failed;
3359 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003360 case Constant_kind:
3361 result = PyType_GenericNew(Constant_type, NULL, NULL);
3362 if (!result) goto failed;
3363 value = ast2obj_constant(o->v.Constant.value);
3364 if (!value) goto failed;
3365 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3366 goto failed;
3367 Py_DECREF(value);
3368 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003369 case Attribute_kind:
3370 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3371 if (!result) goto failed;
3372 value = ast2obj_expr(o->v.Attribute.value);
3373 if (!value) goto failed;
3374 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3375 goto failed;
3376 Py_DECREF(value);
3377 value = ast2obj_identifier(o->v.Attribute.attr);
3378 if (!value) goto failed;
3379 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3380 goto failed;
3381 Py_DECREF(value);
3382 value = ast2obj_expr_context(o->v.Attribute.ctx);
3383 if (!value) goto failed;
3384 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3385 goto failed;
3386 Py_DECREF(value);
3387 break;
3388 case Subscript_kind:
3389 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3390 if (!result) goto failed;
3391 value = ast2obj_expr(o->v.Subscript.value);
3392 if (!value) goto failed;
3393 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3394 goto failed;
3395 Py_DECREF(value);
3396 value = ast2obj_slice(o->v.Subscript.slice);
3397 if (!value) goto failed;
3398 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3399 goto failed;
3400 Py_DECREF(value);
3401 value = ast2obj_expr_context(o->v.Subscript.ctx);
3402 if (!value) goto failed;
3403 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3404 goto failed;
3405 Py_DECREF(value);
3406 break;
3407 case Starred_kind:
3408 result = PyType_GenericNew(Starred_type, NULL, NULL);
3409 if (!result) goto failed;
3410 value = ast2obj_expr(o->v.Starred.value);
3411 if (!value) goto failed;
3412 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3413 goto failed;
3414 Py_DECREF(value);
3415 value = ast2obj_expr_context(o->v.Starred.ctx);
3416 if (!value) goto failed;
3417 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3418 goto failed;
3419 Py_DECREF(value);
3420 break;
3421 case Name_kind:
3422 result = PyType_GenericNew(Name_type, NULL, NULL);
3423 if (!result) goto failed;
3424 value = ast2obj_identifier(o->v.Name.id);
3425 if (!value) goto failed;
3426 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3427 goto failed;
3428 Py_DECREF(value);
3429 value = ast2obj_expr_context(o->v.Name.ctx);
3430 if (!value) goto failed;
3431 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3432 goto failed;
3433 Py_DECREF(value);
3434 break;
3435 case List_kind:
3436 result = PyType_GenericNew(List_type, NULL, NULL);
3437 if (!result) goto failed;
3438 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3439 if (!value) goto failed;
3440 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3441 goto failed;
3442 Py_DECREF(value);
3443 value = ast2obj_expr_context(o->v.List.ctx);
3444 if (!value) goto failed;
3445 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3446 goto failed;
3447 Py_DECREF(value);
3448 break;
3449 case Tuple_kind:
3450 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3451 if (!result) goto failed;
3452 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3453 if (!value) goto failed;
3454 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3455 goto failed;
3456 Py_DECREF(value);
3457 value = ast2obj_expr_context(o->v.Tuple.ctx);
3458 if (!value) goto failed;
3459 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3460 goto failed;
3461 Py_DECREF(value);
3462 break;
3463 }
3464 value = ast2obj_int(o->lineno);
3465 if (!value) goto failed;
3466 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3467 goto failed;
3468 Py_DECREF(value);
3469 value = ast2obj_int(o->col_offset);
3470 if (!value) goto failed;
3471 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3472 goto failed;
3473 Py_DECREF(value);
3474 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003475failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003476 Py_XDECREF(value);
3477 Py_XDECREF(result);
3478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003479}
3480
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003481PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003482{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003483 switch(o) {
3484 case Load:
3485 Py_INCREF(Load_singleton);
3486 return Load_singleton;
3487 case Store:
3488 Py_INCREF(Store_singleton);
3489 return Store_singleton;
3490 case Del:
3491 Py_INCREF(Del_singleton);
3492 return Del_singleton;
3493 case AugLoad:
3494 Py_INCREF(AugLoad_singleton);
3495 return AugLoad_singleton;
3496 case AugStore:
3497 Py_INCREF(AugStore_singleton);
3498 return AugStore_singleton;
3499 case Param:
3500 Py_INCREF(Param_singleton);
3501 return Param_singleton;
3502 default:
3503 /* should never happen, but just in case ... */
3504 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3505 return NULL;
3506 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003508PyObject*
3509ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003510{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003511 slice_ty o = (slice_ty)_o;
3512 PyObject *result = NULL, *value = NULL;
3513 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003514 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003515 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003516
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003517 switch (o->kind) {
3518 case Slice_kind:
3519 result = PyType_GenericNew(Slice_type, NULL, NULL);
3520 if (!result) goto failed;
3521 value = ast2obj_expr(o->v.Slice.lower);
3522 if (!value) goto failed;
3523 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3524 goto failed;
3525 Py_DECREF(value);
3526 value = ast2obj_expr(o->v.Slice.upper);
3527 if (!value) goto failed;
3528 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3529 goto failed;
3530 Py_DECREF(value);
3531 value = ast2obj_expr(o->v.Slice.step);
3532 if (!value) goto failed;
3533 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3534 goto failed;
3535 Py_DECREF(value);
3536 break;
3537 case ExtSlice_kind:
3538 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3539 if (!result) goto failed;
3540 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3541 if (!value) goto failed;
3542 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3543 goto failed;
3544 Py_DECREF(value);
3545 break;
3546 case Index_kind:
3547 result = PyType_GenericNew(Index_type, NULL, NULL);
3548 if (!result) goto failed;
3549 value = ast2obj_expr(o->v.Index.value);
3550 if (!value) goto failed;
3551 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3552 goto failed;
3553 Py_DECREF(value);
3554 break;
3555 }
3556 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003557failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003558 Py_XDECREF(value);
3559 Py_XDECREF(result);
3560 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003561}
3562
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003563PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003565 switch(o) {
3566 case And:
3567 Py_INCREF(And_singleton);
3568 return And_singleton;
3569 case Or:
3570 Py_INCREF(Or_singleton);
3571 return Or_singleton;
3572 default:
3573 /* should never happen, but just in case ... */
3574 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3575 return NULL;
3576 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003577}
3578PyObject* ast2obj_operator(operator_ty o)
3579{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003580 switch(o) {
3581 case Add:
3582 Py_INCREF(Add_singleton);
3583 return Add_singleton;
3584 case Sub:
3585 Py_INCREF(Sub_singleton);
3586 return Sub_singleton;
3587 case Mult:
3588 Py_INCREF(Mult_singleton);
3589 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003590 case MatMult:
3591 Py_INCREF(MatMult_singleton);
3592 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003593 case Div:
3594 Py_INCREF(Div_singleton);
3595 return Div_singleton;
3596 case Mod:
3597 Py_INCREF(Mod_singleton);
3598 return Mod_singleton;
3599 case Pow:
3600 Py_INCREF(Pow_singleton);
3601 return Pow_singleton;
3602 case LShift:
3603 Py_INCREF(LShift_singleton);
3604 return LShift_singleton;
3605 case RShift:
3606 Py_INCREF(RShift_singleton);
3607 return RShift_singleton;
3608 case BitOr:
3609 Py_INCREF(BitOr_singleton);
3610 return BitOr_singleton;
3611 case BitXor:
3612 Py_INCREF(BitXor_singleton);
3613 return BitXor_singleton;
3614 case BitAnd:
3615 Py_INCREF(BitAnd_singleton);
3616 return BitAnd_singleton;
3617 case FloorDiv:
3618 Py_INCREF(FloorDiv_singleton);
3619 return FloorDiv_singleton;
3620 default:
3621 /* should never happen, but just in case ... */
3622 PyErr_Format(PyExc_SystemError, "unknown operator found");
3623 return NULL;
3624 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003625}
3626PyObject* ast2obj_unaryop(unaryop_ty o)
3627{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003628 switch(o) {
3629 case Invert:
3630 Py_INCREF(Invert_singleton);
3631 return Invert_singleton;
3632 case Not:
3633 Py_INCREF(Not_singleton);
3634 return Not_singleton;
3635 case UAdd:
3636 Py_INCREF(UAdd_singleton);
3637 return UAdd_singleton;
3638 case USub:
3639 Py_INCREF(USub_singleton);
3640 return USub_singleton;
3641 default:
3642 /* should never happen, but just in case ... */
3643 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3644 return NULL;
3645 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003646}
3647PyObject* ast2obj_cmpop(cmpop_ty o)
3648{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003649 switch(o) {
3650 case Eq:
3651 Py_INCREF(Eq_singleton);
3652 return Eq_singleton;
3653 case NotEq:
3654 Py_INCREF(NotEq_singleton);
3655 return NotEq_singleton;
3656 case Lt:
3657 Py_INCREF(Lt_singleton);
3658 return Lt_singleton;
3659 case LtE:
3660 Py_INCREF(LtE_singleton);
3661 return LtE_singleton;
3662 case Gt:
3663 Py_INCREF(Gt_singleton);
3664 return Gt_singleton;
3665 case GtE:
3666 Py_INCREF(GtE_singleton);
3667 return GtE_singleton;
3668 case Is:
3669 Py_INCREF(Is_singleton);
3670 return Is_singleton;
3671 case IsNot:
3672 Py_INCREF(IsNot_singleton);
3673 return IsNot_singleton;
3674 case In:
3675 Py_INCREF(In_singleton);
3676 return In_singleton;
3677 case NotIn:
3678 Py_INCREF(NotIn_singleton);
3679 return NotIn_singleton;
3680 default:
3681 /* should never happen, but just in case ... */
3682 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3683 return NULL;
3684 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003685}
3686PyObject*
3687ast2obj_comprehension(void* _o)
3688{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003689 comprehension_ty o = (comprehension_ty)_o;
3690 PyObject *result = NULL, *value = NULL;
3691 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003692 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003693 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003694
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003695 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3696 if (!result) return NULL;
3697 value = ast2obj_expr(o->target);
3698 if (!value) goto failed;
3699 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3700 goto failed;
3701 Py_DECREF(value);
3702 value = ast2obj_expr(o->iter);
3703 if (!value) goto failed;
3704 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3705 goto failed;
3706 Py_DECREF(value);
3707 value = ast2obj_list(o->ifs, ast2obj_expr);
3708 if (!value) goto failed;
3709 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3710 goto failed;
3711 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003712 value = ast2obj_int(o->is_async);
3713 if (!value) goto failed;
3714 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3715 goto failed;
3716 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003717 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003718failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003719 Py_XDECREF(value);
3720 Py_XDECREF(result);
3721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003722}
3723
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003724PyObject*
3725ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003726{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003727 excepthandler_ty o = (excepthandler_ty)_o;
3728 PyObject *result = NULL, *value = NULL;
3729 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003730 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003731 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003732
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003733 switch (o->kind) {
3734 case ExceptHandler_kind:
3735 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3736 if (!result) goto failed;
3737 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003738 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003739 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3740 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003741 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003742 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003743 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003744 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3745 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003746 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003747 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3748 if (!value) goto failed;
3749 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3750 goto failed;
3751 Py_DECREF(value);
3752 break;
3753 }
3754 value = ast2obj_int(o->lineno);
3755 if (!value) goto failed;
3756 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3757 goto failed;
3758 Py_DECREF(value);
3759 value = ast2obj_int(o->col_offset);
3760 if (!value) goto failed;
3761 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3762 goto failed;
3763 Py_DECREF(value);
3764 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003765failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003766 Py_XDECREF(value);
3767 Py_XDECREF(result);
3768 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003769}
3770
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003771PyObject*
3772ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003773{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003774 arguments_ty o = (arguments_ty)_o;
3775 PyObject *result = NULL, *value = NULL;
3776 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003777 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003778 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003779
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003780 result = PyType_GenericNew(arguments_type, NULL, NULL);
3781 if (!result) return NULL;
3782 value = ast2obj_list(o->args, ast2obj_arg);
3783 if (!value) goto failed;
3784 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3785 goto failed;
3786 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003787 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003788 if (!value) goto failed;
3789 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3790 goto failed;
3791 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003792 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3793 if (!value) goto failed;
3794 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3795 goto failed;
3796 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003797 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003798 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003799 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003800 goto failed;
3801 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003802 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003803 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003804 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003805 goto failed;
3806 Py_DECREF(value);
3807 value = ast2obj_list(o->defaults, ast2obj_expr);
3808 if (!value) goto failed;
3809 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3810 goto failed;
3811 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003812 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003813failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003814 Py_XDECREF(value);
3815 Py_XDECREF(result);
3816 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003817}
3818
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003819PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003820ast2obj_arg(void* _o)
3821{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003822 arg_ty o = (arg_ty)_o;
3823 PyObject *result = NULL, *value = NULL;
3824 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003825 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003826 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003827
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003828 result = PyType_GenericNew(arg_type, NULL, NULL);
3829 if (!result) return NULL;
3830 value = ast2obj_identifier(o->arg);
3831 if (!value) goto failed;
3832 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3833 goto failed;
3834 Py_DECREF(value);
3835 value = ast2obj_expr(o->annotation);
3836 if (!value) goto failed;
3837 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
3838 goto failed;
3839 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003840 value = ast2obj_int(o->lineno);
3841 if (!value) goto failed;
3842 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3843 goto failed;
3844 Py_DECREF(value);
3845 value = ast2obj_int(o->col_offset);
3846 if (!value) goto failed;
3847 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3848 goto failed;
3849 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003850 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00003851failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003852 Py_XDECREF(value);
3853 Py_XDECREF(result);
3854 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003855}
3856
3857PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003858ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003859{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003860 keyword_ty o = (keyword_ty)_o;
3861 PyObject *result = NULL, *value = NULL;
3862 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003863 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003864 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003865
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003866 result = PyType_GenericNew(keyword_type, NULL, NULL);
3867 if (!result) return NULL;
3868 value = ast2obj_identifier(o->arg);
3869 if (!value) goto failed;
3870 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3871 goto failed;
3872 Py_DECREF(value);
3873 value = ast2obj_expr(o->value);
3874 if (!value) goto failed;
3875 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3876 goto failed;
3877 Py_DECREF(value);
3878 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003879failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003880 Py_XDECREF(value);
3881 Py_XDECREF(result);
3882 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003883}
3884
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003885PyObject*
3886ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003887{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003888 alias_ty o = (alias_ty)_o;
3889 PyObject *result = NULL, *value = NULL;
3890 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003891 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003892 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003893
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003894 result = PyType_GenericNew(alias_type, NULL, NULL);
3895 if (!result) return NULL;
3896 value = ast2obj_identifier(o->name);
3897 if (!value) goto failed;
3898 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3899 goto failed;
3900 Py_DECREF(value);
3901 value = ast2obj_identifier(o->asname);
3902 if (!value) goto failed;
3903 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
3904 goto failed;
3905 Py_DECREF(value);
3906 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003907failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003908 Py_XDECREF(value);
3909 Py_XDECREF(result);
3910 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911}
3912
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003913PyObject*
3914ast2obj_withitem(void* _o)
3915{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003916 withitem_ty o = (withitem_ty)_o;
3917 PyObject *result = NULL, *value = NULL;
3918 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003919 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003920 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003921
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003922 result = PyType_GenericNew(withitem_type, NULL, NULL);
3923 if (!result) return NULL;
3924 value = ast2obj_expr(o->context_expr);
3925 if (!value) goto failed;
3926 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
3927 goto failed;
3928 Py_DECREF(value);
3929 value = ast2obj_expr(o->optional_vars);
3930 if (!value) goto failed;
3931 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
3932 goto failed;
3933 Py_DECREF(value);
3934 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003935failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003936 Py_XDECREF(value);
3937 Py_XDECREF(result);
3938 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003939}
3940
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003941
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003942int
3943obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3944{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003945 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003946
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003947 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003948
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003949 if (obj == Py_None) {
3950 *out = NULL;
3951 return 0;
3952 }
3953 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3954 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003955 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003956 }
3957 if (isinstance) {
3958 asdl_seq* body;
3959
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003960 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
3961 return 1;
3962 }
3963 if (tmp == NULL) {
3964 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
3965 return 1;
3966 }
3967 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003968 int res;
3969 Py_ssize_t len;
3970 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003971 if (!PyList_Check(tmp)) {
3972 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3973 goto failed;
3974 }
3975 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003976 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003977 if (body == NULL) goto failed;
3978 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003979 stmt_ty val;
3980 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003981 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03003982 if (len != PyList_GET_SIZE(tmp)) {
3983 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
3984 goto failed;
3985 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003986 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003987 }
Victor Stinner1acc1292013-07-27 00:03:47 +02003988 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003989 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03003990 *out = Module(body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003991 if (*out == NULL) goto failed;
3992 return 0;
3993 }
3994 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
3995 if (isinstance == -1) {
3996 return 1;
3997 }
3998 if (isinstance) {
3999 asdl_seq* body;
4000
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004001 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4002 return 1;
4003 }
4004 if (tmp == NULL) {
4005 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4006 return 1;
4007 }
4008 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004009 int res;
4010 Py_ssize_t len;
4011 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004012 if (!PyList_Check(tmp)) {
4013 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4014 goto failed;
4015 }
4016 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004017 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004018 if (body == NULL) goto failed;
4019 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004020 stmt_ty val;
4021 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004022 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004023 if (len != PyList_GET_SIZE(tmp)) {
4024 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4025 goto failed;
4026 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004027 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004028 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004029 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004030 }
4031 *out = Interactive(body, arena);
4032 if (*out == NULL) goto failed;
4033 return 0;
4034 }
4035 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4036 if (isinstance == -1) {
4037 return 1;
4038 }
4039 if (isinstance) {
4040 expr_ty body;
4041
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004042 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4043 return 1;
4044 }
4045 if (tmp == NULL) {
4046 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4047 return 1;
4048 }
4049 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004050 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004051 res = obj2ast_expr(tmp, &body, arena);
4052 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004053 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004054 }
4055 *out = Expression(body, arena);
4056 if (*out == NULL) goto failed;
4057 return 0;
4058 }
4059 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4060 if (isinstance == -1) {
4061 return 1;
4062 }
4063 if (isinstance) {
4064 asdl_seq* body;
4065
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004066 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4067 return 1;
4068 }
4069 if (tmp == NULL) {
4070 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4071 return 1;
4072 }
4073 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004074 int res;
4075 Py_ssize_t len;
4076 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004077 if (!PyList_Check(tmp)) {
4078 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4079 goto failed;
4080 }
4081 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004082 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004083 if (body == NULL) goto failed;
4084 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004085 stmt_ty val;
4086 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004087 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004088 if (len != PyList_GET_SIZE(tmp)) {
4089 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4090 goto failed;
4091 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004092 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004093 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004094 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004095 }
4096 *out = Suite(body, arena);
4097 if (*out == NULL) goto failed;
4098 return 0;
4099 }
4100
4101 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4102 failed:
4103 Py_XDECREF(tmp);
4104 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004105}
4106
4107int
4108obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4109{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004110 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004111
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004112 PyObject *tmp = NULL;
4113 int lineno;
4114 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004115
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004116 if (obj == Py_None) {
4117 *out = NULL;
4118 return 0;
4119 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004120 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4121 return 1;
4122 }
4123 if (tmp == NULL) {
4124 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4125 return 1;
4126 }
4127 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004128 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004129 res = obj2ast_int(tmp, &lineno, arena);
4130 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004131 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004132 }
4133 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004134 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004135 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004136 if (tmp == NULL) {
4137 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4138 return 1;
4139 }
4140 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004141 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004142 res = obj2ast_int(tmp, &col_offset, arena);
4143 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004144 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004145 }
4146 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4147 if (isinstance == -1) {
4148 return 1;
4149 }
4150 if (isinstance) {
4151 identifier name;
4152 arguments_ty args;
4153 asdl_seq* body;
4154 asdl_seq* decorator_list;
4155 expr_ty returns;
4156
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004157 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4158 return 1;
4159 }
4160 if (tmp == NULL) {
4161 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4162 return 1;
4163 }
4164 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004165 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004166 res = obj2ast_identifier(tmp, &name, arena);
4167 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004168 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004169 }
4170 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004171 return 1;
4172 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004173 if (tmp == NULL) {
4174 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4175 return 1;
4176 }
4177 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004178 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004179 res = obj2ast_arguments(tmp, &args, arena);
4180 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004181 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004182 }
4183 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004184 return 1;
4185 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004186 if (tmp == NULL) {
4187 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4188 return 1;
4189 }
4190 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004191 int res;
4192 Py_ssize_t len;
4193 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004194 if (!PyList_Check(tmp)) {
4195 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4196 goto failed;
4197 }
4198 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004199 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004200 if (body == NULL) goto failed;
4201 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004202 stmt_ty val;
4203 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004204 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004205 if (len != PyList_GET_SIZE(tmp)) {
4206 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4207 goto failed;
4208 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004209 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004210 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004211 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004212 }
4213 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004214 return 1;
4215 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004216 if (tmp == NULL) {
4217 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4218 return 1;
4219 }
4220 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004221 int res;
4222 Py_ssize_t len;
4223 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004224 if (!PyList_Check(tmp)) {
4225 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4226 goto failed;
4227 }
4228 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004229 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004230 if (decorator_list == NULL) goto failed;
4231 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004232 expr_ty val;
4233 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004234 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004235 if (len != PyList_GET_SIZE(tmp)) {
4236 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4237 goto failed;
4238 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004239 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004240 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004241 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004242 }
4243 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004244 return 1;
4245 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004246 if (tmp == NULL || tmp == Py_None) {
4247 Py_CLEAR(tmp);
4248 returns = NULL;
4249 }
4250 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004251 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004252 res = obj2ast_expr(tmp, &returns, arena);
4253 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004254 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004255 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03004256 *out = FunctionDef(name, args, body, decorator_list, returns, lineno,
4257 col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004258 if (*out == NULL) goto failed;
4259 return 0;
4260 }
Yury Selivanov75445082015-05-11 22:57:16 -04004261 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4262 if (isinstance == -1) {
4263 return 1;
4264 }
4265 if (isinstance) {
4266 identifier name;
4267 arguments_ty args;
4268 asdl_seq* body;
4269 asdl_seq* decorator_list;
4270 expr_ty returns;
4271
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004272 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4273 return 1;
4274 }
4275 if (tmp == NULL) {
4276 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4277 return 1;
4278 }
4279 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004280 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004281 res = obj2ast_identifier(tmp, &name, arena);
4282 if (res != 0) goto failed;
4283 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004284 }
4285 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004286 return 1;
4287 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004288 if (tmp == NULL) {
4289 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4290 return 1;
4291 }
4292 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004293 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004294 res = obj2ast_arguments(tmp, &args, arena);
4295 if (res != 0) goto failed;
4296 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004297 }
4298 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004299 return 1;
4300 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004301 if (tmp == NULL) {
4302 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4303 return 1;
4304 }
4305 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004306 int res;
4307 Py_ssize_t len;
4308 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004309 if (!PyList_Check(tmp)) {
4310 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4311 goto failed;
4312 }
4313 len = PyList_GET_SIZE(tmp);
4314 body = _Py_asdl_seq_new(len, arena);
4315 if (body == NULL) goto failed;
4316 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004317 stmt_ty val;
4318 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004319 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004320 if (len != PyList_GET_SIZE(tmp)) {
4321 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4322 goto failed;
4323 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004324 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004325 }
4326 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004327 }
4328 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004329 return 1;
4330 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004331 if (tmp == NULL) {
4332 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4333 return 1;
4334 }
4335 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004336 int res;
4337 Py_ssize_t len;
4338 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004339 if (!PyList_Check(tmp)) {
4340 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4341 goto failed;
4342 }
4343 len = PyList_GET_SIZE(tmp);
4344 decorator_list = _Py_asdl_seq_new(len, arena);
4345 if (decorator_list == NULL) goto failed;
4346 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004347 expr_ty val;
4348 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004349 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004350 if (len != PyList_GET_SIZE(tmp)) {
4351 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4352 goto failed;
4353 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004354 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004355 }
4356 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004357 }
4358 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004359 return 1;
4360 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004361 if (tmp == NULL || tmp == Py_None) {
4362 Py_CLEAR(tmp);
4363 returns = NULL;
4364 }
4365 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004366 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004367 res = obj2ast_expr(tmp, &returns, arena);
4368 if (res != 0) goto failed;
4369 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004370 }
4371 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03004372 lineno, col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004373 if (*out == NULL) goto failed;
4374 return 0;
4375 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004376 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4377 if (isinstance == -1) {
4378 return 1;
4379 }
4380 if (isinstance) {
4381 identifier name;
4382 asdl_seq* bases;
4383 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004384 asdl_seq* body;
4385 asdl_seq* decorator_list;
4386
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004387 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4388 return 1;
4389 }
4390 if (tmp == NULL) {
4391 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4392 return 1;
4393 }
4394 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004395 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004396 res = obj2ast_identifier(tmp, &name, arena);
4397 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004398 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004399 }
4400 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004401 return 1;
4402 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004403 if (tmp == NULL) {
4404 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4405 return 1;
4406 }
4407 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004408 int res;
4409 Py_ssize_t len;
4410 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004411 if (!PyList_Check(tmp)) {
4412 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4413 goto failed;
4414 }
4415 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004416 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004417 if (bases == NULL) goto failed;
4418 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004419 expr_ty val;
4420 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004421 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004422 if (len != PyList_GET_SIZE(tmp)) {
4423 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4424 goto failed;
4425 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004426 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004427 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004428 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004429 }
4430 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004431 return 1;
4432 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004433 if (tmp == NULL) {
4434 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4435 return 1;
4436 }
4437 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004438 int res;
4439 Py_ssize_t len;
4440 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004441 if (!PyList_Check(tmp)) {
4442 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4443 goto failed;
4444 }
4445 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004446 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004447 if (keywords == NULL) goto failed;
4448 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004449 keyword_ty val;
4450 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004451 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004452 if (len != PyList_GET_SIZE(tmp)) {
4453 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4454 goto failed;
4455 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004456 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004457 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004458 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004459 }
4460 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004461 return 1;
4462 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004463 if (tmp == NULL) {
4464 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4465 return 1;
4466 }
4467 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004468 int res;
4469 Py_ssize_t len;
4470 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004471 if (!PyList_Check(tmp)) {
4472 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4473 goto failed;
4474 }
4475 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004476 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004477 if (body == NULL) goto failed;
4478 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004479 stmt_ty val;
4480 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004481 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004482 if (len != PyList_GET_SIZE(tmp)) {
4483 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4484 goto failed;
4485 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004486 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004487 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004488 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004489 }
4490 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004491 return 1;
4492 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004493 if (tmp == NULL) {
4494 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4495 return 1;
4496 }
4497 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004498 int res;
4499 Py_ssize_t len;
4500 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004501 if (!PyList_Check(tmp)) {
4502 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4503 goto failed;
4504 }
4505 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004506 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004507 if (decorator_list == NULL) goto failed;
4508 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004509 expr_ty val;
4510 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004511 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004512 if (len != PyList_GET_SIZE(tmp)) {
4513 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4514 goto failed;
4515 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004516 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004517 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004518 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004519 }
Serhiy Storchaka2641ee52018-05-29 10:49:10 +03004520 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
4521 col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004522 if (*out == NULL) goto failed;
4523 return 0;
4524 }
4525 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4526 if (isinstance == -1) {
4527 return 1;
4528 }
4529 if (isinstance) {
4530 expr_ty value;
4531
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004532 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4533 return 1;
4534 }
4535 if (tmp == NULL || tmp == Py_None) {
4536 Py_CLEAR(tmp);
4537 value = NULL;
4538 }
4539 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004540 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004541 res = obj2ast_expr(tmp, &value, arena);
4542 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004543 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004544 }
4545 *out = Return(value, lineno, col_offset, arena);
4546 if (*out == NULL) goto failed;
4547 return 0;
4548 }
4549 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4550 if (isinstance == -1) {
4551 return 1;
4552 }
4553 if (isinstance) {
4554 asdl_seq* targets;
4555
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004556 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4557 return 1;
4558 }
4559 if (tmp == NULL) {
4560 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4561 return 1;
4562 }
4563 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004564 int res;
4565 Py_ssize_t len;
4566 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004567 if (!PyList_Check(tmp)) {
4568 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4569 goto failed;
4570 }
4571 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004572 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004573 if (targets == NULL) goto failed;
4574 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004575 expr_ty val;
4576 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004577 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004578 if (len != PyList_GET_SIZE(tmp)) {
4579 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4580 goto failed;
4581 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004582 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004583 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004584 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004585 }
4586 *out = Delete(targets, lineno, col_offset, arena);
4587 if (*out == NULL) goto failed;
4588 return 0;
4589 }
4590 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4591 if (isinstance == -1) {
4592 return 1;
4593 }
4594 if (isinstance) {
4595 asdl_seq* targets;
4596 expr_ty value;
4597
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004598 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4599 return 1;
4600 }
4601 if (tmp == NULL) {
4602 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4603 return 1;
4604 }
4605 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004606 int res;
4607 Py_ssize_t len;
4608 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004609 if (!PyList_Check(tmp)) {
4610 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4611 goto failed;
4612 }
4613 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004614 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004615 if (targets == NULL) goto failed;
4616 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004617 expr_ty val;
4618 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004619 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004620 if (len != PyList_GET_SIZE(tmp)) {
4621 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4622 goto failed;
4623 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004624 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004625 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004626 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004627 }
4628 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004629 return 1;
4630 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004631 if (tmp == NULL) {
4632 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4633 return 1;
4634 }
4635 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004636 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004637 res = obj2ast_expr(tmp, &value, arena);
4638 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004639 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004640 }
4641 *out = Assign(targets, value, lineno, col_offset, arena);
4642 if (*out == NULL) goto failed;
4643 return 0;
4644 }
4645 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
4646 if (isinstance == -1) {
4647 return 1;
4648 }
4649 if (isinstance) {
4650 expr_ty target;
4651 operator_ty op;
4652 expr_ty value;
4653
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004654 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4655 return 1;
4656 }
4657 if (tmp == NULL) {
4658 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
4659 return 1;
4660 }
4661 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004662 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004663 res = obj2ast_expr(tmp, &target, arena);
4664 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004665 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004666 }
4667 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004668 return 1;
4669 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004670 if (tmp == NULL) {
4671 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
4672 return 1;
4673 }
4674 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004675 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004676 res = obj2ast_operator(tmp, &op, arena);
4677 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004678 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004679 }
4680 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004681 return 1;
4682 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004683 if (tmp == NULL) {
4684 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
4685 return 1;
4686 }
4687 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004688 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004689 res = obj2ast_expr(tmp, &value, arena);
4690 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004691 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004692 }
4693 *out = AugAssign(target, op, value, lineno, col_offset, arena);
4694 if (*out == NULL) goto failed;
4695 return 0;
4696 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004697 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
4698 if (isinstance == -1) {
4699 return 1;
4700 }
4701 if (isinstance) {
4702 expr_ty target;
4703 expr_ty annotation;
4704 expr_ty value;
4705 int simple;
4706
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004707 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4708 return 1;
4709 }
4710 if (tmp == NULL) {
4711 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
4712 return 1;
4713 }
4714 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004715 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004716 res = obj2ast_expr(tmp, &target, arena);
4717 if (res != 0) goto failed;
4718 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004719 }
4720 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004721 return 1;
4722 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004723 if (tmp == NULL) {
4724 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
4725 return 1;
4726 }
4727 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004728 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004729 res = obj2ast_expr(tmp, &annotation, arena);
4730 if (res != 0) goto failed;
4731 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004732 }
4733 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004734 return 1;
4735 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004736 if (tmp == NULL || tmp == Py_None) {
4737 Py_CLEAR(tmp);
4738 value = NULL;
4739 }
4740 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004741 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004742 res = obj2ast_expr(tmp, &value, arena);
4743 if (res != 0) goto failed;
4744 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004745 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004746 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
4747 return 1;
4748 }
4749 if (tmp == NULL) {
4750 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
4751 return 1;
4752 }
4753 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004754 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004755 res = obj2ast_int(tmp, &simple, arena);
4756 if (res != 0) goto failed;
4757 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004758 }
4759 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
4760 arena);
4761 if (*out == NULL) goto failed;
4762 return 0;
4763 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004764 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
4765 if (isinstance == -1) {
4766 return 1;
4767 }
4768 if (isinstance) {
4769 expr_ty target;
4770 expr_ty iter;
4771 asdl_seq* body;
4772 asdl_seq* orelse;
4773
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004774 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4775 return 1;
4776 }
4777 if (tmp == NULL) {
4778 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4779 return 1;
4780 }
4781 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004782 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004783 res = obj2ast_expr(tmp, &target, arena);
4784 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004785 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004786 }
4787 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004788 return 1;
4789 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004790 if (tmp == NULL) {
4791 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4792 return 1;
4793 }
4794 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004795 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004796 res = obj2ast_expr(tmp, &iter, arena);
4797 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004798 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004799 }
4800 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004801 return 1;
4802 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004803 if (tmp == NULL) {
4804 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4805 return 1;
4806 }
4807 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004808 int res;
4809 Py_ssize_t len;
4810 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004811 if (!PyList_Check(tmp)) {
4812 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4813 goto failed;
4814 }
4815 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004816 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004817 if (body == NULL) goto failed;
4818 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004819 stmt_ty val;
4820 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004821 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004822 if (len != PyList_GET_SIZE(tmp)) {
4823 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
4824 goto failed;
4825 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004826 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004827 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004828 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004829 }
4830 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004831 return 1;
4832 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004833 if (tmp == NULL) {
4834 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4835 return 1;
4836 }
4837 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004838 int res;
4839 Py_ssize_t len;
4840 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004841 if (!PyList_Check(tmp)) {
4842 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4843 goto failed;
4844 }
4845 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004846 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004847 if (orelse == NULL) goto failed;
4848 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004849 stmt_ty val;
4850 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004851 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004852 if (len != PyList_GET_SIZE(tmp)) {
4853 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
4854 goto failed;
4855 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004856 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004857 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004858 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004859 }
4860 *out = For(target, iter, body, orelse, lineno, col_offset, arena);
4861 if (*out == NULL) goto failed;
4862 return 0;
4863 }
Yury Selivanov75445082015-05-11 22:57:16 -04004864 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
4865 if (isinstance == -1) {
4866 return 1;
4867 }
4868 if (isinstance) {
4869 expr_ty target;
4870 expr_ty iter;
4871 asdl_seq* body;
4872 asdl_seq* orelse;
4873
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004874 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4875 return 1;
4876 }
4877 if (tmp == NULL) {
4878 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
4879 return 1;
4880 }
4881 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004882 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004883 res = obj2ast_expr(tmp, &target, arena);
4884 if (res != 0) goto failed;
4885 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004886 }
4887 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004888 return 1;
4889 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004890 if (tmp == NULL) {
4891 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
4892 return 1;
4893 }
4894 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004895 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004896 res = obj2ast_expr(tmp, &iter, arena);
4897 if (res != 0) goto failed;
4898 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004899 }
4900 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004901 return 1;
4902 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004903 if (tmp == NULL) {
4904 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
4905 return 1;
4906 }
4907 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004908 int res;
4909 Py_ssize_t len;
4910 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004911 if (!PyList_Check(tmp)) {
4912 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4913 goto failed;
4914 }
4915 len = PyList_GET_SIZE(tmp);
4916 body = _Py_asdl_seq_new(len, arena);
4917 if (body == NULL) goto failed;
4918 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004919 stmt_ty val;
4920 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004921 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004922 if (len != PyList_GET_SIZE(tmp)) {
4923 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
4924 goto failed;
4925 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004926 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004927 }
4928 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004929 }
4930 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004931 return 1;
4932 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004933 if (tmp == NULL) {
4934 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
4935 return 1;
4936 }
4937 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004938 int res;
4939 Py_ssize_t len;
4940 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004941 if (!PyList_Check(tmp)) {
4942 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4943 goto failed;
4944 }
4945 len = PyList_GET_SIZE(tmp);
4946 orelse = _Py_asdl_seq_new(len, arena);
4947 if (orelse == NULL) goto failed;
4948 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004949 stmt_ty val;
4950 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004951 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004952 if (len != PyList_GET_SIZE(tmp)) {
4953 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
4954 goto failed;
4955 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004956 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004957 }
4958 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004959 }
4960 *out = AsyncFor(target, iter, body, orelse, lineno, col_offset, arena);
4961 if (*out == NULL) goto failed;
4962 return 0;
4963 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004964 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
4965 if (isinstance == -1) {
4966 return 1;
4967 }
4968 if (isinstance) {
4969 expr_ty test;
4970 asdl_seq* body;
4971 asdl_seq* orelse;
4972
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004973 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
4974 return 1;
4975 }
4976 if (tmp == NULL) {
4977 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
4978 return 1;
4979 }
4980 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004981 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004982 res = obj2ast_expr(tmp, &test, arena);
4983 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004984 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004985 }
4986 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004987 return 1;
4988 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004989 if (tmp == NULL) {
4990 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
4991 return 1;
4992 }
4993 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004994 int res;
4995 Py_ssize_t len;
4996 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004997 if (!PyList_Check(tmp)) {
4998 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4999 goto failed;
5000 }
5001 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005002 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005003 if (body == NULL) goto failed;
5004 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005005 stmt_ty val;
5006 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005007 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005008 if (len != PyList_GET_SIZE(tmp)) {
5009 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5010 goto failed;
5011 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005012 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005013 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005014 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005015 }
5016 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005017 return 1;
5018 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005019 if (tmp == NULL) {
5020 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5021 return 1;
5022 }
5023 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005024 int res;
5025 Py_ssize_t len;
5026 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005027 if (!PyList_Check(tmp)) {
5028 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5029 goto failed;
5030 }
5031 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005032 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005033 if (orelse == NULL) goto failed;
5034 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005035 stmt_ty val;
5036 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005037 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005038 if (len != PyList_GET_SIZE(tmp)) {
5039 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5040 goto failed;
5041 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005042 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005043 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005044 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005045 }
5046 *out = While(test, body, orelse, lineno, col_offset, arena);
5047 if (*out == NULL) goto failed;
5048 return 0;
5049 }
5050 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5051 if (isinstance == -1) {
5052 return 1;
5053 }
5054 if (isinstance) {
5055 expr_ty test;
5056 asdl_seq* body;
5057 asdl_seq* orelse;
5058
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005059 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5060 return 1;
5061 }
5062 if (tmp == NULL) {
5063 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5064 return 1;
5065 }
5066 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005067 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005068 res = obj2ast_expr(tmp, &test, arena);
5069 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005070 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005071 }
5072 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005073 return 1;
5074 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005075 if (tmp == NULL) {
5076 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5077 return 1;
5078 }
5079 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005080 int res;
5081 Py_ssize_t len;
5082 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005083 if (!PyList_Check(tmp)) {
5084 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5085 goto failed;
5086 }
5087 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005088 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005089 if (body == NULL) goto failed;
5090 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005091 stmt_ty val;
5092 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005093 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005094 if (len != PyList_GET_SIZE(tmp)) {
5095 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5096 goto failed;
5097 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005098 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005099 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005100 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005101 }
5102 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005103 return 1;
5104 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005105 if (tmp == NULL) {
5106 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5107 return 1;
5108 }
5109 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005110 int res;
5111 Py_ssize_t len;
5112 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005113 if (!PyList_Check(tmp)) {
5114 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5115 goto failed;
5116 }
5117 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005118 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005119 if (orelse == NULL) goto failed;
5120 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005121 stmt_ty val;
5122 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005123 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005124 if (len != PyList_GET_SIZE(tmp)) {
5125 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5126 goto failed;
5127 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005128 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005129 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005130 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005131 }
5132 *out = If(test, body, orelse, lineno, col_offset, arena);
5133 if (*out == NULL) goto failed;
5134 return 0;
5135 }
5136 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5137 if (isinstance == -1) {
5138 return 1;
5139 }
5140 if (isinstance) {
5141 asdl_seq* items;
5142 asdl_seq* body;
5143
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005144 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5145 return 1;
5146 }
5147 if (tmp == NULL) {
5148 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5149 return 1;
5150 }
5151 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005152 int res;
5153 Py_ssize_t len;
5154 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005155 if (!PyList_Check(tmp)) {
5156 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5157 goto failed;
5158 }
5159 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005160 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005161 if (items == NULL) goto failed;
5162 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005163 withitem_ty val;
5164 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005165 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005166 if (len != PyList_GET_SIZE(tmp)) {
5167 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5168 goto failed;
5169 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005170 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005171 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005172 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005173 }
5174 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005175 return 1;
5176 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005177 if (tmp == NULL) {
5178 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5179 return 1;
5180 }
5181 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005182 int res;
5183 Py_ssize_t len;
5184 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005185 if (!PyList_Check(tmp)) {
5186 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5187 goto failed;
5188 }
5189 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005190 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005191 if (body == NULL) goto failed;
5192 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005193 stmt_ty val;
5194 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005195 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005196 if (len != PyList_GET_SIZE(tmp)) {
5197 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5198 goto failed;
5199 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005200 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005201 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005202 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005203 }
5204 *out = With(items, body, lineno, col_offset, arena);
5205 if (*out == NULL) goto failed;
5206 return 0;
5207 }
Yury Selivanov75445082015-05-11 22:57:16 -04005208 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5209 if (isinstance == -1) {
5210 return 1;
5211 }
5212 if (isinstance) {
5213 asdl_seq* items;
5214 asdl_seq* body;
5215
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005216 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5217 return 1;
5218 }
5219 if (tmp == NULL) {
5220 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5221 return 1;
5222 }
5223 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005224 int res;
5225 Py_ssize_t len;
5226 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005227 if (!PyList_Check(tmp)) {
5228 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5229 goto failed;
5230 }
5231 len = PyList_GET_SIZE(tmp);
5232 items = _Py_asdl_seq_new(len, arena);
5233 if (items == NULL) goto failed;
5234 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005235 withitem_ty val;
5236 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005237 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005238 if (len != PyList_GET_SIZE(tmp)) {
5239 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5240 goto failed;
5241 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005242 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005243 }
5244 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005245 }
5246 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005247 return 1;
5248 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005249 if (tmp == NULL) {
5250 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5251 return 1;
5252 }
5253 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005254 int res;
5255 Py_ssize_t len;
5256 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005257 if (!PyList_Check(tmp)) {
5258 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5259 goto failed;
5260 }
5261 len = PyList_GET_SIZE(tmp);
5262 body = _Py_asdl_seq_new(len, arena);
5263 if (body == NULL) goto failed;
5264 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005265 stmt_ty val;
5266 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005267 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005268 if (len != PyList_GET_SIZE(tmp)) {
5269 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5270 goto failed;
5271 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005272 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005273 }
5274 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005275 }
5276 *out = AsyncWith(items, body, lineno, col_offset, arena);
5277 if (*out == NULL) goto failed;
5278 return 0;
5279 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005280 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5281 if (isinstance == -1) {
5282 return 1;
5283 }
5284 if (isinstance) {
5285 expr_ty exc;
5286 expr_ty cause;
5287
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005288 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5289 return 1;
5290 }
5291 if (tmp == NULL || tmp == Py_None) {
5292 Py_CLEAR(tmp);
5293 exc = NULL;
5294 }
5295 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005296 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005297 res = obj2ast_expr(tmp, &exc, arena);
5298 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005299 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005300 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005301 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5302 return 1;
5303 }
5304 if (tmp == NULL || tmp == Py_None) {
5305 Py_CLEAR(tmp);
5306 cause = NULL;
5307 }
5308 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005309 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005310 res = obj2ast_expr(tmp, &cause, arena);
5311 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005312 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005313 }
5314 *out = Raise(exc, cause, lineno, col_offset, arena);
5315 if (*out == NULL) goto failed;
5316 return 0;
5317 }
5318 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5319 if (isinstance == -1) {
5320 return 1;
5321 }
5322 if (isinstance) {
5323 asdl_seq* body;
5324 asdl_seq* handlers;
5325 asdl_seq* orelse;
5326 asdl_seq* finalbody;
5327
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005328 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5329 return 1;
5330 }
5331 if (tmp == NULL) {
5332 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5333 return 1;
5334 }
5335 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005336 int res;
5337 Py_ssize_t len;
5338 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005339 if (!PyList_Check(tmp)) {
5340 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5341 goto failed;
5342 }
5343 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005344 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005345 if (body == NULL) goto failed;
5346 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005347 stmt_ty val;
5348 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005349 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005350 if (len != PyList_GET_SIZE(tmp)) {
5351 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5352 goto failed;
5353 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005354 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005355 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005356 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005357 }
5358 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005359 return 1;
5360 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005361 if (tmp == NULL) {
5362 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5363 return 1;
5364 }
5365 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005366 int res;
5367 Py_ssize_t len;
5368 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005369 if (!PyList_Check(tmp)) {
5370 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5371 goto failed;
5372 }
5373 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005374 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005375 if (handlers == NULL) goto failed;
5376 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005377 excepthandler_ty val;
5378 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005379 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005380 if (len != PyList_GET_SIZE(tmp)) {
5381 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5382 goto failed;
5383 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005384 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005385 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005386 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005387 }
5388 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005389 return 1;
5390 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005391 if (tmp == NULL) {
5392 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5393 return 1;
5394 }
5395 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005396 int res;
5397 Py_ssize_t len;
5398 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005399 if (!PyList_Check(tmp)) {
5400 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5401 goto failed;
5402 }
5403 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005404 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005405 if (orelse == NULL) goto failed;
5406 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005407 stmt_ty val;
5408 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005409 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005410 if (len != PyList_GET_SIZE(tmp)) {
5411 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5412 goto failed;
5413 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005414 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005415 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005416 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005417 }
5418 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005419 return 1;
5420 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005421 if (tmp == NULL) {
5422 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5423 return 1;
5424 }
5425 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005426 int res;
5427 Py_ssize_t len;
5428 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005429 if (!PyList_Check(tmp)) {
5430 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5431 goto failed;
5432 }
5433 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005434 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005435 if (finalbody == NULL) goto failed;
5436 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005437 stmt_ty val;
5438 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005439 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005440 if (len != PyList_GET_SIZE(tmp)) {
5441 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5442 goto failed;
5443 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005444 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005445 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005446 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005447 }
5448 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
5449 arena);
5450 if (*out == NULL) goto failed;
5451 return 0;
5452 }
5453 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5454 if (isinstance == -1) {
5455 return 1;
5456 }
5457 if (isinstance) {
5458 expr_ty test;
5459 expr_ty msg;
5460
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005461 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5462 return 1;
5463 }
5464 if (tmp == NULL) {
5465 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5466 return 1;
5467 }
5468 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005469 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005470 res = obj2ast_expr(tmp, &test, arena);
5471 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005472 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005473 }
5474 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005475 return 1;
5476 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005477 if (tmp == NULL || tmp == Py_None) {
5478 Py_CLEAR(tmp);
5479 msg = NULL;
5480 }
5481 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005482 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005483 res = obj2ast_expr(tmp, &msg, arena);
5484 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005485 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005486 }
5487 *out = Assert(test, msg, lineno, col_offset, arena);
5488 if (*out == NULL) goto failed;
5489 return 0;
5490 }
5491 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5492 if (isinstance == -1) {
5493 return 1;
5494 }
5495 if (isinstance) {
5496 asdl_seq* names;
5497
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005498 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5499 return 1;
5500 }
5501 if (tmp == NULL) {
5502 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5503 return 1;
5504 }
5505 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005506 int res;
5507 Py_ssize_t len;
5508 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005509 if (!PyList_Check(tmp)) {
5510 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5511 goto failed;
5512 }
5513 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005514 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005515 if (names == NULL) goto failed;
5516 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005517 alias_ty val;
5518 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005519 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005520 if (len != PyList_GET_SIZE(tmp)) {
5521 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5522 goto failed;
5523 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005524 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005525 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005526 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005527 }
5528 *out = Import(names, lineno, col_offset, arena);
5529 if (*out == NULL) goto failed;
5530 return 0;
5531 }
5532 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5533 if (isinstance == -1) {
5534 return 1;
5535 }
5536 if (isinstance) {
5537 identifier module;
5538 asdl_seq* names;
5539 int level;
5540
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005541 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5542 return 1;
5543 }
5544 if (tmp == NULL || tmp == Py_None) {
5545 Py_CLEAR(tmp);
5546 module = NULL;
5547 }
5548 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005549 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005550 res = obj2ast_identifier(tmp, &module, arena);
5551 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005552 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005553 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005554 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5555 return 1;
5556 }
5557 if (tmp == NULL) {
5558 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
5559 return 1;
5560 }
5561 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005562 int res;
5563 Py_ssize_t len;
5564 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005565 if (!PyList_Check(tmp)) {
5566 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5567 goto failed;
5568 }
5569 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005570 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005571 if (names == NULL) goto failed;
5572 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005573 alias_ty val;
5574 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005575 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005576 if (len != PyList_GET_SIZE(tmp)) {
5577 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
5578 goto failed;
5579 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005580 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005581 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005582 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005583 }
5584 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005585 return 1;
5586 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005587 if (tmp == NULL || tmp == Py_None) {
5588 Py_CLEAR(tmp);
5589 level = 0;
5590 }
5591 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005592 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005593 res = obj2ast_int(tmp, &level, arena);
5594 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005595 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005596 }
5597 *out = ImportFrom(module, names, level, lineno, col_offset, arena);
5598 if (*out == NULL) goto failed;
5599 return 0;
5600 }
5601 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
5602 if (isinstance == -1) {
5603 return 1;
5604 }
5605 if (isinstance) {
5606 asdl_seq* names;
5607
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005608 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5609 return 1;
5610 }
5611 if (tmp == NULL) {
5612 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
5613 return 1;
5614 }
5615 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005616 int res;
5617 Py_ssize_t len;
5618 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005619 if (!PyList_Check(tmp)) {
5620 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5621 goto failed;
5622 }
5623 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005624 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005625 if (names == NULL) goto failed;
5626 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005627 identifier val;
5628 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005629 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005630 if (len != PyList_GET_SIZE(tmp)) {
5631 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
5632 goto failed;
5633 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005634 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005635 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005636 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005637 }
5638 *out = Global(names, lineno, col_offset, arena);
5639 if (*out == NULL) goto failed;
5640 return 0;
5641 }
5642 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
5643 if (isinstance == -1) {
5644 return 1;
5645 }
5646 if (isinstance) {
5647 asdl_seq* names;
5648
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005649 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5650 return 1;
5651 }
5652 if (tmp == NULL) {
5653 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
5654 return 1;
5655 }
5656 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005657 int res;
5658 Py_ssize_t len;
5659 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005660 if (!PyList_Check(tmp)) {
5661 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5662 goto failed;
5663 }
5664 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005665 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005666 if (names == NULL) goto failed;
5667 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005668 identifier val;
5669 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005670 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005671 if (len != PyList_GET_SIZE(tmp)) {
5672 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
5673 goto failed;
5674 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005675 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005676 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005677 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005678 }
5679 *out = Nonlocal(names, lineno, col_offset, arena);
5680 if (*out == NULL) goto failed;
5681 return 0;
5682 }
5683 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
5684 if (isinstance == -1) {
5685 return 1;
5686 }
5687 if (isinstance) {
5688 expr_ty value;
5689
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005690 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
5691 return 1;
5692 }
5693 if (tmp == NULL) {
5694 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
5695 return 1;
5696 }
5697 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005698 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005699 res = obj2ast_expr(tmp, &value, arena);
5700 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005701 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005702 }
5703 *out = Expr(value, lineno, col_offset, arena);
5704 if (*out == NULL) goto failed;
5705 return 0;
5706 }
5707 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
5708 if (isinstance == -1) {
5709 return 1;
5710 }
5711 if (isinstance) {
5712
5713 *out = Pass(lineno, col_offset, arena);
5714 if (*out == NULL) goto failed;
5715 return 0;
5716 }
5717 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
5718 if (isinstance == -1) {
5719 return 1;
5720 }
5721 if (isinstance) {
5722
5723 *out = Break(lineno, col_offset, arena);
5724 if (*out == NULL) goto failed;
5725 return 0;
5726 }
5727 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
5728 if (isinstance == -1) {
5729 return 1;
5730 }
5731 if (isinstance) {
5732
5733 *out = Continue(lineno, col_offset, arena);
5734 if (*out == NULL) goto failed;
5735 return 0;
5736 }
5737
5738 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
5739 failed:
5740 Py_XDECREF(tmp);
5741 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005742}
5743
5744int
5745obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
5746{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005747 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005748
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005749 PyObject *tmp = NULL;
5750 int lineno;
5751 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005752
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005753 if (obj == Py_None) {
5754 *out = NULL;
5755 return 0;
5756 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005757 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
5758 return 1;
5759 }
5760 if (tmp == NULL) {
5761 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
5762 return 1;
5763 }
5764 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005765 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005766 res = obj2ast_int(tmp, &lineno, arena);
5767 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005768 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005769 }
5770 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005771 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005772 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005773 if (tmp == NULL) {
5774 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
5775 return 1;
5776 }
5777 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005778 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005779 res = obj2ast_int(tmp, &col_offset, arena);
5780 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005781 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005782 }
5783 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
5784 if (isinstance == -1) {
5785 return 1;
5786 }
5787 if (isinstance) {
5788 boolop_ty op;
5789 asdl_seq* values;
5790
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005791 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5792 return 1;
5793 }
5794 if (tmp == NULL) {
5795 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
5796 return 1;
5797 }
5798 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005799 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005800 res = obj2ast_boolop(tmp, &op, arena);
5801 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005802 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005803 }
5804 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005805 return 1;
5806 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005807 if (tmp == NULL) {
5808 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
5809 return 1;
5810 }
5811 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005812 int res;
5813 Py_ssize_t len;
5814 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005815 if (!PyList_Check(tmp)) {
5816 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5817 goto failed;
5818 }
5819 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005820 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005821 if (values == NULL) goto failed;
5822 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005823 expr_ty val;
5824 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005825 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005826 if (len != PyList_GET_SIZE(tmp)) {
5827 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
5828 goto failed;
5829 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005830 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005831 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005832 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005833 }
5834 *out = BoolOp(op, values, lineno, col_offset, arena);
5835 if (*out == NULL) goto failed;
5836 return 0;
5837 }
5838 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
5839 if (isinstance == -1) {
5840 return 1;
5841 }
5842 if (isinstance) {
5843 expr_ty left;
5844 operator_ty op;
5845 expr_ty right;
5846
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005847 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
5848 return 1;
5849 }
5850 if (tmp == NULL) {
5851 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
5852 return 1;
5853 }
5854 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005855 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005856 res = obj2ast_expr(tmp, &left, arena);
5857 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005858 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005859 }
5860 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005861 return 1;
5862 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005863 if (tmp == NULL) {
5864 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
5865 return 1;
5866 }
5867 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005868 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005869 res = obj2ast_operator(tmp, &op, arena);
5870 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005871 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005872 }
5873 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005874 return 1;
5875 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005876 if (tmp == NULL) {
5877 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
5878 return 1;
5879 }
5880 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005881 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005882 res = obj2ast_expr(tmp, &right, arena);
5883 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005884 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005885 }
5886 *out = BinOp(left, op, right, lineno, col_offset, arena);
5887 if (*out == NULL) goto failed;
5888 return 0;
5889 }
5890 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
5891 if (isinstance == -1) {
5892 return 1;
5893 }
5894 if (isinstance) {
5895 unaryop_ty op;
5896 expr_ty operand;
5897
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005898 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5899 return 1;
5900 }
5901 if (tmp == NULL) {
5902 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
5903 return 1;
5904 }
5905 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005906 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005907 res = obj2ast_unaryop(tmp, &op, arena);
5908 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005909 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005910 }
5911 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005912 return 1;
5913 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005914 if (tmp == NULL) {
5915 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
5916 return 1;
5917 }
5918 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005919 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005920 res = obj2ast_expr(tmp, &operand, arena);
5921 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005922 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005923 }
5924 *out = UnaryOp(op, operand, lineno, col_offset, arena);
5925 if (*out == NULL) goto failed;
5926 return 0;
5927 }
5928 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
5929 if (isinstance == -1) {
5930 return 1;
5931 }
5932 if (isinstance) {
5933 arguments_ty args;
5934 expr_ty body;
5935
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005936 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
5937 return 1;
5938 }
5939 if (tmp == NULL) {
5940 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
5941 return 1;
5942 }
5943 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005944 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005945 res = obj2ast_arguments(tmp, &args, arena);
5946 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005947 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005948 }
5949 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005950 return 1;
5951 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005952 if (tmp == NULL) {
5953 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
5954 return 1;
5955 }
5956 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005957 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005958 res = obj2ast_expr(tmp, &body, arena);
5959 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005960 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005961 }
5962 *out = Lambda(args, body, lineno, col_offset, arena);
5963 if (*out == NULL) goto failed;
5964 return 0;
5965 }
5966 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
5967 if (isinstance == -1) {
5968 return 1;
5969 }
5970 if (isinstance) {
5971 expr_ty test;
5972 expr_ty body;
5973 expr_ty orelse;
5974
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005975 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5976 return 1;
5977 }
5978 if (tmp == NULL) {
5979 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
5980 return 1;
5981 }
5982 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005983 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005984 res = obj2ast_expr(tmp, &test, arena);
5985 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005986 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005987 }
5988 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005989 return 1;
5990 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005991 if (tmp == NULL) {
5992 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
5993 return 1;
5994 }
5995 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005996 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005997 res = obj2ast_expr(tmp, &body, arena);
5998 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005999 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006000 }
6001 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006002 return 1;
6003 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006004 if (tmp == NULL) {
6005 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6006 return 1;
6007 }
6008 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006009 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006010 res = obj2ast_expr(tmp, &orelse, arena);
6011 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006012 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006013 }
6014 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
6015 if (*out == NULL) goto failed;
6016 return 0;
6017 }
6018 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6019 if (isinstance == -1) {
6020 return 1;
6021 }
6022 if (isinstance) {
6023 asdl_seq* keys;
6024 asdl_seq* values;
6025
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006026 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6027 return 1;
6028 }
6029 if (tmp == NULL) {
6030 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6031 return 1;
6032 }
6033 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006034 int res;
6035 Py_ssize_t len;
6036 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006037 if (!PyList_Check(tmp)) {
6038 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6039 goto failed;
6040 }
6041 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006042 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006043 if (keys == NULL) goto failed;
6044 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006045 expr_ty val;
6046 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006047 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006048 if (len != PyList_GET_SIZE(tmp)) {
6049 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6050 goto failed;
6051 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006052 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006053 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006054 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006055 }
6056 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006057 return 1;
6058 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006059 if (tmp == NULL) {
6060 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6061 return 1;
6062 }
6063 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006064 int res;
6065 Py_ssize_t len;
6066 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006067 if (!PyList_Check(tmp)) {
6068 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6069 goto failed;
6070 }
6071 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006072 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006073 if (values == NULL) goto failed;
6074 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006075 expr_ty val;
6076 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006077 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006078 if (len != PyList_GET_SIZE(tmp)) {
6079 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6080 goto failed;
6081 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006082 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006083 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006084 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006085 }
6086 *out = Dict(keys, values, lineno, col_offset, arena);
6087 if (*out == NULL) goto failed;
6088 return 0;
6089 }
6090 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6091 if (isinstance == -1) {
6092 return 1;
6093 }
6094 if (isinstance) {
6095 asdl_seq* elts;
6096
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006097 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6098 return 1;
6099 }
6100 if (tmp == NULL) {
6101 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6102 return 1;
6103 }
6104 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006105 int res;
6106 Py_ssize_t len;
6107 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006108 if (!PyList_Check(tmp)) {
6109 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6110 goto failed;
6111 }
6112 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006113 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006114 if (elts == NULL) goto failed;
6115 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006116 expr_ty val;
6117 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006118 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006119 if (len != PyList_GET_SIZE(tmp)) {
6120 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6121 goto failed;
6122 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006123 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006124 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006125 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006126 }
6127 *out = Set(elts, lineno, col_offset, arena);
6128 if (*out == NULL) goto failed;
6129 return 0;
6130 }
6131 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6132 if (isinstance == -1) {
6133 return 1;
6134 }
6135 if (isinstance) {
6136 expr_ty elt;
6137 asdl_seq* generators;
6138
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006139 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6140 return 1;
6141 }
6142 if (tmp == NULL) {
6143 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6144 return 1;
6145 }
6146 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006147 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006148 res = obj2ast_expr(tmp, &elt, arena);
6149 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006150 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006151 }
6152 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006153 return 1;
6154 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006155 if (tmp == NULL) {
6156 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6157 return 1;
6158 }
6159 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006160 int res;
6161 Py_ssize_t len;
6162 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006163 if (!PyList_Check(tmp)) {
6164 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6165 goto failed;
6166 }
6167 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006168 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006169 if (generators == NULL) goto failed;
6170 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006171 comprehension_ty val;
6172 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006173 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006174 if (len != PyList_GET_SIZE(tmp)) {
6175 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6176 goto failed;
6177 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006178 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006179 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006180 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006181 }
6182 *out = ListComp(elt, generators, lineno, col_offset, arena);
6183 if (*out == NULL) goto failed;
6184 return 0;
6185 }
6186 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6187 if (isinstance == -1) {
6188 return 1;
6189 }
6190 if (isinstance) {
6191 expr_ty elt;
6192 asdl_seq* generators;
6193
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006194 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6195 return 1;
6196 }
6197 if (tmp == NULL) {
6198 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6199 return 1;
6200 }
6201 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006202 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006203 res = obj2ast_expr(tmp, &elt, arena);
6204 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006205 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006206 }
6207 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006208 return 1;
6209 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006210 if (tmp == NULL) {
6211 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6212 return 1;
6213 }
6214 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006215 int res;
6216 Py_ssize_t len;
6217 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006218 if (!PyList_Check(tmp)) {
6219 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6220 goto failed;
6221 }
6222 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006223 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006224 if (generators == NULL) goto failed;
6225 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006226 comprehension_ty val;
6227 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006228 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006229 if (len != PyList_GET_SIZE(tmp)) {
6230 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6231 goto failed;
6232 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006233 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006234 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006235 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006236 }
6237 *out = SetComp(elt, generators, lineno, col_offset, arena);
6238 if (*out == NULL) goto failed;
6239 return 0;
6240 }
6241 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6242 if (isinstance == -1) {
6243 return 1;
6244 }
6245 if (isinstance) {
6246 expr_ty key;
6247 expr_ty value;
6248 asdl_seq* generators;
6249
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006250 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6251 return 1;
6252 }
6253 if (tmp == NULL) {
6254 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6255 return 1;
6256 }
6257 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006258 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006259 res = obj2ast_expr(tmp, &key, arena);
6260 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006261 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006262 }
6263 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006264 return 1;
6265 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006266 if (tmp == NULL) {
6267 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6268 return 1;
6269 }
6270 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006271 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006272 res = obj2ast_expr(tmp, &value, arena);
6273 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006274 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006275 }
6276 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006277 return 1;
6278 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006279 if (tmp == NULL) {
6280 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6281 return 1;
6282 }
6283 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006284 int res;
6285 Py_ssize_t len;
6286 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006287 if (!PyList_Check(tmp)) {
6288 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6289 goto failed;
6290 }
6291 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006292 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006293 if (generators == NULL) goto failed;
6294 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006295 comprehension_ty val;
6296 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006297 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006298 if (len != PyList_GET_SIZE(tmp)) {
6299 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6300 goto failed;
6301 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006302 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006303 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006304 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006305 }
6306 *out = DictComp(key, value, generators, lineno, col_offset, arena);
6307 if (*out == NULL) goto failed;
6308 return 0;
6309 }
6310 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6311 if (isinstance == -1) {
6312 return 1;
6313 }
6314 if (isinstance) {
6315 expr_ty elt;
6316 asdl_seq* generators;
6317
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006318 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6319 return 1;
6320 }
6321 if (tmp == NULL) {
6322 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6323 return 1;
6324 }
6325 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006326 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006327 res = obj2ast_expr(tmp, &elt, arena);
6328 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006329 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006330 }
6331 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006332 return 1;
6333 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006334 if (tmp == NULL) {
6335 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6336 return 1;
6337 }
6338 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006339 int res;
6340 Py_ssize_t len;
6341 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006342 if (!PyList_Check(tmp)) {
6343 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6344 goto failed;
6345 }
6346 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006347 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006348 if (generators == NULL) goto failed;
6349 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006350 comprehension_ty val;
6351 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006352 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006353 if (len != PyList_GET_SIZE(tmp)) {
6354 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6355 goto failed;
6356 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006357 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006358 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006359 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006360 }
6361 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
6362 if (*out == NULL) goto failed;
6363 return 0;
6364 }
Yury Selivanov75445082015-05-11 22:57:16 -04006365 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6366 if (isinstance == -1) {
6367 return 1;
6368 }
6369 if (isinstance) {
6370 expr_ty value;
6371
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006372 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6373 return 1;
6374 }
6375 if (tmp == NULL) {
6376 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6377 return 1;
6378 }
6379 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006380 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006381 res = obj2ast_expr(tmp, &value, arena);
6382 if (res != 0) goto failed;
6383 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006384 }
6385 *out = Await(value, lineno, col_offset, arena);
6386 if (*out == NULL) goto failed;
6387 return 0;
6388 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006389 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6390 if (isinstance == -1) {
6391 return 1;
6392 }
6393 if (isinstance) {
6394 expr_ty value;
6395
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006396 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6397 return 1;
6398 }
6399 if (tmp == NULL || tmp == Py_None) {
6400 Py_CLEAR(tmp);
6401 value = NULL;
6402 }
6403 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006404 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006405 res = obj2ast_expr(tmp, &value, arena);
6406 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006407 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006408 }
6409 *out = Yield(value, lineno, col_offset, arena);
6410 if (*out == NULL) goto failed;
6411 return 0;
6412 }
6413 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6414 if (isinstance == -1) {
6415 return 1;
6416 }
6417 if (isinstance) {
6418 expr_ty value;
6419
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006420 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6421 return 1;
6422 }
6423 if (tmp == NULL) {
6424 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6425 return 1;
6426 }
6427 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006428 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006429 res = obj2ast_expr(tmp, &value, arena);
6430 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006431 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006432 }
6433 *out = YieldFrom(value, lineno, col_offset, arena);
6434 if (*out == NULL) goto failed;
6435 return 0;
6436 }
6437 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6438 if (isinstance == -1) {
6439 return 1;
6440 }
6441 if (isinstance) {
6442 expr_ty left;
6443 asdl_int_seq* ops;
6444 asdl_seq* comparators;
6445
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006446 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6447 return 1;
6448 }
6449 if (tmp == NULL) {
6450 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6451 return 1;
6452 }
6453 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006454 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006455 res = obj2ast_expr(tmp, &left, arena);
6456 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006457 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006458 }
6459 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006460 return 1;
6461 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006462 if (tmp == NULL) {
6463 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6464 return 1;
6465 }
6466 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006467 int res;
6468 Py_ssize_t len;
6469 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006470 if (!PyList_Check(tmp)) {
6471 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6472 goto failed;
6473 }
6474 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006475 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006476 if (ops == NULL) goto failed;
6477 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006478 cmpop_ty val;
6479 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006480 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006481 if (len != PyList_GET_SIZE(tmp)) {
6482 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
6483 goto failed;
6484 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006485 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006486 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006487 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006488 }
6489 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006490 return 1;
6491 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006492 if (tmp == NULL) {
6493 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
6494 return 1;
6495 }
6496 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006497 int res;
6498 Py_ssize_t len;
6499 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006500 if (!PyList_Check(tmp)) {
6501 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6502 goto failed;
6503 }
6504 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006505 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006506 if (comparators == NULL) goto failed;
6507 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006508 expr_ty val;
6509 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006510 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006511 if (len != PyList_GET_SIZE(tmp)) {
6512 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
6513 goto failed;
6514 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006515 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006516 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006517 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006518 }
6519 *out = Compare(left, ops, comparators, lineno, col_offset, arena);
6520 if (*out == NULL) goto failed;
6521 return 0;
6522 }
6523 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
6524 if (isinstance == -1) {
6525 return 1;
6526 }
6527 if (isinstance) {
6528 expr_ty func;
6529 asdl_seq* args;
6530 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006531
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006532 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
6533 return 1;
6534 }
6535 if (tmp == NULL) {
6536 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
6537 return 1;
6538 }
6539 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006540 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006541 res = obj2ast_expr(tmp, &func, arena);
6542 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006543 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006544 }
6545 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006546 return 1;
6547 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006548 if (tmp == NULL) {
6549 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
6550 return 1;
6551 }
6552 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006553 int res;
6554 Py_ssize_t len;
6555 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006556 if (!PyList_Check(tmp)) {
6557 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6558 goto failed;
6559 }
6560 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006561 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006562 if (args == NULL) goto failed;
6563 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006564 expr_ty val;
6565 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006566 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006567 if (len != PyList_GET_SIZE(tmp)) {
6568 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
6569 goto failed;
6570 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006571 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006572 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006573 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006574 }
6575 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006576 return 1;
6577 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006578 if (tmp == NULL) {
6579 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
6580 return 1;
6581 }
6582 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006583 int res;
6584 Py_ssize_t len;
6585 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006586 if (!PyList_Check(tmp)) {
6587 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6588 goto failed;
6589 }
6590 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006591 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006592 if (keywords == NULL) goto failed;
6593 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006594 keyword_ty val;
6595 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006596 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006597 if (len != PyList_GET_SIZE(tmp)) {
6598 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
6599 goto failed;
6600 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006601 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006602 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006603 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006604 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04006605 *out = Call(func, args, keywords, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006606 if (*out == NULL) goto failed;
6607 return 0;
6608 }
6609 isinstance = PyObject_IsInstance(obj, (PyObject*)Num_type);
6610 if (isinstance == -1) {
6611 return 1;
6612 }
6613 if (isinstance) {
6614 object n;
6615
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006616 if (_PyObject_LookupAttrId(obj, &PyId_n, &tmp) < 0) {
6617 return 1;
6618 }
6619 if (tmp == NULL) {
6620 PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
6621 return 1;
6622 }
6623 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006624 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006625 res = obj2ast_object(tmp, &n, arena);
6626 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006627 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006628 }
6629 *out = Num(n, lineno, col_offset, arena);
6630 if (*out == NULL) goto failed;
6631 return 0;
6632 }
6633 isinstance = PyObject_IsInstance(obj, (PyObject*)Str_type);
6634 if (isinstance == -1) {
6635 return 1;
6636 }
6637 if (isinstance) {
6638 string s;
6639
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006640 if (_PyObject_LookupAttrId(obj, &PyId_s, &tmp) < 0) {
6641 return 1;
6642 }
6643 if (tmp == NULL) {
6644 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
6645 return 1;
6646 }
6647 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006648 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006649 res = obj2ast_string(tmp, &s, arena);
6650 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006651 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006652 }
6653 *out = Str(s, lineno, col_offset, arena);
6654 if (*out == NULL) goto failed;
6655 return 0;
6656 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006657 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
6658 if (isinstance == -1) {
6659 return 1;
6660 }
6661 if (isinstance) {
6662 expr_ty value;
6663 int conversion;
6664 expr_ty format_spec;
6665
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006666 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6667 return 1;
6668 }
6669 if (tmp == NULL) {
6670 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
6671 return 1;
6672 }
6673 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006674 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006675 res = obj2ast_expr(tmp, &value, arena);
6676 if (res != 0) goto failed;
6677 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006678 }
6679 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006680 return 1;
6681 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006682 if (tmp == NULL || tmp == Py_None) {
6683 Py_CLEAR(tmp);
6684 conversion = 0;
6685 }
6686 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006687 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006688 res = obj2ast_int(tmp, &conversion, arena);
6689 if (res != 0) goto failed;
6690 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006691 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006692 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
6693 return 1;
6694 }
6695 if (tmp == NULL || tmp == Py_None) {
6696 Py_CLEAR(tmp);
6697 format_spec = NULL;
6698 }
6699 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006700 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006701 res = obj2ast_expr(tmp, &format_spec, arena);
6702 if (res != 0) goto failed;
6703 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006704 }
6705 *out = FormattedValue(value, conversion, format_spec, lineno,
6706 col_offset, arena);
6707 if (*out == NULL) goto failed;
6708 return 0;
6709 }
6710 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
6711 if (isinstance == -1) {
6712 return 1;
6713 }
6714 if (isinstance) {
6715 asdl_seq* values;
6716
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006717 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
6718 return 1;
6719 }
6720 if (tmp == NULL) {
6721 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
6722 return 1;
6723 }
6724 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006725 int res;
6726 Py_ssize_t len;
6727 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006728 if (!PyList_Check(tmp)) {
6729 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6730 goto failed;
6731 }
6732 len = PyList_GET_SIZE(tmp);
6733 values = _Py_asdl_seq_new(len, arena);
6734 if (values == NULL) goto failed;
6735 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006736 expr_ty val;
6737 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006738 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03006739 if (len != PyList_GET_SIZE(tmp)) {
6740 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
6741 goto failed;
6742 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006743 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006744 }
6745 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006746 }
6747 *out = JoinedStr(values, lineno, col_offset, arena);
6748 if (*out == NULL) goto failed;
6749 return 0;
6750 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006751 isinstance = PyObject_IsInstance(obj, (PyObject*)Bytes_type);
6752 if (isinstance == -1) {
6753 return 1;
6754 }
6755 if (isinstance) {
6756 bytes s;
6757
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006758 if (_PyObject_LookupAttrId(obj, &PyId_s, &tmp) < 0) {
6759 return 1;
6760 }
6761 if (tmp == NULL) {
6762 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Bytes");
6763 return 1;
6764 }
6765 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006766 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006767 res = obj2ast_bytes(tmp, &s, arena);
6768 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006769 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006770 }
6771 *out = Bytes(s, lineno, col_offset, arena);
6772 if (*out == NULL) goto failed;
6773 return 0;
6774 }
Victor Stinneree4b59c2013-07-27 00:01:35 +02006775 isinstance = PyObject_IsInstance(obj, (PyObject*)NameConstant_type);
6776 if (isinstance == -1) {
6777 return 1;
6778 }
6779 if (isinstance) {
6780 singleton value;
6781
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006782 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6783 return 1;
6784 }
6785 if (tmp == NULL) {
6786 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NameConstant");
6787 return 1;
6788 }
6789 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02006790 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02006791 res = obj2ast_singleton(tmp, &value, arena);
6792 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02006793 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02006794 }
6795 *out = NameConstant(value, lineno, col_offset, arena);
6796 if (*out == NULL) goto failed;
6797 return 0;
6798 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006799 isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type);
6800 if (isinstance == -1) {
6801 return 1;
6802 }
6803 if (isinstance) {
6804
6805 *out = Ellipsis(lineno, col_offset, arena);
6806 if (*out == NULL) goto failed;
6807 return 0;
6808 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006809 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
6810 if (isinstance == -1) {
6811 return 1;
6812 }
6813 if (isinstance) {
6814 constant value;
6815
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006816 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6817 return 1;
6818 }
6819 if (tmp == NULL) {
6820 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
6821 return 1;
6822 }
6823 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006824 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006825 res = obj2ast_constant(tmp, &value, arena);
6826 if (res != 0) goto failed;
6827 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006828 }
6829 *out = Constant(value, lineno, col_offset, arena);
6830 if (*out == NULL) goto failed;
6831 return 0;
6832 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006833 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
6834 if (isinstance == -1) {
6835 return 1;
6836 }
6837 if (isinstance) {
6838 expr_ty value;
6839 identifier attr;
6840 expr_context_ty ctx;
6841
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006842 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6843 return 1;
6844 }
6845 if (tmp == NULL) {
6846 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
6847 return 1;
6848 }
6849 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006850 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006851 res = obj2ast_expr(tmp, &value, arena);
6852 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006853 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006854 }
6855 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006856 return 1;
6857 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006858 if (tmp == NULL) {
6859 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
6860 return 1;
6861 }
6862 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006863 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006864 res = obj2ast_identifier(tmp, &attr, arena);
6865 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006866 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006867 }
6868 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006869 return 1;
6870 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006871 if (tmp == NULL) {
6872 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
6873 return 1;
6874 }
6875 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006876 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006877 res = obj2ast_expr_context(tmp, &ctx, arena);
6878 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006879 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006880 }
6881 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
6882 if (*out == NULL) goto failed;
6883 return 0;
6884 }
6885 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
6886 if (isinstance == -1) {
6887 return 1;
6888 }
6889 if (isinstance) {
6890 expr_ty value;
6891 slice_ty slice;
6892 expr_context_ty ctx;
6893
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006894 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6895 return 1;
6896 }
6897 if (tmp == NULL) {
6898 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
6899 return 1;
6900 }
6901 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006902 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006903 res = obj2ast_expr(tmp, &value, arena);
6904 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006905 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006906 }
6907 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006908 return 1;
6909 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006910 if (tmp == NULL) {
6911 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
6912 return 1;
6913 }
6914 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006915 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006916 res = obj2ast_slice(tmp, &slice, arena);
6917 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006918 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006919 }
6920 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006921 return 1;
6922 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006923 if (tmp == NULL) {
6924 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
6925 return 1;
6926 }
6927 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006928 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006929 res = obj2ast_expr_context(tmp, &ctx, arena);
6930 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006931 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006932 }
6933 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
6934 if (*out == NULL) goto failed;
6935 return 0;
6936 }
6937 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
6938 if (isinstance == -1) {
6939 return 1;
6940 }
6941 if (isinstance) {
6942 expr_ty value;
6943 expr_context_ty ctx;
6944
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006945 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6946 return 1;
6947 }
6948 if (tmp == NULL) {
6949 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
6950 return 1;
6951 }
6952 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006953 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006954 res = obj2ast_expr(tmp, &value, arena);
6955 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006956 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006957 }
6958 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006959 return 1;
6960 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006961 if (tmp == NULL) {
6962 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
6963 return 1;
6964 }
6965 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006966 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006967 res = obj2ast_expr_context(tmp, &ctx, arena);
6968 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006969 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006970 }
6971 *out = Starred(value, ctx, lineno, col_offset, arena);
6972 if (*out == NULL) goto failed;
6973 return 0;
6974 }
6975 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
6976 if (isinstance == -1) {
6977 return 1;
6978 }
6979 if (isinstance) {
6980 identifier id;
6981 expr_context_ty ctx;
6982
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006983 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
6984 return 1;
6985 }
6986 if (tmp == NULL) {
6987 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
6988 return 1;
6989 }
6990 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006991 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006992 res = obj2ast_identifier(tmp, &id, arena);
6993 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006994 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006995 }
6996 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006997 return 1;
6998 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006999 if (tmp == NULL) {
7000 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
7001 return 1;
7002 }
7003 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007004 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007005 res = obj2ast_expr_context(tmp, &ctx, arena);
7006 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007007 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007008 }
7009 *out = Name(id, ctx, lineno, col_offset, arena);
7010 if (*out == NULL) goto failed;
7011 return 0;
7012 }
7013 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7014 if (isinstance == -1) {
7015 return 1;
7016 }
7017 if (isinstance) {
7018 asdl_seq* elts;
7019 expr_context_ty ctx;
7020
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007021 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7022 return 1;
7023 }
7024 if (tmp == NULL) {
7025 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7026 return 1;
7027 }
7028 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007029 int res;
7030 Py_ssize_t len;
7031 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007032 if (!PyList_Check(tmp)) {
7033 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7034 goto failed;
7035 }
7036 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007037 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007038 if (elts == NULL) goto failed;
7039 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007040 expr_ty val;
7041 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007042 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007043 if (len != PyList_GET_SIZE(tmp)) {
7044 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7045 goto failed;
7046 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007047 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007048 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007049 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007050 }
7051 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007052 return 1;
7053 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007054 if (tmp == NULL) {
7055 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7056 return 1;
7057 }
7058 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007059 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007060 res = obj2ast_expr_context(tmp, &ctx, arena);
7061 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007062 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007063 }
7064 *out = List(elts, ctx, lineno, col_offset, arena);
7065 if (*out == NULL) goto failed;
7066 return 0;
7067 }
7068 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7069 if (isinstance == -1) {
7070 return 1;
7071 }
7072 if (isinstance) {
7073 asdl_seq* elts;
7074 expr_context_ty ctx;
7075
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007076 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7077 return 1;
7078 }
7079 if (tmp == NULL) {
7080 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7081 return 1;
7082 }
7083 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007084 int res;
7085 Py_ssize_t len;
7086 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007087 if (!PyList_Check(tmp)) {
7088 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7089 goto failed;
7090 }
7091 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007092 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007093 if (elts == NULL) goto failed;
7094 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007095 expr_ty val;
7096 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007097 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007098 if (len != PyList_GET_SIZE(tmp)) {
7099 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7100 goto failed;
7101 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007102 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007103 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007104 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007105 }
7106 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007107 return 1;
7108 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007109 if (tmp == NULL) {
7110 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7111 return 1;
7112 }
7113 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007114 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007115 res = obj2ast_expr_context(tmp, &ctx, arena);
7116 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007117 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007118 }
7119 *out = Tuple(elts, ctx, lineno, col_offset, arena);
7120 if (*out == NULL) goto failed;
7121 return 0;
7122 }
7123
7124 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7125 failed:
7126 Py_XDECREF(tmp);
7127 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007128}
7129
7130int
7131obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7132{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007133 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007134
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007135 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7136 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007137 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007138 }
7139 if (isinstance) {
7140 *out = Load;
7141 return 0;
7142 }
7143 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7144 if (isinstance == -1) {
7145 return 1;
7146 }
7147 if (isinstance) {
7148 *out = Store;
7149 return 0;
7150 }
7151 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7152 if (isinstance == -1) {
7153 return 1;
7154 }
7155 if (isinstance) {
7156 *out = Del;
7157 return 0;
7158 }
7159 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7160 if (isinstance == -1) {
7161 return 1;
7162 }
7163 if (isinstance) {
7164 *out = AugLoad;
7165 return 0;
7166 }
7167 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7168 if (isinstance == -1) {
7169 return 1;
7170 }
7171 if (isinstance) {
7172 *out = AugStore;
7173 return 0;
7174 }
7175 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7176 if (isinstance == -1) {
7177 return 1;
7178 }
7179 if (isinstance) {
7180 *out = Param;
7181 return 0;
7182 }
7183
7184 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7185 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007186}
7187
7188int
7189obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7190{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007191 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007192
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007193 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007194
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007195 if (obj == Py_None) {
7196 *out = NULL;
7197 return 0;
7198 }
7199 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7200 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007201 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007202 }
7203 if (isinstance) {
7204 expr_ty lower;
7205 expr_ty upper;
7206 expr_ty step;
7207
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007208 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7209 return 1;
7210 }
7211 if (tmp == NULL || tmp == Py_None) {
7212 Py_CLEAR(tmp);
7213 lower = NULL;
7214 }
7215 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007216 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007217 res = obj2ast_expr(tmp, &lower, arena);
7218 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007219 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007220 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007221 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7222 return 1;
7223 }
7224 if (tmp == NULL || tmp == Py_None) {
7225 Py_CLEAR(tmp);
7226 upper = NULL;
7227 }
7228 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007229 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007230 res = obj2ast_expr(tmp, &upper, arena);
7231 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007232 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007233 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007234 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
7235 return 1;
7236 }
7237 if (tmp == NULL || tmp == Py_None) {
7238 Py_CLEAR(tmp);
7239 step = NULL;
7240 }
7241 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007242 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007243 res = obj2ast_expr(tmp, &step, arena);
7244 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007245 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007246 }
7247 *out = Slice(lower, upper, step, arena);
7248 if (*out == NULL) goto failed;
7249 return 0;
7250 }
7251 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7252 if (isinstance == -1) {
7253 return 1;
7254 }
7255 if (isinstance) {
7256 asdl_seq* dims;
7257
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007258 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7259 return 1;
7260 }
7261 if (tmp == NULL) {
7262 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7263 return 1;
7264 }
7265 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007266 int res;
7267 Py_ssize_t len;
7268 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007269 if (!PyList_Check(tmp)) {
7270 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7271 goto failed;
7272 }
7273 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007274 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007275 if (dims == NULL) goto failed;
7276 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007277 slice_ty val;
7278 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007279 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007280 if (len != PyList_GET_SIZE(tmp)) {
7281 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7282 goto failed;
7283 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007284 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007285 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007286 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007287 }
7288 *out = ExtSlice(dims, arena);
7289 if (*out == NULL) goto failed;
7290 return 0;
7291 }
7292 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7293 if (isinstance == -1) {
7294 return 1;
7295 }
7296 if (isinstance) {
7297 expr_ty value;
7298
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007299 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7300 return 1;
7301 }
7302 if (tmp == NULL) {
7303 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7304 return 1;
7305 }
7306 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007307 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007308 res = obj2ast_expr(tmp, &value, arena);
7309 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007310 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007311 }
7312 *out = Index(value, arena);
7313 if (*out == NULL) goto failed;
7314 return 0;
7315 }
7316
7317 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7318 failed:
7319 Py_XDECREF(tmp);
7320 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007321}
7322
7323int
7324obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7325{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007326 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007327
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007328 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7329 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007330 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007331 }
7332 if (isinstance) {
7333 *out = And;
7334 return 0;
7335 }
7336 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7337 if (isinstance == -1) {
7338 return 1;
7339 }
7340 if (isinstance) {
7341 *out = Or;
7342 return 0;
7343 }
7344
7345 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7346 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007347}
7348
7349int
7350obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7351{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007352 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007353
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007354 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7355 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007356 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007357 }
7358 if (isinstance) {
7359 *out = Add;
7360 return 0;
7361 }
7362 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7363 if (isinstance == -1) {
7364 return 1;
7365 }
7366 if (isinstance) {
7367 *out = Sub;
7368 return 0;
7369 }
7370 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7371 if (isinstance == -1) {
7372 return 1;
7373 }
7374 if (isinstance) {
7375 *out = Mult;
7376 return 0;
7377 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007378 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7379 if (isinstance == -1) {
7380 return 1;
7381 }
7382 if (isinstance) {
7383 *out = MatMult;
7384 return 0;
7385 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007386 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7387 if (isinstance == -1) {
7388 return 1;
7389 }
7390 if (isinstance) {
7391 *out = Div;
7392 return 0;
7393 }
7394 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7395 if (isinstance == -1) {
7396 return 1;
7397 }
7398 if (isinstance) {
7399 *out = Mod;
7400 return 0;
7401 }
7402 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7403 if (isinstance == -1) {
7404 return 1;
7405 }
7406 if (isinstance) {
7407 *out = Pow;
7408 return 0;
7409 }
7410 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7411 if (isinstance == -1) {
7412 return 1;
7413 }
7414 if (isinstance) {
7415 *out = LShift;
7416 return 0;
7417 }
7418 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7419 if (isinstance == -1) {
7420 return 1;
7421 }
7422 if (isinstance) {
7423 *out = RShift;
7424 return 0;
7425 }
7426 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7427 if (isinstance == -1) {
7428 return 1;
7429 }
7430 if (isinstance) {
7431 *out = BitOr;
7432 return 0;
7433 }
7434 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7435 if (isinstance == -1) {
7436 return 1;
7437 }
7438 if (isinstance) {
7439 *out = BitXor;
7440 return 0;
7441 }
7442 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7443 if (isinstance == -1) {
7444 return 1;
7445 }
7446 if (isinstance) {
7447 *out = BitAnd;
7448 return 0;
7449 }
7450 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7451 if (isinstance == -1) {
7452 return 1;
7453 }
7454 if (isinstance) {
7455 *out = FloorDiv;
7456 return 0;
7457 }
7458
7459 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7460 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007461}
7462
7463int
7464obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7465{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007466 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007467
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007468 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7469 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007470 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007471 }
7472 if (isinstance) {
7473 *out = Invert;
7474 return 0;
7475 }
7476 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7477 if (isinstance == -1) {
7478 return 1;
7479 }
7480 if (isinstance) {
7481 *out = Not;
7482 return 0;
7483 }
7484 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7485 if (isinstance == -1) {
7486 return 1;
7487 }
7488 if (isinstance) {
7489 *out = UAdd;
7490 return 0;
7491 }
7492 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7493 if (isinstance == -1) {
7494 return 1;
7495 }
7496 if (isinstance) {
7497 *out = USub;
7498 return 0;
7499 }
7500
7501 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7502 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007503}
7504
7505int
7506obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7507{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007508 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007509
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007510 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7511 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007512 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007513 }
7514 if (isinstance) {
7515 *out = Eq;
7516 return 0;
7517 }
7518 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7519 if (isinstance == -1) {
7520 return 1;
7521 }
7522 if (isinstance) {
7523 *out = NotEq;
7524 return 0;
7525 }
7526 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7527 if (isinstance == -1) {
7528 return 1;
7529 }
7530 if (isinstance) {
7531 *out = Lt;
7532 return 0;
7533 }
7534 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7535 if (isinstance == -1) {
7536 return 1;
7537 }
7538 if (isinstance) {
7539 *out = LtE;
7540 return 0;
7541 }
7542 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7543 if (isinstance == -1) {
7544 return 1;
7545 }
7546 if (isinstance) {
7547 *out = Gt;
7548 return 0;
7549 }
7550 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
7551 if (isinstance == -1) {
7552 return 1;
7553 }
7554 if (isinstance) {
7555 *out = GtE;
7556 return 0;
7557 }
7558 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
7559 if (isinstance == -1) {
7560 return 1;
7561 }
7562 if (isinstance) {
7563 *out = Is;
7564 return 0;
7565 }
7566 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
7567 if (isinstance == -1) {
7568 return 1;
7569 }
7570 if (isinstance) {
7571 *out = IsNot;
7572 return 0;
7573 }
7574 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
7575 if (isinstance == -1) {
7576 return 1;
7577 }
7578 if (isinstance) {
7579 *out = In;
7580 return 0;
7581 }
7582 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
7583 if (isinstance == -1) {
7584 return 1;
7585 }
7586 if (isinstance) {
7587 *out = NotIn;
7588 return 0;
7589 }
7590
7591 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
7592 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007593}
7594
7595int
7596obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
7597{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007598 PyObject* tmp = NULL;
7599 expr_ty target;
7600 expr_ty iter;
7601 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007602 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007603
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007604 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
7605 return 1;
7606 }
7607 if (tmp == NULL) {
7608 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
7609 return 1;
7610 }
7611 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007612 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007613 res = obj2ast_expr(tmp, &target, arena);
7614 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007615 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007616 }
7617 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007618 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007619 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007620 if (tmp == NULL) {
7621 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
7622 return 1;
7623 }
7624 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007625 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007626 res = obj2ast_expr(tmp, &iter, arena);
7627 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007628 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007629 }
7630 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007631 return 1;
7632 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007633 if (tmp == NULL) {
7634 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
7635 return 1;
7636 }
7637 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007638 int res;
7639 Py_ssize_t len;
7640 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007641 if (!PyList_Check(tmp)) {
7642 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7643 goto failed;
7644 }
7645 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007646 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007647 if (ifs == NULL) goto failed;
7648 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007649 expr_ty val;
7650 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007651 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007652 if (len != PyList_GET_SIZE(tmp)) {
7653 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
7654 goto failed;
7655 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007656 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007657 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007658 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007659 }
7660 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007661 return 1;
7662 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007663 if (tmp == NULL) {
7664 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
7665 return 1;
7666 }
7667 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007668 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007669 res = obj2ast_int(tmp, &is_async, arena);
7670 if (res != 0) goto failed;
7671 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007672 }
7673 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007674 return 0;
7675failed:
7676 Py_XDECREF(tmp);
7677 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007678}
7679
7680int
7681obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
7682{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007683 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00007684
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007685 PyObject *tmp = NULL;
7686 int lineno;
7687 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007688
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007689 if (obj == Py_None) {
7690 *out = NULL;
7691 return 0;
7692 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007693 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7694 return 1;
7695 }
7696 if (tmp == NULL) {
7697 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
7698 return 1;
7699 }
7700 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007701 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007702 res = obj2ast_int(tmp, &lineno, arena);
7703 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007704 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007705 }
7706 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007707 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007708 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007709 if (tmp == NULL) {
7710 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
7711 return 1;
7712 }
7713 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007714 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007715 res = obj2ast_int(tmp, &col_offset, arena);
7716 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007717 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007718 }
7719 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
7720 if (isinstance == -1) {
7721 return 1;
7722 }
7723 if (isinstance) {
7724 expr_ty type;
7725 identifier name;
7726 asdl_seq* body;
7727
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007728 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
7729 return 1;
7730 }
7731 if (tmp == NULL || tmp == Py_None) {
7732 Py_CLEAR(tmp);
7733 type = NULL;
7734 }
7735 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007736 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007737 res = obj2ast_expr(tmp, &type, arena);
7738 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007739 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007740 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007741 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
7742 return 1;
7743 }
7744 if (tmp == NULL || tmp == Py_None) {
7745 Py_CLEAR(tmp);
7746 name = NULL;
7747 }
7748 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007749 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007750 res = obj2ast_identifier(tmp, &name, arena);
7751 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007752 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007753 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007754 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
7755 return 1;
7756 }
7757 if (tmp == NULL) {
7758 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
7759 return 1;
7760 }
7761 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007762 int res;
7763 Py_ssize_t len;
7764 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007765 if (!PyList_Check(tmp)) {
7766 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7767 goto failed;
7768 }
7769 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007770 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007771 if (body == NULL) goto failed;
7772 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007773 stmt_ty val;
7774 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007775 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007776 if (len != PyList_GET_SIZE(tmp)) {
7777 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
7778 goto failed;
7779 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007780 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007781 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007782 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007783 }
7784 *out = ExceptHandler(type, name, body, lineno, col_offset, arena);
7785 if (*out == NULL) goto failed;
7786 return 0;
7787 }
7788
7789 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
7790 failed:
7791 Py_XDECREF(tmp);
7792 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007793}
7794
7795int
7796obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
7797{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007798 PyObject* tmp = NULL;
7799 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007800 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007801 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007802 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007803 arg_ty kwarg;
7804 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007805
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007806 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
7807 return 1;
7808 }
7809 if (tmp == NULL) {
7810 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
7811 return 1;
7812 }
7813 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007814 int res;
7815 Py_ssize_t len;
7816 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007817 if (!PyList_Check(tmp)) {
7818 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7819 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007820 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007821 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007822 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007823 if (args == NULL) goto failed;
7824 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007825 arg_ty val;
7826 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007827 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007828 if (len != PyList_GET_SIZE(tmp)) {
7829 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
7830 goto failed;
7831 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007832 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007833 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007834 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007835 }
7836 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007837 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007838 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007839 if (tmp == NULL || tmp == Py_None) {
7840 Py_CLEAR(tmp);
7841 vararg = NULL;
7842 }
7843 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007844 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007845 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007846 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007847 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007848 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007849 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
7850 return 1;
7851 }
7852 if (tmp == NULL) {
7853 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
7854 return 1;
7855 }
7856 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007857 int res;
7858 Py_ssize_t len;
7859 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007860 if (!PyList_Check(tmp)) {
7861 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7862 goto failed;
7863 }
7864 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007865 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007866 if (kwonlyargs == NULL) goto failed;
7867 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007868 arg_ty val;
7869 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007870 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007871 if (len != PyList_GET_SIZE(tmp)) {
7872 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
7873 goto failed;
7874 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007875 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007876 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007877 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007878 }
7879 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007880 return 1;
7881 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007882 if (tmp == NULL) {
7883 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
7884 return 1;
7885 }
7886 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007887 int res;
7888 Py_ssize_t len;
7889 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007890 if (!PyList_Check(tmp)) {
7891 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7892 goto failed;
7893 }
7894 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007895 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007896 if (kw_defaults == NULL) goto failed;
7897 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007898 expr_ty val;
7899 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007900 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007901 if (len != PyList_GET_SIZE(tmp)) {
7902 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
7903 goto failed;
7904 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007905 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007906 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007907 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007908 }
7909 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007910 return 1;
7911 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007912 if (tmp == NULL || tmp == Py_None) {
7913 Py_CLEAR(tmp);
7914 kwarg = NULL;
7915 }
7916 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007917 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007918 res = obj2ast_arg(tmp, &kwarg, arena);
7919 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02007920 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007921 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007922 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
7923 return 1;
7924 }
7925 if (tmp == NULL) {
7926 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
7927 return 1;
7928 }
7929 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007930 int res;
7931 Py_ssize_t len;
7932 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007933 if (!PyList_Check(tmp)) {
7934 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7935 goto failed;
7936 }
7937 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007938 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007939 if (defaults == NULL) goto failed;
7940 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007941 expr_ty val;
7942 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007943 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007944 if (len != PyList_GET_SIZE(tmp)) {
7945 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
7946 goto failed;
7947 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007948 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007949 }
Victor Stinnerb3189902013-07-27 00:04:42 +02007950 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007951 }
7952 *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults,
7953 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007954 return 0;
7955failed:
7956 Py_XDECREF(tmp);
7957 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007958}
7959
7960int
7961obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
7962{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007963 PyObject* tmp = NULL;
7964 identifier arg;
7965 expr_ty annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01007966 int lineno;
7967 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007968
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007969 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
7970 return 1;
7971 }
7972 if (tmp == NULL) {
7973 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
7974 return 1;
7975 }
7976 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007977 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007978 res = obj2ast_identifier(tmp, &arg, arena);
7979 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007980 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007981 }
7982 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007983 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007984 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007985 if (tmp == NULL || tmp == Py_None) {
7986 Py_CLEAR(tmp);
7987 annotation = NULL;
7988 }
7989 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007990 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007991 res = obj2ast_expr(tmp, &annotation, arena);
7992 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007993 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007994 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007995 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7996 return 1;
7997 }
7998 if (tmp == NULL) {
7999 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
8000 return 1;
8001 }
8002 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008003 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008004 res = obj2ast_int(tmp, &lineno, arena);
8005 if (res != 0) goto failed;
8006 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008007 }
8008 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008009 return 1;
8010 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008011 if (tmp == NULL) {
8012 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
8013 return 1;
8014 }
8015 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008016 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008017 res = obj2ast_int(tmp, &col_offset, arena);
8018 if (res != 0) goto failed;
8019 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008020 }
8021 *out = arg(arg, annotation, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008022 return 0;
8023failed:
8024 Py_XDECREF(tmp);
8025 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008026}
8027
8028int
8029obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8030{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008031 PyObject* tmp = NULL;
8032 identifier arg;
8033 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008034
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008035 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8036 return 1;
8037 }
8038 if (tmp == NULL || tmp == Py_None) {
8039 Py_CLEAR(tmp);
8040 arg = NULL;
8041 }
8042 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008043 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008044 res = obj2ast_identifier(tmp, &arg, arena);
8045 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008046 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008047 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008048 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8049 return 1;
8050 }
8051 if (tmp == NULL) {
8052 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8053 return 1;
8054 }
8055 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008056 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008057 res = obj2ast_expr(tmp, &value, arena);
8058 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008059 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008060 }
8061 *out = keyword(arg, value, arena);
8062 return 0;
8063failed:
8064 Py_XDECREF(tmp);
8065 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008066}
8067
8068int
8069obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8070{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008071 PyObject* tmp = NULL;
8072 identifier name;
8073 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008074
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008075 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8076 return 1;
8077 }
8078 if (tmp == NULL) {
8079 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8080 return 1;
8081 }
8082 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008083 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008084 res = obj2ast_identifier(tmp, &name, arena);
8085 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008086 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008087 }
8088 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008089 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008090 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008091 if (tmp == NULL || tmp == Py_None) {
8092 Py_CLEAR(tmp);
8093 asname = NULL;
8094 }
8095 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008096 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008097 res = obj2ast_identifier(tmp, &asname, arena);
8098 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008099 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008100 }
8101 *out = alias(name, asname, arena);
8102 return 0;
8103failed:
8104 Py_XDECREF(tmp);
8105 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008106}
8107
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008108int
8109obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8110{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008111 PyObject* tmp = NULL;
8112 expr_ty context_expr;
8113 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008114
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008115 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8116 return 1;
8117 }
8118 if (tmp == NULL) {
8119 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8120 return 1;
8121 }
8122 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008123 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008124 res = obj2ast_expr(tmp, &context_expr, arena);
8125 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008126 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008127 }
8128 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008129 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008130 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008131 if (tmp == NULL || tmp == Py_None) {
8132 Py_CLEAR(tmp);
8133 optional_vars = NULL;
8134 }
8135 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008136 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008137 res = obj2ast_expr(tmp, &optional_vars, arena);
8138 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008139 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008140 }
8141 *out = withitem(context_expr, optional_vars, arena);
8142 return 0;
8143failed:
8144 Py_XDECREF(tmp);
8145 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008146}
8147
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008148
Martin v. Löwis1a214512008-06-11 05:26:20 +00008149static struct PyModuleDef _astmodule = {
8150 PyModuleDef_HEAD_INIT, "_ast"
8151};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008152PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008153PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008154{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008155 PyObject *m, *d;
8156 if (!init_types()) return NULL;
8157 m = PyModule_Create(&_astmodule);
8158 if (!m) return NULL;
8159 d = PyModule_GetDict(m);
8160 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008161 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008162 return NULL;
8163 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8164 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8165 NULL;
8166 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8167 0) return NULL;
8168 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8169 return NULL;
8170 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8171 NULL;
8172 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8173 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8174 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008175 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8176 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008177 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8178 return NULL;
8179 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8180 NULL;
8181 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8182 NULL;
8183 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8184 NULL;
8185 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8186 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008187 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8188 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008189 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008190 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8191 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008192 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8193 NULL;
8194 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8195 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008196 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8197 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008198 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8199 NULL;
8200 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8201 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8202 NULL;
8203 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8204 NULL;
8205 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8206 return NULL;
8207 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8208 NULL;
8209 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8210 return NULL;
8211 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8212 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8213 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8214 NULL;
8215 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8216 return NULL;
8217 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8218 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8219 NULL;
8220 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8221 NULL;
8222 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8223 NULL;
8224 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8225 NULL;
8226 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8227 NULL;
8228 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8229 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8230 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8231 return NULL;
8232 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8233 NULL;
8234 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8235 return NULL;
8236 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8237 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008238 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8239 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008240 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8241 NULL;
8242 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8243 return NULL;
8244 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8245 NULL;
8246 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
8247 if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return NULL;
8248 if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008249 if (PyDict_SetItemString(d, "FormattedValue",
8250 (PyObject*)FormattedValue_type) < 0) return NULL;
8251 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8252 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008253 if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return
8254 NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008255 if (PyDict_SetItemString(d, "NameConstant", (PyObject*)NameConstant_type) <
8256 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008257 if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
8258 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008259 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8260 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008261 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8262 return NULL;
8263 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8264 return NULL;
8265 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8266 NULL;
8267 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8268 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8269 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8270 NULL;
8271 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8272 0) return NULL;
8273 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8274 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8275 NULL;
8276 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8277 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8278 NULL;
8279 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8280 return NULL;
8281 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8282 NULL;
8283 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8284 NULL;
8285 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8286 NULL;
8287 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8288 return NULL;
8289 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8290 NULL;
8291 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8292 NULL;
8293 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8294 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8295 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8296 return NULL;
8297 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8298 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8299 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008300 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8301 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008302 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8303 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8304 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8305 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8306 NULL;
8307 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8308 NULL;
8309 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8310 NULL;
8311 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8312 NULL;
8313 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8314 NULL;
8315 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8316 return NULL;
8317 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8318 NULL;
8319 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8320 NULL;
8321 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8322 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8323 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8324 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8325 NULL;
8326 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8327 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8328 NULL;
8329 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8330 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8331 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8332 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8333 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8334 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8335 NULL;
8336 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8337 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8338 NULL;
8339 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8340 < 0) return NULL;
8341 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8342 < 0) return NULL;
8343 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8344 < 0) return NULL;
8345 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8346 return NULL;
8347 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8348 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8349 NULL;
8350 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8351 NULL;
8352 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8353 return NULL;
8354 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008355}
8356
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008357
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008358PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008359{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008360 if (!init_types())
8361 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008362 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008363}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008364
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008365/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8366mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008367{
8368 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008369 PyObject *req_type[3];
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008370 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008371 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008372
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008373 req_type[0] = (PyObject*)Module_type;
8374 req_type[1] = (PyObject*)Expression_type;
8375 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008376
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008377 assert(0 <= mode && mode <= 2);
8378
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008379 if (!init_types())
8380 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008381
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008382 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8383 if (isinstance == -1)
8384 return NULL;
8385 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008386 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8387 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008388 return NULL;
8389 }
8390 if (obj2ast_mod(ast, &res, arena) != 0)
8391 return NULL;
8392 else
8393 return res;
8394}
8395
8396int PyAST_Check(PyObject* obj)
8397{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008398 if (!init_types())
8399 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00008400 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008401}
8402
Martin v. Löwis5b222132007-06-10 09:51:05 +00008403