blob: 81226c8a060d4781472bb744de5b66cdf5a96ea9 [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);
INADA Naokicb41b272017-02-23 00:31:59 +090013_Py_IDENTIFIER(docstring);
Neal Norwitz53d960c2006-02-28 22:47:29 +000014static char *Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020015 "body",
INADA Naokicb41b272017-02-23 00:31:59 +090016 "docstring",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000017};
Neal Norwitz53d960c2006-02-28 22:47:29 +000018static PyTypeObject *Interactive_type;
19static char *Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020020 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000021};
Neal Norwitz53d960c2006-02-28 22:47:29 +000022static PyTypeObject *Expression_type;
23static char *Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020024 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000025};
Neal Norwitz53d960c2006-02-28 22:47:29 +000026static PyTypeObject *Suite_type;
27static char *Suite_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020028 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000029};
Neal Norwitz53d960c2006-02-28 22:47:29 +000030static PyTypeObject *stmt_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020031_Py_IDENTIFIER(lineno);
32_Py_IDENTIFIER(col_offset);
Neal Norwitz53d960c2006-02-28 22:47:29 +000033static char *stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +020034 "lineno",
35 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +000036};
Martin v. Löwisbd260da2006-02-26 19:42:26 +000037static PyObject* ast2obj_stmt(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000038static PyTypeObject *FunctionDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020039_Py_IDENTIFIER(name);
40_Py_IDENTIFIER(args);
41_Py_IDENTIFIER(decorator_list);
42_Py_IDENTIFIER(returns);
Neal Norwitz53d960c2006-02-28 22:47:29 +000043static char *FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020044 "name",
45 "args",
46 "body",
47 "decorator_list",
48 "returns",
INADA Naokicb41b272017-02-23 00:31:59 +090049 "docstring",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000050};
Yury Selivanov75445082015-05-11 22:57:16 -040051static PyTypeObject *AsyncFunctionDef_type;
52static char *AsyncFunctionDef_fields[]={
53 "name",
54 "args",
55 "body",
56 "decorator_list",
57 "returns",
INADA Naokicb41b272017-02-23 00:31:59 +090058 "docstring",
Yury Selivanov75445082015-05-11 22:57:16 -040059};
Neal Norwitz53d960c2006-02-28 22:47:29 +000060static PyTypeObject *ClassDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020061_Py_IDENTIFIER(bases);
62_Py_IDENTIFIER(keywords);
Neal Norwitz53d960c2006-02-28 22:47:29 +000063static char *ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020064 "name",
65 "bases",
66 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +020067 "body",
68 "decorator_list",
INADA Naokicb41b272017-02-23 00:31:59 +090069 "docstring",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000070};
Neal Norwitz53d960c2006-02-28 22:47:29 +000071static PyTypeObject *Return_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020072_Py_IDENTIFIER(value);
Neal Norwitz53d960c2006-02-28 22:47:29 +000073static char *Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020074 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000075};
Neal Norwitz53d960c2006-02-28 22:47:29 +000076static PyTypeObject *Delete_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020077_Py_IDENTIFIER(targets);
Neal Norwitz53d960c2006-02-28 22:47:29 +000078static char *Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020079 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000080};
Neal Norwitz53d960c2006-02-28 22:47:29 +000081static PyTypeObject *Assign_type;
82static char *Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020083 "targets",
84 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000085};
Neal Norwitz53d960c2006-02-28 22:47:29 +000086static PyTypeObject *AugAssign_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020087_Py_IDENTIFIER(target);
88_Py_IDENTIFIER(op);
Neal Norwitz53d960c2006-02-28 22:47:29 +000089static char *AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020090 "target",
91 "op",
92 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000093};
Yury Selivanovf8cb8a12016-09-08 20:50:03 -070094static PyTypeObject *AnnAssign_type;
95_Py_IDENTIFIER(annotation);
96_Py_IDENTIFIER(simple);
97static char *AnnAssign_fields[]={
98 "target",
99 "annotation",
100 "value",
101 "simple",
102};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000103static PyTypeObject *For_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200104_Py_IDENTIFIER(iter);
105_Py_IDENTIFIER(orelse);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000106static char *For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200107 "target",
108 "iter",
109 "body",
110 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000111};
Yury Selivanov75445082015-05-11 22:57:16 -0400112static PyTypeObject *AsyncFor_type;
113static char *AsyncFor_fields[]={
114 "target",
115 "iter",
116 "body",
117 "orelse",
118};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000119static PyTypeObject *While_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200120_Py_IDENTIFIER(test);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000121static char *While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200122 "test",
123 "body",
124 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000125};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000126static PyTypeObject *If_type;
127static char *If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200128 "test",
129 "body",
130 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000131};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000132static PyTypeObject *With_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200133_Py_IDENTIFIER(items);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000134static char *With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200135 "items",
136 "body",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000137};
Yury Selivanov75445082015-05-11 22:57:16 -0400138static PyTypeObject *AsyncWith_type;
139static char *AsyncWith_fields[]={
140 "items",
141 "body",
142};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000143static PyTypeObject *Raise_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200144_Py_IDENTIFIER(exc);
145_Py_IDENTIFIER(cause);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000146static char *Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200147 "exc",
148 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000149};
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500150static PyTypeObject *Try_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200151_Py_IDENTIFIER(handlers);
152_Py_IDENTIFIER(finalbody);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500153static char *Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200154 "body",
155 "handlers",
156 "orelse",
157 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000158};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000159static PyTypeObject *Assert_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200160_Py_IDENTIFIER(msg);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000161static char *Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200162 "test",
163 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000164};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000165static PyTypeObject *Import_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200166_Py_IDENTIFIER(names);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000167static char *Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200168 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000169};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000170static PyTypeObject *ImportFrom_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200171_Py_IDENTIFIER(module);
172_Py_IDENTIFIER(level);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000173static char *ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200174 "module",
175 "names",
176 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000177};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000178static PyTypeObject *Global_type;
179static char *Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200180 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000181};
Jeremy Hylton81e95022007-02-27 06:50:52 +0000182static PyTypeObject *Nonlocal_type;
183static char *Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200184 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000185};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000186static PyTypeObject *Expr_type;
187static char *Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200188 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000189};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000190static PyTypeObject *Pass_type;
191static PyTypeObject *Break_type;
192static PyTypeObject *Continue_type;
193static PyTypeObject *expr_type;
194static char *expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200195 "lineno",
196 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000197};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000198static PyObject* ast2obj_expr(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000199static PyTypeObject *BoolOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200200_Py_IDENTIFIER(values);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000201static char *BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200202 "op",
203 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000204};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000205static PyTypeObject *BinOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200206_Py_IDENTIFIER(left);
207_Py_IDENTIFIER(right);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000208static char *BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200209 "left",
210 "op",
211 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000212};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000213static PyTypeObject *UnaryOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200214_Py_IDENTIFIER(operand);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000215static char *UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200216 "op",
217 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000218};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000219static PyTypeObject *Lambda_type;
220static char *Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200221 "args",
222 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000223};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000224static PyTypeObject *IfExp_type;
225static char *IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200226 "test",
227 "body",
228 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000229};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000230static PyTypeObject *Dict_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200231_Py_IDENTIFIER(keys);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000232static char *Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200233 "keys",
234 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000235};
Guido van Rossum86e58e22006-08-28 15:27:34 +0000236static PyTypeObject *Set_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200237_Py_IDENTIFIER(elts);
Guido van Rossum86e58e22006-08-28 15:27:34 +0000238static char *Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200239 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000240};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000241static PyTypeObject *ListComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200242_Py_IDENTIFIER(elt);
243_Py_IDENTIFIER(generators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000244static char *ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200245 "elt",
246 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000247};
Nick Coghlan650f0d02007-04-15 12:05:43 +0000248static PyTypeObject *SetComp_type;
249static char *SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200250 "elt",
251 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000252};
Guido van Rossum992d4a32007-07-11 13:09:30 +0000253static PyTypeObject *DictComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200254_Py_IDENTIFIER(key);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000255static char *DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200256 "key",
257 "value",
258 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000259};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000260static PyTypeObject *GeneratorExp_type;
261static char *GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200262 "elt",
263 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000264};
Yury Selivanov75445082015-05-11 22:57:16 -0400265static PyTypeObject *Await_type;
266static char *Await_fields[]={
267 "value",
268};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000269static PyTypeObject *Yield_type;
270static char *Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200271 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500272};
273static PyTypeObject *YieldFrom_type;
274static char *YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200275 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000276};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000277static PyTypeObject *Compare_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200278_Py_IDENTIFIER(ops);
279_Py_IDENTIFIER(comparators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000280static char *Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200281 "left",
282 "ops",
283 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000284};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000285static PyTypeObject *Call_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200286_Py_IDENTIFIER(func);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000287static char *Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200288 "func",
289 "args",
290 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000291};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000292static PyTypeObject *Num_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200293_Py_IDENTIFIER(n);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000294static char *Num_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200295 "n",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000296};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000297static PyTypeObject *Str_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200298_Py_IDENTIFIER(s);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000299static char *Str_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200300 "s",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000301};
Eric V. Smith235a6f02015-09-19 14:51:32 -0400302static PyTypeObject *FormattedValue_type;
303_Py_IDENTIFIER(conversion);
304_Py_IDENTIFIER(format_spec);
305static char *FormattedValue_fields[]={
306 "value",
307 "conversion",
308 "format_spec",
309};
310static PyTypeObject *JoinedStr_type;
311static char *JoinedStr_fields[]={
312 "values",
313};
Thomas Wouters00e41de2007-02-23 19:56:57 +0000314static PyTypeObject *Bytes_type;
315static char *Bytes_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200316 "s",
Thomas Wouters00e41de2007-02-23 19:56:57 +0000317};
Benjamin Peterson442f2092012-12-06 17:41:04 -0500318static PyTypeObject *NameConstant_type;
319static char *NameConstant_fields[]={
Victor Stinneree4b59c2013-07-27 00:01:35 +0200320 "value",
Benjamin Peterson442f2092012-12-06 17:41:04 -0500321};
Georg Brandl52318d62006-09-06 07:06:08 +0000322static PyTypeObject *Ellipsis_type;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100323static PyTypeObject *Constant_type;
324static char *Constant_fields[]={
325 "value",
326};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000327static PyTypeObject *Attribute_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200328_Py_IDENTIFIER(attr);
329_Py_IDENTIFIER(ctx);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000330static char *Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200331 "value",
332 "attr",
333 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000334};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000335static PyTypeObject *Subscript_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200336_Py_IDENTIFIER(slice);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000337static char *Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200338 "value",
339 "slice",
340 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000341};
Guido van Rossum0368b722007-05-11 16:50:42 +0000342static PyTypeObject *Starred_type;
343static char *Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200344 "value",
345 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000346};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000347static PyTypeObject *Name_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200348_Py_IDENTIFIER(id);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000349static char *Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200350 "id",
351 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000352};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000353static PyTypeObject *List_type;
354static char *List_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 *Tuple_type;
359static char *Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200360 "elts",
361 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000362};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000363static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000364static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
365*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
366static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000367static PyTypeObject *Load_type;
368static PyTypeObject *Store_type;
369static PyTypeObject *Del_type;
370static PyTypeObject *AugLoad_type;
371static PyTypeObject *AugStore_type;
372static PyTypeObject *Param_type;
373static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000374static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000375static PyTypeObject *Slice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200376_Py_IDENTIFIER(lower);
377_Py_IDENTIFIER(upper);
378_Py_IDENTIFIER(step);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000379static char *Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200380 "lower",
381 "upper",
382 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000383};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000384static PyTypeObject *ExtSlice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200385_Py_IDENTIFIER(dims);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000386static char *ExtSlice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200387 "dims",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000388};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000389static PyTypeObject *Index_type;
390static char *Index_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200391 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000392};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000393static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000394static PyObject *And_singleton, *Or_singleton;
395static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000396static PyTypeObject *And_type;
397static PyTypeObject *Or_type;
398static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000399static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
Benjamin Petersond51374e2014-04-09 23:55:56 -0400400*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton,
401*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton,
402*BitAnd_singleton, *FloorDiv_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000403static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000404static PyTypeObject *Add_type;
405static PyTypeObject *Sub_type;
406static PyTypeObject *Mult_type;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400407static PyTypeObject *MatMult_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000408static PyTypeObject *Div_type;
409static PyTypeObject *Mod_type;
410static PyTypeObject *Pow_type;
411static PyTypeObject *LShift_type;
412static PyTypeObject *RShift_type;
413static PyTypeObject *BitOr_type;
414static PyTypeObject *BitXor_type;
415static PyTypeObject *BitAnd_type;
416static PyTypeObject *FloorDiv_type;
417static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000418static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
419*USub_singleton;
420static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000421static PyTypeObject *Invert_type;
422static PyTypeObject *Not_type;
423static PyTypeObject *UAdd_type;
424static PyTypeObject *USub_type;
425static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000426static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
427*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
428*NotIn_singleton;
429static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000430static PyTypeObject *Eq_type;
431static PyTypeObject *NotEq_type;
432static PyTypeObject *Lt_type;
433static PyTypeObject *LtE_type;
434static PyTypeObject *Gt_type;
435static PyTypeObject *GtE_type;
436static PyTypeObject *Is_type;
437static PyTypeObject *IsNot_type;
438static PyTypeObject *In_type;
439static PyTypeObject *NotIn_type;
440static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000441static PyObject* ast2obj_comprehension(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200442_Py_IDENTIFIER(ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700443_Py_IDENTIFIER(is_async);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000444static char *comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200445 "target",
446 "iter",
447 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700448 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000449};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000450static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000451static char *excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200452 "lineno",
453 "col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000454};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000455static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000456static PyTypeObject *ExceptHandler_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200457_Py_IDENTIFIER(type);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000458static char *ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200459 "type",
460 "name",
461 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000462};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000463static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000464static PyObject* ast2obj_arguments(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200465_Py_IDENTIFIER(vararg);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200466_Py_IDENTIFIER(kwonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200467_Py_IDENTIFIER(kw_defaults);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700468_Py_IDENTIFIER(kwarg);
469_Py_IDENTIFIER(defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000470static char *arguments_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200471 "args",
472 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200473 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200474 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200475 "kwarg",
476 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000477};
Neal Norwitzc1505362006-12-28 06:47:50 +0000478static PyTypeObject *arg_type;
479static PyObject* ast2obj_arg(void*);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700480static char *arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200481 "lineno",
482 "col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700483};
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200484_Py_IDENTIFIER(arg);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000485static char *arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200486 "arg",
487 "annotation",
Neal Norwitzc1505362006-12-28 06:47:50 +0000488};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000489static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000490static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000491static char *keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200492 "arg",
493 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000494};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000495static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000496static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200497_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000498static char *alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200499 "name",
500 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000501};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500502static PyTypeObject *withitem_type;
503static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200504_Py_IDENTIFIER(context_expr);
505_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500506static char *withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200507 "context_expr",
508 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500509};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000510
511
INADA Naokifc489082017-01-25 22:33:43 +0900512_Py_IDENTIFIER(_fields);
513_Py_IDENTIFIER(_attributes);
514
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700515typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100516 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700517 PyObject *dict;
518} AST_object;
519
Benjamin Peterson1767e022012-03-14 21:50:29 -0500520static void
521ast_dealloc(AST_object *self)
522{
INADA Naokia6296d32017-08-24 14:55:17 +0900523 /* bpo-31095: UnTrack is needed before calling any callbacks */
524 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500525 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200526 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500527}
528
Neal Norwitz207c9f32008-03-31 04:42:11 +0000529static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700530ast_traverse(AST_object *self, visitproc visit, void *arg)
531{
532 Py_VISIT(self->dict);
533 return 0;
534}
535
536static void
537ast_clear(AST_object *self)
538{
539 Py_CLEAR(self->dict);
540}
541
542static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000543ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
544{
545 Py_ssize_t i, numfields = 0;
546 int res = -1;
547 PyObject *key, *value, *fields;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200548 fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields);
Neal Norwitz207c9f32008-03-31 04:42:11 +0000549 if (fields) {
550 numfields = PySequence_Size(fields);
551 if (numfields == -1)
552 goto cleanup;
553 }
Serhiy Storchakabba22392017-11-11 16:41:32 +0200554 else if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
555 PyErr_Clear();
556 }
557 else {
558 goto cleanup;
559 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900560
Neal Norwitz207c9f32008-03-31 04:42:11 +0000561 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900562 if (numfields < PyTuple_GET_SIZE(args)) {
563 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
564 "%zd positional argument%s",
565 Py_TYPE(self)->tp_name,
566 numfields, numfields == 1 ? "" : "s");
567 res = -1;
568 goto cleanup;
569 }
570 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
571 /* cannot be reached when fields is NULL */
572 PyObject *name = PySequence_GetItem(fields, i);
573 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000574 res = -1;
575 goto cleanup;
576 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900577 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
578 Py_DECREF(name);
579 if (res < 0)
580 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000581 }
582 if (kw) {
583 i = 0; /* needed by PyDict_Next */
584 while (PyDict_Next(kw, &i, &key, &value)) {
585 res = PyObject_SetAttr(self, key, value);
586 if (res < 0)
587 goto cleanup;
588 }
589 }
590 cleanup:
591 Py_XDECREF(fields);
592 return res;
593}
594
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000595/* Pickling support */
596static PyObject *
597ast_type_reduce(PyObject *self, PyObject *unused)
598{
599 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200600 _Py_IDENTIFIER(__dict__);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200601 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000602 if (dict == NULL) {
603 if (PyErr_ExceptionMatches(PyExc_AttributeError))
604 PyErr_Clear();
605 else
606 return NULL;
607 }
608 if (dict) {
609 res = Py_BuildValue("O()O", Py_TYPE(self), dict);
610 Py_DECREF(dict);
611 return res;
612 }
613 return Py_BuildValue("O()", Py_TYPE(self));
614}
615
616static PyMethodDef ast_type_methods[] = {
617 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
618 {NULL}
619};
620
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700621static PyGetSetDef ast_type_getsets[] = {
622 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
623 {NULL}
624};
625
Neal Norwitz207c9f32008-03-31 04:42:11 +0000626static PyTypeObject AST_type = {
627 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000628 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700629 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000630 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500631 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000632 0, /* tp_print */
633 0, /* tp_getattr */
634 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000635 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000636 0, /* tp_repr */
637 0, /* tp_as_number */
638 0, /* tp_as_sequence */
639 0, /* tp_as_mapping */
640 0, /* tp_hash */
641 0, /* tp_call */
642 0, /* tp_str */
643 PyObject_GenericGetAttr, /* tp_getattro */
644 PyObject_GenericSetAttr, /* tp_setattro */
645 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700646 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000647 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700648 (traverseproc)ast_traverse, /* tp_traverse */
649 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000650 0, /* tp_richcompare */
651 0, /* tp_weaklistoffset */
652 0, /* tp_iter */
653 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000654 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000655 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700656 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000657 0, /* tp_base */
658 0, /* tp_dict */
659 0, /* tp_descr_get */
660 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700661 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000662 (initproc)ast_type_init, /* tp_init */
663 PyType_GenericAlloc, /* tp_alloc */
664 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700665 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000666};
667
668
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000669static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
670{
INADA Naokifc489082017-01-25 22:33:43 +0900671 _Py_IDENTIFIER(__module__);
672 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000673 PyObject *fnames, *result;
674 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000675 fnames = PyTuple_New(num_fields);
676 if (!fnames) return NULL;
677 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000678 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000679 if (!field) {
680 Py_DECREF(fnames);
681 return NULL;
682 }
683 PyTuple_SET_ITEM(fnames, i, field);
684 }
INADA Naokifc489082017-01-25 22:33:43 +0900685 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
686 type, base,
687 _PyUnicode_FromId(&PyId__fields), fnames,
688 _PyUnicode_FromId(&PyId___module__),
689 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000690 Py_DECREF(fnames);
691 return (PyTypeObject*)result;
692}
693
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000694static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
695{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000696 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000697 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000698 if (!l)
699 return 0;
700 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000701 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000702 if (!s) {
703 Py_DECREF(l);
704 return 0;
705 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000706 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000707 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200708 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000709 Py_DECREF(l);
710 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000711}
712
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000713/* Conversion AST -> Python */
714
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000715static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
716{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700717 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000718 PyObject *result = PyList_New(n);
719 PyObject *value;
720 if (!result)
721 return NULL;
722 for (i = 0; i < n; i++) {
723 value = func(asdl_seq_GET(seq, i));
724 if (!value) {
725 Py_DECREF(result);
726 return NULL;
727 }
728 PyList_SET_ITEM(result, i, value);
729 }
730 return result;
731}
732
733static PyObject* ast2obj_object(void *o)
734{
735 if (!o)
736 o = Py_None;
737 Py_INCREF((PyObject*)o);
738 return (PyObject*)o;
739}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500740#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100741#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000742#define ast2obj_identifier ast2obj_object
743#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500744#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000745
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000746static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000747{
Christian Heimes217cfd12007-12-02 14:31:20 +0000748 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000749}
750
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000751/* Conversion Python -> AST */
752
Benjamin Peterson442f2092012-12-06 17:41:04 -0500753static int obj2ast_singleton(PyObject *obj, PyObject** out, PyArena* arena)
754{
755 if (obj != Py_None && obj != Py_True && obj != Py_False) {
756 PyErr_SetString(PyExc_ValueError,
757 "AST singleton must be True, False, or None");
758 return 1;
759 }
760 *out = obj;
761 return 0;
762}
763
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000764static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
765{
766 if (obj == Py_None)
767 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200768 if (obj) {
769 if (PyArena_AddPyObject(arena, obj) < 0) {
770 *out = NULL;
771 return -1;
772 }
773 Py_INCREF(obj);
774 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000775 *out = obj;
776 return 0;
777}
778
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100779static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
780{
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100781 if (obj) {
782 if (PyArena_AddPyObject(arena, obj) < 0) {
783 *out = NULL;
784 return -1;
785 }
786 Py_INCREF(obj);
787 }
788 *out = obj;
789 return 0;
790}
791
Benjamin Peterson180e6352011-07-22 11:09:07 -0500792static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500793{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500794 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
795 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500796 return 1;
797 }
798 return obj2ast_object(obj, out, arena);
799}
800
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500801static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
802{
Benjamin Peterson0224d4e2011-08-31 22:13:03 -0400803 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
Benjamin Peterson180e6352011-07-22 11:09:07 -0500804 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
805 return 1;
806 }
807 return obj2ast_object(obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500808}
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000809
Benjamin Petersone2498412011-08-09 16:08:39 -0500810static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
811{
812 if (!PyBytes_CheckExact(obj)) {
813 PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
814 return 1;
815 }
816 return obj2ast_object(obj, out, arena);
817}
818
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000819static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
820{
821 int i;
822 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100823 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000824 return 1;
825 }
826
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300827 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000828 if (i == -1 && PyErr_Occurred())
829 return 1;
830 *out = i;
831 return 0;
832}
833
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000834static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000835{
836 PyObject *empty_tuple, *d;
837 if (PyType_Ready(&AST_type) < 0)
838 return -1;
839 d = AST_type.tp_dict;
840 empty_tuple = PyTuple_New(0);
841 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900842 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
843 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000844 Py_XDECREF(empty_tuple);
845 return -1;
846 }
847 Py_DECREF(empty_tuple);
848 return 0;
849}
850
Serhiy Storchakabba22392017-11-11 16:41:32 +0200851static PyObject *get_not_none(PyObject *obj, _Py_Identifier *id)
Benjamin Petersonb72406b2013-03-18 23:24:41 -0700852{
853 PyObject *attr = _PyObject_GetAttrId(obj, id);
854 if (!attr) {
Serhiy Storchakabba22392017-11-11 16:41:32 +0200855 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
856 PyErr_Clear();
857 }
858 return NULL;
Benjamin Petersonb72406b2013-03-18 23:24:41 -0700859 }
Serhiy Storchakabba22392017-11-11 16:41:32 +0200860 else if (attr == Py_None) {
861 Py_DECREF(attr);
862 return NULL;
863 }
864 return attr;
Benjamin Petersonb72406b2013-03-18 23:24:41 -0700865}
866
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000867
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000868static int init_types(void)
869{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200870 static int initialized;
871 if (initialized) return 1;
872 if (add_ast_fields() < 0) return 0;
873 mod_type = make_type("mod", &AST_type, NULL, 0);
874 if (!mod_type) return 0;
875 if (!add_attributes(mod_type, NULL, 0)) return 0;
INADA Naokicb41b272017-02-23 00:31:59 +0900876 Module_type = make_type("Module", mod_type, Module_fields, 2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200877 if (!Module_type) return 0;
878 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
879 1);
880 if (!Interactive_type) return 0;
881 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
882 if (!Expression_type) return 0;
883 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
884 if (!Suite_type) return 0;
885 stmt_type = make_type("stmt", &AST_type, NULL, 0);
886 if (!stmt_type) return 0;
887 if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
888 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
INADA Naokicb41b272017-02-23 00:31:59 +0900889 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200890 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400891 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
INADA Naokicb41b272017-02-23 00:31:59 +0900892 AsyncFunctionDef_fields, 6);
Yury Selivanov75445082015-05-11 22:57:16 -0400893 if (!AsyncFunctionDef_type) return 0;
INADA Naokicb41b272017-02-23 00:31:59 +0900894 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200895 if (!ClassDef_type) return 0;
896 Return_type = make_type("Return", stmt_type, Return_fields, 1);
897 if (!Return_type) return 0;
898 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
899 if (!Delete_type) return 0;
900 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
901 if (!Assign_type) return 0;
902 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
903 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700904 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
905 if (!AnnAssign_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200906 For_type = make_type("For", stmt_type, For_fields, 4);
907 if (!For_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400908 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4);
909 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200910 While_type = make_type("While", stmt_type, While_fields, 3);
911 if (!While_type) return 0;
912 If_type = make_type("If", stmt_type, If_fields, 3);
913 if (!If_type) return 0;
914 With_type = make_type("With", stmt_type, With_fields, 2);
915 if (!With_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400916 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 2);
917 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200918 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
919 if (!Raise_type) return 0;
920 Try_type = make_type("Try", stmt_type, Try_fields, 4);
921 if (!Try_type) return 0;
922 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
923 if (!Assert_type) return 0;
924 Import_type = make_type("Import", stmt_type, Import_fields, 1);
925 if (!Import_type) return 0;
926 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
927 if (!ImportFrom_type) return 0;
928 Global_type = make_type("Global", stmt_type, Global_fields, 1);
929 if (!Global_type) return 0;
930 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
931 if (!Nonlocal_type) return 0;
932 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
933 if (!Expr_type) return 0;
934 Pass_type = make_type("Pass", stmt_type, NULL, 0);
935 if (!Pass_type) return 0;
936 Break_type = make_type("Break", stmt_type, NULL, 0);
937 if (!Break_type) return 0;
938 Continue_type = make_type("Continue", stmt_type, NULL, 0);
939 if (!Continue_type) return 0;
940 expr_type = make_type("expr", &AST_type, NULL, 0);
941 if (!expr_type) return 0;
942 if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
943 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
944 if (!BoolOp_type) return 0;
945 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
946 if (!BinOp_type) return 0;
947 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
948 if (!UnaryOp_type) return 0;
949 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
950 if (!Lambda_type) return 0;
951 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
952 if (!IfExp_type) return 0;
953 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
954 if (!Dict_type) return 0;
955 Set_type = make_type("Set", expr_type, Set_fields, 1);
956 if (!Set_type) return 0;
957 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
958 if (!ListComp_type) return 0;
959 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
960 if (!SetComp_type) return 0;
961 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
962 if (!DictComp_type) return 0;
963 GeneratorExp_type = make_type("GeneratorExp", expr_type,
964 GeneratorExp_fields, 2);
965 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400966 Await_type = make_type("Await", expr_type, Await_fields, 1);
967 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200968 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
969 if (!Yield_type) return 0;
970 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
971 if (!YieldFrom_type) return 0;
972 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
973 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400974 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200975 if (!Call_type) return 0;
976 Num_type = make_type("Num", expr_type, Num_fields, 1);
977 if (!Num_type) return 0;
978 Str_type = make_type("Str", expr_type, Str_fields, 1);
979 if (!Str_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400980 FormattedValue_type = make_type("FormattedValue", expr_type,
981 FormattedValue_fields, 3);
982 if (!FormattedValue_type) return 0;
983 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
984 if (!JoinedStr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200985 Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);
986 if (!Bytes_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +0200987 NameConstant_type = make_type("NameConstant", expr_type,
988 NameConstant_fields, 1);
989 if (!NameConstant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200990 Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);
991 if (!Ellipsis_type) return 0;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100992 Constant_type = make_type("Constant", expr_type, Constant_fields, 1);
993 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200994 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
995 if (!Attribute_type) return 0;
996 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
997 if (!Subscript_type) return 0;
998 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
999 if (!Starred_type) return 0;
1000 Name_type = make_type("Name", expr_type, Name_fields, 2);
1001 if (!Name_type) return 0;
1002 List_type = make_type("List", expr_type, List_fields, 2);
1003 if (!List_type) return 0;
1004 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
1005 if (!Tuple_type) return 0;
1006 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
1007 if (!expr_context_type) return 0;
1008 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
1009 Load_type = make_type("Load", expr_context_type, NULL, 0);
1010 if (!Load_type) return 0;
1011 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
1012 if (!Load_singleton) return 0;
1013 Store_type = make_type("Store", expr_context_type, NULL, 0);
1014 if (!Store_type) return 0;
1015 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
1016 if (!Store_singleton) return 0;
1017 Del_type = make_type("Del", expr_context_type, NULL, 0);
1018 if (!Del_type) return 0;
1019 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
1020 if (!Del_singleton) return 0;
1021 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
1022 if (!AugLoad_type) return 0;
1023 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
1024 if (!AugLoad_singleton) return 0;
1025 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
1026 if (!AugStore_type) return 0;
1027 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
1028 if (!AugStore_singleton) return 0;
1029 Param_type = make_type("Param", expr_context_type, NULL, 0);
1030 if (!Param_type) return 0;
1031 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
1032 if (!Param_singleton) return 0;
1033 slice_type = make_type("slice", &AST_type, NULL, 0);
1034 if (!slice_type) return 0;
1035 if (!add_attributes(slice_type, NULL, 0)) return 0;
1036 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1037 if (!Slice_type) return 0;
1038 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1039 if (!ExtSlice_type) return 0;
1040 Index_type = make_type("Index", slice_type, Index_fields, 1);
1041 if (!Index_type) return 0;
1042 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1043 if (!boolop_type) return 0;
1044 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1045 And_type = make_type("And", boolop_type, NULL, 0);
1046 if (!And_type) return 0;
1047 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1048 if (!And_singleton) return 0;
1049 Or_type = make_type("Or", boolop_type, NULL, 0);
1050 if (!Or_type) return 0;
1051 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1052 if (!Or_singleton) return 0;
1053 operator_type = make_type("operator", &AST_type, NULL, 0);
1054 if (!operator_type) return 0;
1055 if (!add_attributes(operator_type, NULL, 0)) return 0;
1056 Add_type = make_type("Add", operator_type, NULL, 0);
1057 if (!Add_type) return 0;
1058 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1059 if (!Add_singleton) return 0;
1060 Sub_type = make_type("Sub", operator_type, NULL, 0);
1061 if (!Sub_type) return 0;
1062 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1063 if (!Sub_singleton) return 0;
1064 Mult_type = make_type("Mult", operator_type, NULL, 0);
1065 if (!Mult_type) return 0;
1066 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1067 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001068 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1069 if (!MatMult_type) return 0;
1070 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1071 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001072 Div_type = make_type("Div", operator_type, NULL, 0);
1073 if (!Div_type) return 0;
1074 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1075 if (!Div_singleton) return 0;
1076 Mod_type = make_type("Mod", operator_type, NULL, 0);
1077 if (!Mod_type) return 0;
1078 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1079 if (!Mod_singleton) return 0;
1080 Pow_type = make_type("Pow", operator_type, NULL, 0);
1081 if (!Pow_type) return 0;
1082 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1083 if (!Pow_singleton) return 0;
1084 LShift_type = make_type("LShift", operator_type, NULL, 0);
1085 if (!LShift_type) return 0;
1086 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1087 if (!LShift_singleton) return 0;
1088 RShift_type = make_type("RShift", operator_type, NULL, 0);
1089 if (!RShift_type) return 0;
1090 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1091 if (!RShift_singleton) return 0;
1092 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1093 if (!BitOr_type) return 0;
1094 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1095 if (!BitOr_singleton) return 0;
1096 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1097 if (!BitXor_type) return 0;
1098 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1099 if (!BitXor_singleton) return 0;
1100 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1101 if (!BitAnd_type) return 0;
1102 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1103 if (!BitAnd_singleton) return 0;
1104 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1105 if (!FloorDiv_type) return 0;
1106 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1107 if (!FloorDiv_singleton) return 0;
1108 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1109 if (!unaryop_type) return 0;
1110 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1111 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1112 if (!Invert_type) return 0;
1113 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1114 if (!Invert_singleton) return 0;
1115 Not_type = make_type("Not", unaryop_type, NULL, 0);
1116 if (!Not_type) return 0;
1117 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1118 if (!Not_singleton) return 0;
1119 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1120 if (!UAdd_type) return 0;
1121 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1122 if (!UAdd_singleton) return 0;
1123 USub_type = make_type("USub", unaryop_type, NULL, 0);
1124 if (!USub_type) return 0;
1125 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1126 if (!USub_singleton) return 0;
1127 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1128 if (!cmpop_type) return 0;
1129 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1130 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1131 if (!Eq_type) return 0;
1132 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1133 if (!Eq_singleton) return 0;
1134 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1135 if (!NotEq_type) return 0;
1136 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1137 if (!NotEq_singleton) return 0;
1138 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1139 if (!Lt_type) return 0;
1140 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1141 if (!Lt_singleton) return 0;
1142 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1143 if (!LtE_type) return 0;
1144 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1145 if (!LtE_singleton) return 0;
1146 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1147 if (!Gt_type) return 0;
1148 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1149 if (!Gt_singleton) return 0;
1150 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1151 if (!GtE_type) return 0;
1152 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1153 if (!GtE_singleton) return 0;
1154 Is_type = make_type("Is", cmpop_type, NULL, 0);
1155 if (!Is_type) return 0;
1156 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1157 if (!Is_singleton) return 0;
1158 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1159 if (!IsNot_type) return 0;
1160 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1161 if (!IsNot_singleton) return 0;
1162 In_type = make_type("In", cmpop_type, NULL, 0);
1163 if (!In_type) return 0;
1164 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1165 if (!In_singleton) return 0;
1166 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1167 if (!NotIn_type) return 0;
1168 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1169 if (!NotIn_singleton) return 0;
1170 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001171 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001172 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001173 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001174 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1175 if (!excepthandler_type) return 0;
1176 if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
1177 return 0;
1178 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1179 ExceptHandler_fields, 3);
1180 if (!ExceptHandler_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001181 arguments_type = make_type("arguments", &AST_type, arguments_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001182 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001183 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001184 arg_type = make_type("arg", &AST_type, arg_fields, 2);
1185 if (!arg_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001186 if (!add_attributes(arg_type, arg_attributes, 2)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001187 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1188 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001189 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001190 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1191 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001192 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001193 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1194 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001195 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001196 initialized = 1;
1197 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001198}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001199
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001200static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1201static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1202static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1203static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1204 arena);
1205static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1206static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1207static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1208static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1209static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1210static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1211 arena);
1212static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1213 arena);
1214static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1215static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1216static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1217static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001218static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001219
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220mod_ty
INADA Naokicb41b272017-02-23 00:31:59 +09001221Module(asdl_seq * body, string docstring, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001223 mod_ty p;
1224 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1225 if (!p)
1226 return NULL;
1227 p->kind = Module_kind;
1228 p->v.Module.body = body;
INADA Naokicb41b272017-02-23 00:31:59 +09001229 p->v.Module.docstring = docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001230 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231}
1232
1233mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001234Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001236 mod_ty p;
1237 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1238 if (!p)
1239 return NULL;
1240 p->kind = Interactive_kind;
1241 p->v.Interactive.body = body;
1242 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243}
1244
1245mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001246Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001248 mod_ty p;
1249 if (!body) {
1250 PyErr_SetString(PyExc_ValueError,
1251 "field body is required for Expression");
1252 return NULL;
1253 }
1254 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1255 if (!p)
1256 return NULL;
1257 p->kind = Expression_kind;
1258 p->v.Expression.body = body;
1259 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260}
1261
1262mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001263Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001265 mod_ty p;
1266 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1267 if (!p)
1268 return NULL;
1269 p->kind = Suite_kind;
1270 p->v.Suite.body = body;
1271 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272}
1273
1274stmt_ty
1275FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
INADA Naokicb41b272017-02-23 00:31:59 +09001276 decorator_list, expr_ty returns, string docstring, int lineno, int
1277 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001279 stmt_ty p;
1280 if (!name) {
1281 PyErr_SetString(PyExc_ValueError,
1282 "field name is required for FunctionDef");
1283 return NULL;
1284 }
1285 if (!args) {
1286 PyErr_SetString(PyExc_ValueError,
1287 "field args is required for FunctionDef");
1288 return NULL;
1289 }
1290 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1291 if (!p)
1292 return NULL;
1293 p->kind = FunctionDef_kind;
1294 p->v.FunctionDef.name = name;
1295 p->v.FunctionDef.args = args;
1296 p->v.FunctionDef.body = body;
1297 p->v.FunctionDef.decorator_list = decorator_list;
1298 p->v.FunctionDef.returns = returns;
INADA Naokicb41b272017-02-23 00:31:59 +09001299 p->v.FunctionDef.docstring = docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001300 p->lineno = lineno;
1301 p->col_offset = col_offset;
1302 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303}
1304
1305stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001306AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
INADA Naokicb41b272017-02-23 00:31:59 +09001307 * decorator_list, expr_ty returns, string docstring, int
1308 lineno, int col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001309{
1310 stmt_ty p;
1311 if (!name) {
1312 PyErr_SetString(PyExc_ValueError,
1313 "field name is required for AsyncFunctionDef");
1314 return NULL;
1315 }
1316 if (!args) {
1317 PyErr_SetString(PyExc_ValueError,
1318 "field args is required for AsyncFunctionDef");
1319 return NULL;
1320 }
1321 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1322 if (!p)
1323 return NULL;
1324 p->kind = AsyncFunctionDef_kind;
1325 p->v.AsyncFunctionDef.name = name;
1326 p->v.AsyncFunctionDef.args = args;
1327 p->v.AsyncFunctionDef.body = body;
1328 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1329 p->v.AsyncFunctionDef.returns = returns;
INADA Naokicb41b272017-02-23 00:31:59 +09001330 p->v.AsyncFunctionDef.docstring = docstring;
Yury Selivanov75445082015-05-11 22:57:16 -04001331 p->lineno = lineno;
1332 p->col_offset = col_offset;
1333 return p;
1334}
1335
1336stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001337ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
INADA Naokicb41b272017-02-23 00:31:59 +09001338 body, asdl_seq * decorator_list, string docstring, int lineno, int
1339 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001341 stmt_ty p;
1342 if (!name) {
1343 PyErr_SetString(PyExc_ValueError,
1344 "field name is required for ClassDef");
1345 return NULL;
1346 }
1347 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1348 if (!p)
1349 return NULL;
1350 p->kind = ClassDef_kind;
1351 p->v.ClassDef.name = name;
1352 p->v.ClassDef.bases = bases;
1353 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001354 p->v.ClassDef.body = body;
1355 p->v.ClassDef.decorator_list = decorator_list;
INADA Naokicb41b272017-02-23 00:31:59 +09001356 p->v.ClassDef.docstring = docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001357 p->lineno = lineno;
1358 p->col_offset = col_offset;
1359 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360}
1361
1362stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001363Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001365 stmt_ty p;
1366 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1367 if (!p)
1368 return NULL;
1369 p->kind = Return_kind;
1370 p->v.Return.value = value;
1371 p->lineno = lineno;
1372 p->col_offset = col_offset;
1373 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374}
1375
1376stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001377Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001378{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001379 stmt_ty p;
1380 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1381 if (!p)
1382 return NULL;
1383 p->kind = Delete_kind;
1384 p->v.Delete.targets = targets;
1385 p->lineno = lineno;
1386 p->col_offset = col_offset;
1387 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388}
1389
1390stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001391Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1392 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001394 stmt_ty p;
1395 if (!value) {
1396 PyErr_SetString(PyExc_ValueError,
1397 "field value is required for Assign");
1398 return NULL;
1399 }
1400 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1401 if (!p)
1402 return NULL;
1403 p->kind = Assign_kind;
1404 p->v.Assign.targets = targets;
1405 p->v.Assign.value = value;
1406 p->lineno = lineno;
1407 p->col_offset = col_offset;
1408 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409}
1410
1411stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001412AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1413 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001415 stmt_ty p;
1416 if (!target) {
1417 PyErr_SetString(PyExc_ValueError,
1418 "field target is required for AugAssign");
1419 return NULL;
1420 }
1421 if (!op) {
1422 PyErr_SetString(PyExc_ValueError,
1423 "field op is required for AugAssign");
1424 return NULL;
1425 }
1426 if (!value) {
1427 PyErr_SetString(PyExc_ValueError,
1428 "field value is required for AugAssign");
1429 return NULL;
1430 }
1431 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1432 if (!p)
1433 return NULL;
1434 p->kind = AugAssign_kind;
1435 p->v.AugAssign.target = target;
1436 p->v.AugAssign.op = op;
1437 p->v.AugAssign.value = value;
1438 p->lineno = lineno;
1439 p->col_offset = col_offset;
1440 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441}
1442
1443stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001444AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
1445 lineno, int col_offset, PyArena *arena)
1446{
1447 stmt_ty p;
1448 if (!target) {
1449 PyErr_SetString(PyExc_ValueError,
1450 "field target is required for AnnAssign");
1451 return NULL;
1452 }
1453 if (!annotation) {
1454 PyErr_SetString(PyExc_ValueError,
1455 "field annotation is required for AnnAssign");
1456 return NULL;
1457 }
1458 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1459 if (!p)
1460 return NULL;
1461 p->kind = AnnAssign_kind;
1462 p->v.AnnAssign.target = target;
1463 p->v.AnnAssign.annotation = annotation;
1464 p->v.AnnAssign.value = value;
1465 p->v.AnnAssign.simple = simple;
1466 p->lineno = lineno;
1467 p->col_offset = col_offset;
1468 return p;
1469}
1470
1471stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001473 lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001475 stmt_ty p;
1476 if (!target) {
1477 PyErr_SetString(PyExc_ValueError,
1478 "field target is required for For");
1479 return NULL;
1480 }
1481 if (!iter) {
1482 PyErr_SetString(PyExc_ValueError,
1483 "field iter is required for For");
1484 return NULL;
1485 }
1486 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1487 if (!p)
1488 return NULL;
1489 p->kind = For_kind;
1490 p->v.For.target = target;
1491 p->v.For.iter = iter;
1492 p->v.For.body = body;
1493 p->v.For.orelse = orelse;
1494 p->lineno = lineno;
1495 p->col_offset = col_offset;
1496 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497}
1498
1499stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001500AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
1501 lineno, int col_offset, PyArena *arena)
1502{
1503 stmt_ty p;
1504 if (!target) {
1505 PyErr_SetString(PyExc_ValueError,
1506 "field target is required for AsyncFor");
1507 return NULL;
1508 }
1509 if (!iter) {
1510 PyErr_SetString(PyExc_ValueError,
1511 "field iter is required for AsyncFor");
1512 return NULL;
1513 }
1514 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1515 if (!p)
1516 return NULL;
1517 p->kind = AsyncFor_kind;
1518 p->v.AsyncFor.target = target;
1519 p->v.AsyncFor.iter = iter;
1520 p->v.AsyncFor.body = body;
1521 p->v.AsyncFor.orelse = orelse;
1522 p->lineno = lineno;
1523 p->col_offset = col_offset;
1524 return p;
1525}
1526
1527stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001528While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1529 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001531 stmt_ty p;
1532 if (!test) {
1533 PyErr_SetString(PyExc_ValueError,
1534 "field test is required for While");
1535 return NULL;
1536 }
1537 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1538 if (!p)
1539 return NULL;
1540 p->kind = While_kind;
1541 p->v.While.test = test;
1542 p->v.While.body = body;
1543 p->v.While.orelse = orelse;
1544 p->lineno = lineno;
1545 p->col_offset = col_offset;
1546 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547}
1548
1549stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001550If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1551 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001552{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001553 stmt_ty p;
1554 if (!test) {
1555 PyErr_SetString(PyExc_ValueError,
1556 "field test is required for If");
1557 return NULL;
1558 }
1559 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1560 if (!p)
1561 return NULL;
1562 p->kind = If_kind;
1563 p->v.If.test = test;
1564 p->v.If.body = body;
1565 p->v.If.orelse = orelse;
1566 p->lineno = lineno;
1567 p->col_offset = col_offset;
1568 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569}
1570
1571stmt_ty
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001572With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
1573 *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001574{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001575 stmt_ty p;
1576 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1577 if (!p)
1578 return NULL;
1579 p->kind = With_kind;
1580 p->v.With.items = items;
1581 p->v.With.body = body;
1582 p->lineno = lineno;
1583 p->col_offset = col_offset;
1584 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001585}
1586
1587stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001588AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset,
1589 PyArena *arena)
1590{
1591 stmt_ty p;
1592 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1593 if (!p)
1594 return NULL;
1595 p->kind = AsyncWith_kind;
1596 p->v.AsyncWith.items = items;
1597 p->v.AsyncWith.body = body;
1598 p->lineno = lineno;
1599 p->col_offset = col_offset;
1600 return p;
1601}
1602
1603stmt_ty
Collin Winter828f04a2007-08-31 00:04:24 +00001604Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001605{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001606 stmt_ty p;
1607 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1608 if (!p)
1609 return NULL;
1610 p->kind = Raise_kind;
1611 p->v.Raise.exc = exc;
1612 p->v.Raise.cause = cause;
1613 p->lineno = lineno;
1614 p->col_offset = col_offset;
1615 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001616}
1617
1618stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001619Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
1620 finalbody, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001621{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001622 stmt_ty p;
1623 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1624 if (!p)
1625 return NULL;
1626 p->kind = Try_kind;
1627 p->v.Try.body = body;
1628 p->v.Try.handlers = handlers;
1629 p->v.Try.orelse = orelse;
1630 p->v.Try.finalbody = finalbody;
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 +00001637Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001639 stmt_ty p;
1640 if (!test) {
1641 PyErr_SetString(PyExc_ValueError,
1642 "field test is required for Assert");
1643 return NULL;
1644 }
1645 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1646 if (!p)
1647 return NULL;
1648 p->kind = Assert_kind;
1649 p->v.Assert.test = test;
1650 p->v.Assert.msg = msg;
1651 p->lineno = lineno;
1652 p->col_offset = col_offset;
1653 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654}
1655
1656stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001657Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001659 stmt_ty p;
1660 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1661 if (!p)
1662 return NULL;
1663 p->kind = Import_kind;
1664 p->v.Import.names = names;
1665 p->lineno = lineno;
1666 p->col_offset = col_offset;
1667 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668}
1669
1670stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001671ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1672 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001674 stmt_ty p;
1675 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1676 if (!p)
1677 return NULL;
1678 p->kind = ImportFrom_kind;
1679 p->v.ImportFrom.module = module;
1680 p->v.ImportFrom.names = names;
1681 p->v.ImportFrom.level = level;
1682 p->lineno = lineno;
1683 p->col_offset = col_offset;
1684 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685}
1686
1687stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001688Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001690 stmt_ty p;
1691 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1692 if (!p)
1693 return NULL;
1694 p->kind = Global_kind;
1695 p->v.Global.names = names;
1696 p->lineno = lineno;
1697 p->col_offset = col_offset;
1698 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699}
1700
1701stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00001702Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1703{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001704 stmt_ty p;
1705 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1706 if (!p)
1707 return NULL;
1708 p->kind = Nonlocal_kind;
1709 p->v.Nonlocal.names = names;
1710 p->lineno = lineno;
1711 p->col_offset = col_offset;
1712 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001713}
1714
1715stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001716Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001718 stmt_ty p;
1719 if (!value) {
1720 PyErr_SetString(PyExc_ValueError,
1721 "field value is required for Expr");
1722 return NULL;
1723 }
1724 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1725 if (!p)
1726 return NULL;
1727 p->kind = Expr_kind;
1728 p->v.Expr.value = value;
1729 p->lineno = lineno;
1730 p->col_offset = col_offset;
1731 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732}
1733
1734stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001735Pass(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001737 stmt_ty p;
1738 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1739 if (!p)
1740 return NULL;
1741 p->kind = Pass_kind;
1742 p->lineno = lineno;
1743 p->col_offset = col_offset;
1744 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745}
1746
1747stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001748Break(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001750 stmt_ty p;
1751 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1752 if (!p)
1753 return NULL;
1754 p->kind = Break_kind;
1755 p->lineno = lineno;
1756 p->col_offset = col_offset;
1757 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758}
1759
1760stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001761Continue(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001763 stmt_ty p;
1764 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1765 if (!p)
1766 return NULL;
1767 p->kind = Continue_kind;
1768 p->lineno = lineno;
1769 p->col_offset = col_offset;
1770 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771}
1772
1773expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001774BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1775 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001777 expr_ty p;
1778 if (!op) {
1779 PyErr_SetString(PyExc_ValueError,
1780 "field op is required for BoolOp");
1781 return NULL;
1782 }
1783 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1784 if (!p)
1785 return NULL;
1786 p->kind = BoolOp_kind;
1787 p->v.BoolOp.op = op;
1788 p->v.BoolOp.values = values;
1789 p->lineno = lineno;
1790 p->col_offset = col_offset;
1791 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792}
1793
1794expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001795BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1796 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001798 expr_ty p;
1799 if (!left) {
1800 PyErr_SetString(PyExc_ValueError,
1801 "field left is required for BinOp");
1802 return NULL;
1803 }
1804 if (!op) {
1805 PyErr_SetString(PyExc_ValueError,
1806 "field op is required for BinOp");
1807 return NULL;
1808 }
1809 if (!right) {
1810 PyErr_SetString(PyExc_ValueError,
1811 "field right is required for BinOp");
1812 return NULL;
1813 }
1814 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1815 if (!p)
1816 return NULL;
1817 p->kind = BinOp_kind;
1818 p->v.BinOp.left = left;
1819 p->v.BinOp.op = op;
1820 p->v.BinOp.right = right;
1821 p->lineno = lineno;
1822 p->col_offset = col_offset;
1823 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824}
1825
1826expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001827UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1828 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001830 expr_ty p;
1831 if (!op) {
1832 PyErr_SetString(PyExc_ValueError,
1833 "field op is required for UnaryOp");
1834 return NULL;
1835 }
1836 if (!operand) {
1837 PyErr_SetString(PyExc_ValueError,
1838 "field operand is required for UnaryOp");
1839 return NULL;
1840 }
1841 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1842 if (!p)
1843 return NULL;
1844 p->kind = UnaryOp_kind;
1845 p->v.UnaryOp.op = op;
1846 p->v.UnaryOp.operand = operand;
1847 p->lineno = lineno;
1848 p->col_offset = col_offset;
1849 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850}
1851
1852expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001853Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
1854 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001856 expr_ty p;
1857 if (!args) {
1858 PyErr_SetString(PyExc_ValueError,
1859 "field args is required for Lambda");
1860 return NULL;
1861 }
1862 if (!body) {
1863 PyErr_SetString(PyExc_ValueError,
1864 "field body is required for Lambda");
1865 return NULL;
1866 }
1867 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1868 if (!p)
1869 return NULL;
1870 p->kind = Lambda_kind;
1871 p->v.Lambda.args = args;
1872 p->v.Lambda.body = body;
1873 p->lineno = lineno;
1874 p->col_offset = col_offset;
1875 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876}
1877
1878expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001879IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1880 PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001881{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001882 expr_ty p;
1883 if (!test) {
1884 PyErr_SetString(PyExc_ValueError,
1885 "field test is required for IfExp");
1886 return NULL;
1887 }
1888 if (!body) {
1889 PyErr_SetString(PyExc_ValueError,
1890 "field body is required for IfExp");
1891 return NULL;
1892 }
1893 if (!orelse) {
1894 PyErr_SetString(PyExc_ValueError,
1895 "field orelse is required for IfExp");
1896 return NULL;
1897 }
1898 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1899 if (!p)
1900 return NULL;
1901 p->kind = IfExp_kind;
1902 p->v.IfExp.test = test;
1903 p->v.IfExp.body = body;
1904 p->v.IfExp.orelse = orelse;
1905 p->lineno = lineno;
1906 p->col_offset = col_offset;
1907 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001908}
1909
1910expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001911Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1912 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001914 expr_ty p;
1915 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1916 if (!p)
1917 return NULL;
1918 p->kind = Dict_kind;
1919 p->v.Dict.keys = keys;
1920 p->v.Dict.values = values;
1921 p->lineno = lineno;
1922 p->col_offset = col_offset;
1923 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924}
1925
1926expr_ty
Guido van Rossum86e58e22006-08-28 15:27:34 +00001927Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1928{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001929 expr_ty p;
1930 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1931 if (!p)
1932 return NULL;
1933 p->kind = Set_kind;
1934 p->v.Set.elts = elts;
1935 p->lineno = lineno;
1936 p->col_offset = col_offset;
1937 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001938}
1939
1940expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001941ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1942 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001944 expr_ty p;
1945 if (!elt) {
1946 PyErr_SetString(PyExc_ValueError,
1947 "field elt is required for ListComp");
1948 return NULL;
1949 }
1950 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1951 if (!p)
1952 return NULL;
1953 p->kind = ListComp_kind;
1954 p->v.ListComp.elt = elt;
1955 p->v.ListComp.generators = generators;
1956 p->lineno = lineno;
1957 p->col_offset = col_offset;
1958 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959}
1960
1961expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001962SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1963 *arena)
1964{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001965 expr_ty p;
1966 if (!elt) {
1967 PyErr_SetString(PyExc_ValueError,
1968 "field elt is required for SetComp");
1969 return NULL;
1970 }
1971 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1972 if (!p)
1973 return NULL;
1974 p->kind = SetComp_kind;
1975 p->v.SetComp.elt = elt;
1976 p->v.SetComp.generators = generators;
1977 p->lineno = lineno;
1978 p->col_offset = col_offset;
1979 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001980}
1981
1982expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001983DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1984 col_offset, PyArena *arena)
1985{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001986 expr_ty p;
1987 if (!key) {
1988 PyErr_SetString(PyExc_ValueError,
1989 "field key is required for DictComp");
1990 return NULL;
1991 }
1992 if (!value) {
1993 PyErr_SetString(PyExc_ValueError,
1994 "field value is required for DictComp");
1995 return NULL;
1996 }
1997 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1998 if (!p)
1999 return NULL;
2000 p->kind = DictComp_kind;
2001 p->v.DictComp.key = key;
2002 p->v.DictComp.value = value;
2003 p->v.DictComp.generators = generators;
2004 p->lineno = lineno;
2005 p->col_offset = col_offset;
2006 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002007}
2008
2009expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002010GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
2011 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002013 expr_ty p;
2014 if (!elt) {
2015 PyErr_SetString(PyExc_ValueError,
2016 "field elt is required for GeneratorExp");
2017 return NULL;
2018 }
2019 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2020 if (!p)
2021 return NULL;
2022 p->kind = GeneratorExp_kind;
2023 p->v.GeneratorExp.elt = elt;
2024 p->v.GeneratorExp.generators = generators;
2025 p->lineno = lineno;
2026 p->col_offset = col_offset;
2027 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028}
2029
2030expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002031Await(expr_ty value, int lineno, int col_offset, PyArena *arena)
2032{
2033 expr_ty p;
2034 if (!value) {
2035 PyErr_SetString(PyExc_ValueError,
2036 "field value is required for Await");
2037 return NULL;
2038 }
2039 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2040 if (!p)
2041 return NULL;
2042 p->kind = Await_kind;
2043 p->v.Await.value = value;
2044 p->lineno = lineno;
2045 p->col_offset = col_offset;
2046 return p;
2047}
2048
2049expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002050Yield(expr_ty value, int lineno, 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 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2054 if (!p)
2055 return NULL;
2056 p->kind = Yield_kind;
2057 p->v.Yield.value = value;
2058 p->lineno = lineno;
2059 p->col_offset = col_offset;
2060 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061}
2062
2063expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002064YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena)
2065{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002066 expr_ty p;
2067 if (!value) {
2068 PyErr_SetString(PyExc_ValueError,
2069 "field value is required for YieldFrom");
2070 return NULL;
2071 }
2072 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2073 if (!p)
2074 return NULL;
2075 p->kind = YieldFrom_kind;
2076 p->v.YieldFrom.value = value;
2077 p->lineno = lineno;
2078 p->col_offset = col_offset;
2079 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002080}
2081
2082expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002083Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
2084 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002086 expr_ty p;
2087 if (!left) {
2088 PyErr_SetString(PyExc_ValueError,
2089 "field left is required for Compare");
2090 return NULL;
2091 }
2092 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2093 if (!p)
2094 return NULL;
2095 p->kind = Compare_kind;
2096 p->v.Compare.left = left;
2097 p->v.Compare.ops = ops;
2098 p->v.Compare.comparators = comparators;
2099 p->lineno = lineno;
2100 p->col_offset = col_offset;
2101 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102}
2103
2104expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002105Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
2106 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002108 expr_ty p;
2109 if (!func) {
2110 PyErr_SetString(PyExc_ValueError,
2111 "field func is required for Call");
2112 return NULL;
2113 }
2114 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2115 if (!p)
2116 return NULL;
2117 p->kind = Call_kind;
2118 p->v.Call.func = func;
2119 p->v.Call.args = args;
2120 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002121 p->lineno = lineno;
2122 p->col_offset = col_offset;
2123 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124}
2125
2126expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002127Num(object n, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002129 expr_ty p;
2130 if (!n) {
2131 PyErr_SetString(PyExc_ValueError,
2132 "field n is required for Num");
2133 return NULL;
2134 }
2135 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2136 if (!p)
2137 return NULL;
2138 p->kind = Num_kind;
2139 p->v.Num.n = n;
2140 p->lineno = lineno;
2141 p->col_offset = col_offset;
2142 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143}
2144
2145expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002146Str(string s, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002148 expr_ty p;
2149 if (!s) {
2150 PyErr_SetString(PyExc_ValueError,
2151 "field s is required for Str");
2152 return NULL;
2153 }
2154 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2155 if (!p)
2156 return NULL;
2157 p->kind = Str_kind;
2158 p->v.Str.s = s;
2159 p->lineno = lineno;
2160 p->col_offset = col_offset;
2161 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162}
2163
2164expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002165FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
2166 int col_offset, PyArena *arena)
2167{
2168 expr_ty p;
2169 if (!value) {
2170 PyErr_SetString(PyExc_ValueError,
2171 "field value is required for FormattedValue");
2172 return NULL;
2173 }
2174 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2175 if (!p)
2176 return NULL;
2177 p->kind = FormattedValue_kind;
2178 p->v.FormattedValue.value = value;
2179 p->v.FormattedValue.conversion = conversion;
2180 p->v.FormattedValue.format_spec = format_spec;
2181 p->lineno = lineno;
2182 p->col_offset = col_offset;
2183 return p;
2184}
2185
2186expr_ty
2187JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena *arena)
2188{
2189 expr_ty p;
2190 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2191 if (!p)
2192 return NULL;
2193 p->kind = JoinedStr_kind;
2194 p->v.JoinedStr.values = values;
2195 p->lineno = lineno;
2196 p->col_offset = col_offset;
2197 return p;
2198}
2199
2200expr_ty
Benjamin Petersone2498412011-08-09 16:08:39 -05002201Bytes(bytes s, int lineno, int col_offset, PyArena *arena)
Thomas Wouters00e41de2007-02-23 19:56:57 +00002202{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002203 expr_ty p;
2204 if (!s) {
2205 PyErr_SetString(PyExc_ValueError,
2206 "field s is required for Bytes");
2207 return NULL;
2208 }
2209 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2210 if (!p)
2211 return NULL;
2212 p->kind = Bytes_kind;
2213 p->v.Bytes.s = s;
2214 p->lineno = lineno;
2215 p->col_offset = col_offset;
2216 return p;
Thomas Wouters00e41de2007-02-23 19:56:57 +00002217}
2218
2219expr_ty
Benjamin Peterson442f2092012-12-06 17:41:04 -05002220NameConstant(singleton value, int lineno, int col_offset, PyArena *arena)
2221{
Victor Stinneree4b59c2013-07-27 00:01:35 +02002222 expr_ty p;
2223 if (!value) {
2224 PyErr_SetString(PyExc_ValueError,
2225 "field value is required for NameConstant");
2226 return NULL;
2227 }
2228 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2229 if (!p)
2230 return NULL;
2231 p->kind = NameConstant_kind;
2232 p->v.NameConstant.value = value;
2233 p->lineno = lineno;
2234 p->col_offset = col_offset;
2235 return p;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002236}
2237
2238expr_ty
Georg Brandl52318d62006-09-06 07:06:08 +00002239Ellipsis(int lineno, int col_offset, PyArena *arena)
2240{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002241 expr_ty p;
2242 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2243 if (!p)
2244 return NULL;
2245 p->kind = Ellipsis_kind;
2246 p->lineno = lineno;
2247 p->col_offset = col_offset;
2248 return p;
Georg Brandl52318d62006-09-06 07:06:08 +00002249}
2250
2251expr_ty
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002252Constant(constant value, int lineno, int col_offset, PyArena *arena)
2253{
2254 expr_ty p;
2255 if (!value) {
2256 PyErr_SetString(PyExc_ValueError,
2257 "field value is required for Constant");
2258 return NULL;
2259 }
2260 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2261 if (!p)
2262 return NULL;
2263 p->kind = Constant_kind;
2264 p->v.Constant.value = value;
2265 p->lineno = lineno;
2266 p->col_offset = col_offset;
2267 return p;
2268}
2269
2270expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002271Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
2272 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002274 expr_ty p;
2275 if (!value) {
2276 PyErr_SetString(PyExc_ValueError,
2277 "field value is required for Attribute");
2278 return NULL;
2279 }
2280 if (!attr) {
2281 PyErr_SetString(PyExc_ValueError,
2282 "field attr is required for Attribute");
2283 return NULL;
2284 }
2285 if (!ctx) {
2286 PyErr_SetString(PyExc_ValueError,
2287 "field ctx is required for Attribute");
2288 return NULL;
2289 }
2290 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2291 if (!p)
2292 return NULL;
2293 p->kind = Attribute_kind;
2294 p->v.Attribute.value = value;
2295 p->v.Attribute.attr = attr;
2296 p->v.Attribute.ctx = ctx;
2297 p->lineno = lineno;
2298 p->col_offset = col_offset;
2299 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300}
2301
2302expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002303Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
2304 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002306 expr_ty p;
2307 if (!value) {
2308 PyErr_SetString(PyExc_ValueError,
2309 "field value is required for Subscript");
2310 return NULL;
2311 }
2312 if (!slice) {
2313 PyErr_SetString(PyExc_ValueError,
2314 "field slice is required for Subscript");
2315 return NULL;
2316 }
2317 if (!ctx) {
2318 PyErr_SetString(PyExc_ValueError,
2319 "field ctx is required for Subscript");
2320 return NULL;
2321 }
2322 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2323 if (!p)
2324 return NULL;
2325 p->kind = Subscript_kind;
2326 p->v.Subscript.value = value;
2327 p->v.Subscript.slice = slice;
2328 p->v.Subscript.ctx = ctx;
2329 p->lineno = lineno;
2330 p->col_offset = col_offset;
2331 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332}
2333
2334expr_ty
Guido van Rossum0368b722007-05-11 16:50:42 +00002335Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
2336 *arena)
2337{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002338 expr_ty p;
2339 if (!value) {
2340 PyErr_SetString(PyExc_ValueError,
2341 "field value is required for Starred");
2342 return NULL;
2343 }
2344 if (!ctx) {
2345 PyErr_SetString(PyExc_ValueError,
2346 "field ctx is required for Starred");
2347 return NULL;
2348 }
2349 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2350 if (!p)
2351 return NULL;
2352 p->kind = Starred_kind;
2353 p->v.Starred.value = value;
2354 p->v.Starred.ctx = ctx;
2355 p->lineno = lineno;
2356 p->col_offset = col_offset;
2357 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002358}
2359
2360expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002361Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
2362 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002364 expr_ty p;
2365 if (!id) {
2366 PyErr_SetString(PyExc_ValueError,
2367 "field id is required for Name");
2368 return NULL;
2369 }
2370 if (!ctx) {
2371 PyErr_SetString(PyExc_ValueError,
2372 "field ctx is required for Name");
2373 return NULL;
2374 }
2375 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2376 if (!p)
2377 return NULL;
2378 p->kind = Name_kind;
2379 p->v.Name.id = id;
2380 p->v.Name.ctx = ctx;
2381 p->lineno = lineno;
2382 p->col_offset = col_offset;
2383 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384}
2385
2386expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002387List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2388 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002390 expr_ty p;
2391 if (!ctx) {
2392 PyErr_SetString(PyExc_ValueError,
2393 "field ctx is required for List");
2394 return NULL;
2395 }
2396 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2397 if (!p)
2398 return NULL;
2399 p->kind = List_kind;
2400 p->v.List.elts = elts;
2401 p->v.List.ctx = ctx;
2402 p->lineno = lineno;
2403 p->col_offset = col_offset;
2404 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405}
2406
2407expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002408Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2409 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002411 expr_ty p;
2412 if (!ctx) {
2413 PyErr_SetString(PyExc_ValueError,
2414 "field ctx is required for Tuple");
2415 return NULL;
2416 }
2417 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2418 if (!p)
2419 return NULL;
2420 p->kind = Tuple_kind;
2421 p->v.Tuple.elts = elts;
2422 p->v.Tuple.ctx = ctx;
2423 p->lineno = lineno;
2424 p->col_offset = col_offset;
2425 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426}
2427
2428slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002429Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002431 slice_ty p;
2432 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2433 if (!p)
2434 return NULL;
2435 p->kind = Slice_kind;
2436 p->v.Slice.lower = lower;
2437 p->v.Slice.upper = upper;
2438 p->v.Slice.step = step;
2439 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440}
2441
2442slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002443ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002445 slice_ty p;
2446 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2447 if (!p)
2448 return NULL;
2449 p->kind = ExtSlice_kind;
2450 p->v.ExtSlice.dims = dims;
2451 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452}
2453
2454slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002455Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002457 slice_ty p;
2458 if (!value) {
2459 PyErr_SetString(PyExc_ValueError,
2460 "field value is required for Index");
2461 return NULL;
2462 }
2463 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2464 if (!p)
2465 return NULL;
2466 p->kind = Index_kind;
2467 p->v.Index.value = value;
2468 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469}
2470
2471comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002472comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2473 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002475 comprehension_ty p;
2476 if (!target) {
2477 PyErr_SetString(PyExc_ValueError,
2478 "field target is required for comprehension");
2479 return NULL;
2480 }
2481 if (!iter) {
2482 PyErr_SetString(PyExc_ValueError,
2483 "field iter is required for comprehension");
2484 return NULL;
2485 }
2486 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2487 if (!p)
2488 return NULL;
2489 p->target = target;
2490 p->iter = iter;
2491 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002492 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002493 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002494}
2495
2496excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002497ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002498 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002500 excepthandler_ty p;
2501 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2502 if (!p)
2503 return NULL;
2504 p->kind = ExceptHandler_kind;
2505 p->v.ExceptHandler.type = type;
2506 p->v.ExceptHandler.name = name;
2507 p->v.ExceptHandler.body = body;
2508 p->lineno = lineno;
2509 p->col_offset = col_offset;
2510 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511}
2512
2513arguments_ty
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002514arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
2515 kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002517 arguments_ty p;
2518 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2519 if (!p)
2520 return NULL;
2521 p->args = args;
2522 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002523 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002524 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002525 p->kwarg = kwarg;
2526 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002527 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528}
2529
Neal Norwitzc1505362006-12-28 06:47:50 +00002530arg_ty
Victor Stinnerc106c682015-11-06 17:01:48 +01002531arg(identifier arg, expr_ty annotation, int lineno, int col_offset, PyArena
2532 *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002533{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002534 arg_ty p;
2535 if (!arg) {
2536 PyErr_SetString(PyExc_ValueError,
2537 "field arg is required for arg");
2538 return NULL;
2539 }
2540 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2541 if (!p)
2542 return NULL;
2543 p->arg = arg;
2544 p->annotation = annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01002545 p->lineno = lineno;
2546 p->col_offset = col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002547 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002548}
2549
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002551keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002553 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002554 if (!value) {
2555 PyErr_SetString(PyExc_ValueError,
2556 "field value is required for keyword");
2557 return NULL;
2558 }
2559 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2560 if (!p)
2561 return NULL;
2562 p->arg = arg;
2563 p->value = value;
2564 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002565}
2566
2567alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002568alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002570 alias_ty p;
2571 if (!name) {
2572 PyErr_SetString(PyExc_ValueError,
2573 "field name is required for alias");
2574 return NULL;
2575 }
2576 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2577 if (!p)
2578 return NULL;
2579 p->name = name;
2580 p->asname = asname;
2581 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582}
2583
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002584withitem_ty
2585withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2586{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002587 withitem_ty p;
2588 if (!context_expr) {
2589 PyErr_SetString(PyExc_ValueError,
2590 "field context_expr is required for withitem");
2591 return NULL;
2592 }
2593 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2594 if (!p)
2595 return NULL;
2596 p->context_expr = context_expr;
2597 p->optional_vars = optional_vars;
2598 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002599}
2600
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002601
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002602PyObject*
2603ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002604{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002605 mod_ty o = (mod_ty)_o;
2606 PyObject *result = NULL, *value = NULL;
2607 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002608 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002609 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002610
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002611 switch (o->kind) {
2612 case Module_kind:
2613 result = PyType_GenericNew(Module_type, NULL, NULL);
2614 if (!result) goto failed;
2615 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2616 if (!value) goto failed;
2617 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2618 goto failed;
2619 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002620 value = ast2obj_string(o->v.Module.docstring);
2621 if (!value) goto failed;
2622 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2623 goto failed;
2624 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002625 break;
2626 case Interactive_kind:
2627 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2628 if (!result) goto failed;
2629 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2630 if (!value) goto failed;
2631 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2632 goto failed;
2633 Py_DECREF(value);
2634 break;
2635 case Expression_kind:
2636 result = PyType_GenericNew(Expression_type, NULL, NULL);
2637 if (!result) goto failed;
2638 value = ast2obj_expr(o->v.Expression.body);
2639 if (!value) goto failed;
2640 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2641 goto failed;
2642 Py_DECREF(value);
2643 break;
2644 case Suite_kind:
2645 result = PyType_GenericNew(Suite_type, NULL, NULL);
2646 if (!result) goto failed;
2647 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2648 if (!value) goto failed;
2649 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2650 goto failed;
2651 Py_DECREF(value);
2652 break;
2653 }
2654 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002655failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002656 Py_XDECREF(value);
2657 Py_XDECREF(result);
2658 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659}
2660
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002661PyObject*
2662ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002664 stmt_ty o = (stmt_ty)_o;
2665 PyObject *result = NULL, *value = NULL;
2666 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002667 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002668 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002669
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002670 switch (o->kind) {
2671 case FunctionDef_kind:
2672 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2673 if (!result) goto failed;
2674 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002675 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002676 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2677 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002678 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002679 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002680 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002681 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2682 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002683 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002684 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2685 if (!value) goto failed;
2686 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2687 goto failed;
2688 Py_DECREF(value);
2689 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2690 if (!value) goto failed;
2691 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2692 goto failed;
2693 Py_DECREF(value);
2694 value = ast2obj_expr(o->v.FunctionDef.returns);
2695 if (!value) goto failed;
2696 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2697 goto failed;
2698 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002699 value = ast2obj_string(o->v.FunctionDef.docstring);
2700 if (!value) goto failed;
2701 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2702 goto failed;
2703 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002704 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002705 case AsyncFunctionDef_kind:
2706 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2707 if (!result) goto failed;
2708 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2709 if (!value) goto failed;
2710 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2711 goto failed;
2712 Py_DECREF(value);
2713 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2714 if (!value) goto failed;
2715 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2716 goto failed;
2717 Py_DECREF(value);
2718 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2719 if (!value) goto failed;
2720 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2721 goto failed;
2722 Py_DECREF(value);
2723 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2724 ast2obj_expr);
2725 if (!value) goto failed;
2726 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2727 goto failed;
2728 Py_DECREF(value);
2729 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2730 if (!value) goto failed;
2731 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2732 goto failed;
2733 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002734 value = ast2obj_string(o->v.AsyncFunctionDef.docstring);
2735 if (!value) goto failed;
2736 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2737 goto failed;
2738 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002739 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002740 case ClassDef_kind:
2741 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2742 if (!result) goto failed;
2743 value = ast2obj_identifier(o->v.ClassDef.name);
2744 if (!value) goto failed;
2745 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2746 goto failed;
2747 Py_DECREF(value);
2748 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2749 if (!value) goto failed;
2750 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2751 goto failed;
2752 Py_DECREF(value);
2753 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2754 if (!value) goto failed;
2755 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2756 goto failed;
2757 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002758 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2759 if (!value) goto failed;
2760 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2761 goto failed;
2762 Py_DECREF(value);
2763 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2764 if (!value) goto failed;
2765 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2766 goto failed;
2767 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002768 value = ast2obj_string(o->v.ClassDef.docstring);
2769 if (!value) goto failed;
2770 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2771 goto failed;
2772 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002773 break;
2774 case Return_kind:
2775 result = PyType_GenericNew(Return_type, NULL, NULL);
2776 if (!result) goto failed;
2777 value = ast2obj_expr(o->v.Return.value);
2778 if (!value) goto failed;
2779 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2780 goto failed;
2781 Py_DECREF(value);
2782 break;
2783 case Delete_kind:
2784 result = PyType_GenericNew(Delete_type, NULL, NULL);
2785 if (!result) goto failed;
2786 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2787 if (!value) goto failed;
2788 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2789 goto failed;
2790 Py_DECREF(value);
2791 break;
2792 case Assign_kind:
2793 result = PyType_GenericNew(Assign_type, NULL, NULL);
2794 if (!result) goto failed;
2795 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2796 if (!value) goto failed;
2797 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2798 goto failed;
2799 Py_DECREF(value);
2800 value = ast2obj_expr(o->v.Assign.value);
2801 if (!value) goto failed;
2802 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2803 goto failed;
2804 Py_DECREF(value);
2805 break;
2806 case AugAssign_kind:
2807 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2808 if (!result) goto failed;
2809 value = ast2obj_expr(o->v.AugAssign.target);
2810 if (!value) goto failed;
2811 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2812 goto failed;
2813 Py_DECREF(value);
2814 value = ast2obj_operator(o->v.AugAssign.op);
2815 if (!value) goto failed;
2816 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2817 goto failed;
2818 Py_DECREF(value);
2819 value = ast2obj_expr(o->v.AugAssign.value);
2820 if (!value) goto failed;
2821 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2822 goto failed;
2823 Py_DECREF(value);
2824 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002825 case AnnAssign_kind:
2826 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2827 if (!result) goto failed;
2828 value = ast2obj_expr(o->v.AnnAssign.target);
2829 if (!value) goto failed;
2830 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2831 goto failed;
2832 Py_DECREF(value);
2833 value = ast2obj_expr(o->v.AnnAssign.annotation);
2834 if (!value) goto failed;
2835 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2836 goto failed;
2837 Py_DECREF(value);
2838 value = ast2obj_expr(o->v.AnnAssign.value);
2839 if (!value) goto failed;
2840 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2841 goto failed;
2842 Py_DECREF(value);
2843 value = ast2obj_int(o->v.AnnAssign.simple);
2844 if (!value) goto failed;
2845 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2846 goto failed;
2847 Py_DECREF(value);
2848 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002849 case For_kind:
2850 result = PyType_GenericNew(For_type, NULL, NULL);
2851 if (!result) goto failed;
2852 value = ast2obj_expr(o->v.For.target);
2853 if (!value) goto failed;
2854 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2855 goto failed;
2856 Py_DECREF(value);
2857 value = ast2obj_expr(o->v.For.iter);
2858 if (!value) goto failed;
2859 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2860 goto failed;
2861 Py_DECREF(value);
2862 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2863 if (!value) goto failed;
2864 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2865 goto failed;
2866 Py_DECREF(value);
2867 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2868 if (!value) goto failed;
2869 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2870 goto failed;
2871 Py_DECREF(value);
2872 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002873 case AsyncFor_kind:
2874 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2875 if (!result) goto failed;
2876 value = ast2obj_expr(o->v.AsyncFor.target);
2877 if (!value) goto failed;
2878 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2879 goto failed;
2880 Py_DECREF(value);
2881 value = ast2obj_expr(o->v.AsyncFor.iter);
2882 if (!value) goto failed;
2883 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2884 goto failed;
2885 Py_DECREF(value);
2886 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2887 if (!value) goto failed;
2888 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2889 goto failed;
2890 Py_DECREF(value);
2891 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2892 if (!value) goto failed;
2893 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2894 goto failed;
2895 Py_DECREF(value);
2896 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002897 case While_kind:
2898 result = PyType_GenericNew(While_type, NULL, NULL);
2899 if (!result) goto failed;
2900 value = ast2obj_expr(o->v.While.test);
2901 if (!value) goto failed;
2902 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2903 goto failed;
2904 Py_DECREF(value);
2905 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2906 if (!value) goto failed;
2907 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2908 goto failed;
2909 Py_DECREF(value);
2910 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2911 if (!value) goto failed;
2912 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2913 goto failed;
2914 Py_DECREF(value);
2915 break;
2916 case If_kind:
2917 result = PyType_GenericNew(If_type, NULL, NULL);
2918 if (!result) goto failed;
2919 value = ast2obj_expr(o->v.If.test);
2920 if (!value) goto failed;
2921 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2922 goto failed;
2923 Py_DECREF(value);
2924 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2925 if (!value) goto failed;
2926 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2927 goto failed;
2928 Py_DECREF(value);
2929 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2930 if (!value) goto failed;
2931 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2932 goto failed;
2933 Py_DECREF(value);
2934 break;
2935 case With_kind:
2936 result = PyType_GenericNew(With_type, NULL, NULL);
2937 if (!result) goto failed;
2938 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
2939 if (!value) goto failed;
2940 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2941 goto failed;
2942 Py_DECREF(value);
2943 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2944 if (!value) goto failed;
2945 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2946 goto failed;
2947 Py_DECREF(value);
2948 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002949 case AsyncWith_kind:
2950 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
2951 if (!result) goto failed;
2952 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
2953 if (!value) goto failed;
2954 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2955 goto failed;
2956 Py_DECREF(value);
2957 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
2958 if (!value) goto failed;
2959 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2960 goto failed;
2961 Py_DECREF(value);
2962 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002963 case Raise_kind:
2964 result = PyType_GenericNew(Raise_type, NULL, NULL);
2965 if (!result) goto failed;
2966 value = ast2obj_expr(o->v.Raise.exc);
2967 if (!value) goto failed;
2968 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
2969 goto failed;
2970 Py_DECREF(value);
2971 value = ast2obj_expr(o->v.Raise.cause);
2972 if (!value) goto failed;
2973 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
2974 goto failed;
2975 Py_DECREF(value);
2976 break;
2977 case Try_kind:
2978 result = PyType_GenericNew(Try_type, NULL, NULL);
2979 if (!result) goto failed;
2980 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
2981 if (!value) goto failed;
2982 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2983 goto failed;
2984 Py_DECREF(value);
2985 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
2986 if (!value) goto failed;
2987 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
2988 goto failed;
2989 Py_DECREF(value);
2990 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
2991 if (!value) goto failed;
2992 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2993 goto failed;
2994 Py_DECREF(value);
2995 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
2996 if (!value) goto failed;
2997 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
2998 goto failed;
2999 Py_DECREF(value);
3000 break;
3001 case Assert_kind:
3002 result = PyType_GenericNew(Assert_type, NULL, NULL);
3003 if (!result) goto failed;
3004 value = ast2obj_expr(o->v.Assert.test);
3005 if (!value) goto failed;
3006 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3007 goto failed;
3008 Py_DECREF(value);
3009 value = ast2obj_expr(o->v.Assert.msg);
3010 if (!value) goto failed;
3011 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
3012 goto failed;
3013 Py_DECREF(value);
3014 break;
3015 case Import_kind:
3016 result = PyType_GenericNew(Import_type, NULL, NULL);
3017 if (!result) goto failed;
3018 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
3019 if (!value) goto failed;
3020 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3021 goto failed;
3022 Py_DECREF(value);
3023 break;
3024 case ImportFrom_kind:
3025 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
3026 if (!result) goto failed;
3027 value = ast2obj_identifier(o->v.ImportFrom.module);
3028 if (!value) goto failed;
3029 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
3030 goto failed;
3031 Py_DECREF(value);
3032 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
3033 if (!value) goto failed;
3034 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3035 goto failed;
3036 Py_DECREF(value);
3037 value = ast2obj_int(o->v.ImportFrom.level);
3038 if (!value) goto failed;
3039 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
3040 goto failed;
3041 Py_DECREF(value);
3042 break;
3043 case Global_kind:
3044 result = PyType_GenericNew(Global_type, NULL, NULL);
3045 if (!result) goto failed;
3046 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
3047 if (!value) goto failed;
3048 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3049 goto failed;
3050 Py_DECREF(value);
3051 break;
3052 case Nonlocal_kind:
3053 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3054 if (!result) goto failed;
3055 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3056 if (!value) goto failed;
3057 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3058 goto failed;
3059 Py_DECREF(value);
3060 break;
3061 case Expr_kind:
3062 result = PyType_GenericNew(Expr_type, NULL, NULL);
3063 if (!result) goto failed;
3064 value = ast2obj_expr(o->v.Expr.value);
3065 if (!value) goto failed;
3066 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3067 goto failed;
3068 Py_DECREF(value);
3069 break;
3070 case Pass_kind:
3071 result = PyType_GenericNew(Pass_type, NULL, NULL);
3072 if (!result) goto failed;
3073 break;
3074 case Break_kind:
3075 result = PyType_GenericNew(Break_type, NULL, NULL);
3076 if (!result) goto failed;
3077 break;
3078 case Continue_kind:
3079 result = PyType_GenericNew(Continue_type, NULL, NULL);
3080 if (!result) goto failed;
3081 break;
3082 }
3083 value = ast2obj_int(o->lineno);
3084 if (!value) goto failed;
3085 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3086 goto failed;
3087 Py_DECREF(value);
3088 value = ast2obj_int(o->col_offset);
3089 if (!value) goto failed;
3090 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3091 goto failed;
3092 Py_DECREF(value);
3093 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003094failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003095 Py_XDECREF(value);
3096 Py_XDECREF(result);
3097 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098}
3099
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003100PyObject*
3101ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003103 expr_ty o = (expr_ty)_o;
3104 PyObject *result = NULL, *value = NULL;
3105 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003106 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003107 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003108
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003109 switch (o->kind) {
3110 case BoolOp_kind:
3111 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3112 if (!result) goto failed;
3113 value = ast2obj_boolop(o->v.BoolOp.op);
3114 if (!value) goto failed;
3115 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3116 goto failed;
3117 Py_DECREF(value);
3118 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3119 if (!value) goto failed;
3120 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3121 goto failed;
3122 Py_DECREF(value);
3123 break;
3124 case BinOp_kind:
3125 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3126 if (!result) goto failed;
3127 value = ast2obj_expr(o->v.BinOp.left);
3128 if (!value) goto failed;
3129 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3130 goto failed;
3131 Py_DECREF(value);
3132 value = ast2obj_operator(o->v.BinOp.op);
3133 if (!value) goto failed;
3134 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3135 goto failed;
3136 Py_DECREF(value);
3137 value = ast2obj_expr(o->v.BinOp.right);
3138 if (!value) goto failed;
3139 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3140 goto failed;
3141 Py_DECREF(value);
3142 break;
3143 case UnaryOp_kind:
3144 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3145 if (!result) goto failed;
3146 value = ast2obj_unaryop(o->v.UnaryOp.op);
3147 if (!value) goto failed;
3148 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3149 goto failed;
3150 Py_DECREF(value);
3151 value = ast2obj_expr(o->v.UnaryOp.operand);
3152 if (!value) goto failed;
3153 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3154 goto failed;
3155 Py_DECREF(value);
3156 break;
3157 case Lambda_kind:
3158 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3159 if (!result) goto failed;
3160 value = ast2obj_arguments(o->v.Lambda.args);
3161 if (!value) goto failed;
3162 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3163 goto failed;
3164 Py_DECREF(value);
3165 value = ast2obj_expr(o->v.Lambda.body);
3166 if (!value) goto failed;
3167 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3168 goto failed;
3169 Py_DECREF(value);
3170 break;
3171 case IfExp_kind:
3172 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3173 if (!result) goto failed;
3174 value = ast2obj_expr(o->v.IfExp.test);
3175 if (!value) goto failed;
3176 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3177 goto failed;
3178 Py_DECREF(value);
3179 value = ast2obj_expr(o->v.IfExp.body);
3180 if (!value) goto failed;
3181 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3182 goto failed;
3183 Py_DECREF(value);
3184 value = ast2obj_expr(o->v.IfExp.orelse);
3185 if (!value) goto failed;
3186 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3187 goto failed;
3188 Py_DECREF(value);
3189 break;
3190 case Dict_kind:
3191 result = PyType_GenericNew(Dict_type, NULL, NULL);
3192 if (!result) goto failed;
3193 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3194 if (!value) goto failed;
3195 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3196 goto failed;
3197 Py_DECREF(value);
3198 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3199 if (!value) goto failed;
3200 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3201 goto failed;
3202 Py_DECREF(value);
3203 break;
3204 case Set_kind:
3205 result = PyType_GenericNew(Set_type, NULL, NULL);
3206 if (!result) goto failed;
3207 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3208 if (!value) goto failed;
3209 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3210 goto failed;
3211 Py_DECREF(value);
3212 break;
3213 case ListComp_kind:
3214 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3215 if (!result) goto failed;
3216 value = ast2obj_expr(o->v.ListComp.elt);
3217 if (!value) goto failed;
3218 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3219 goto failed;
3220 Py_DECREF(value);
3221 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3222 if (!value) goto failed;
3223 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3224 goto failed;
3225 Py_DECREF(value);
3226 break;
3227 case SetComp_kind:
3228 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3229 if (!result) goto failed;
3230 value = ast2obj_expr(o->v.SetComp.elt);
3231 if (!value) goto failed;
3232 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3233 goto failed;
3234 Py_DECREF(value);
3235 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3236 if (!value) goto failed;
3237 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3238 goto failed;
3239 Py_DECREF(value);
3240 break;
3241 case DictComp_kind:
3242 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3243 if (!result) goto failed;
3244 value = ast2obj_expr(o->v.DictComp.key);
3245 if (!value) goto failed;
3246 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3247 goto failed;
3248 Py_DECREF(value);
3249 value = ast2obj_expr(o->v.DictComp.value);
3250 if (!value) goto failed;
3251 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3252 goto failed;
3253 Py_DECREF(value);
3254 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3255 if (!value) goto failed;
3256 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3257 goto failed;
3258 Py_DECREF(value);
3259 break;
3260 case GeneratorExp_kind:
3261 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3262 if (!result) goto failed;
3263 value = ast2obj_expr(o->v.GeneratorExp.elt);
3264 if (!value) goto failed;
3265 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3266 goto failed;
3267 Py_DECREF(value);
3268 value = ast2obj_list(o->v.GeneratorExp.generators,
3269 ast2obj_comprehension);
3270 if (!value) goto failed;
3271 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3272 goto failed;
3273 Py_DECREF(value);
3274 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003275 case Await_kind:
3276 result = PyType_GenericNew(Await_type, NULL, NULL);
3277 if (!result) goto failed;
3278 value = ast2obj_expr(o->v.Await.value);
3279 if (!value) goto failed;
3280 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3281 goto failed;
3282 Py_DECREF(value);
3283 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003284 case Yield_kind:
3285 result = PyType_GenericNew(Yield_type, NULL, NULL);
3286 if (!result) goto failed;
3287 value = ast2obj_expr(o->v.Yield.value);
3288 if (!value) goto failed;
3289 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3290 goto failed;
3291 Py_DECREF(value);
3292 break;
3293 case YieldFrom_kind:
3294 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3295 if (!result) goto failed;
3296 value = ast2obj_expr(o->v.YieldFrom.value);
3297 if (!value) goto failed;
3298 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3299 goto failed;
3300 Py_DECREF(value);
3301 break;
3302 case Compare_kind:
3303 result = PyType_GenericNew(Compare_type, NULL, NULL);
3304 if (!result) goto failed;
3305 value = ast2obj_expr(o->v.Compare.left);
3306 if (!value) goto failed;
3307 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3308 goto failed;
3309 Py_DECREF(value);
3310 {
3311 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3312 value = PyList_New(n);
3313 if (!value) goto failed;
3314 for(i = 0; i < n; i++)
3315 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003317 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003318 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3319 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003320 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003321 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003322 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003323 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3324 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003325 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003326 break;
3327 case Call_kind:
3328 result = PyType_GenericNew(Call_type, NULL, NULL);
3329 if (!result) goto failed;
3330 value = ast2obj_expr(o->v.Call.func);
3331 if (!value) goto failed;
3332 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3333 goto failed;
3334 Py_DECREF(value);
3335 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3336 if (!value) goto failed;
3337 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3338 goto failed;
3339 Py_DECREF(value);
3340 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3341 if (!value) goto failed;
3342 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3343 goto failed;
3344 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003345 break;
3346 case Num_kind:
3347 result = PyType_GenericNew(Num_type, NULL, NULL);
3348 if (!result) goto failed;
3349 value = ast2obj_object(o->v.Num.n);
3350 if (!value) goto failed;
3351 if (_PyObject_SetAttrId(result, &PyId_n, value) == -1)
3352 goto failed;
3353 Py_DECREF(value);
3354 break;
3355 case Str_kind:
3356 result = PyType_GenericNew(Str_type, NULL, NULL);
3357 if (!result) goto failed;
3358 value = ast2obj_string(o->v.Str.s);
3359 if (!value) goto failed;
3360 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3361 goto failed;
3362 Py_DECREF(value);
3363 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003364 case FormattedValue_kind:
3365 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3366 if (!result) goto failed;
3367 value = ast2obj_expr(o->v.FormattedValue.value);
3368 if (!value) goto failed;
3369 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3370 goto failed;
3371 Py_DECREF(value);
3372 value = ast2obj_int(o->v.FormattedValue.conversion);
3373 if (!value) goto failed;
3374 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3375 goto failed;
3376 Py_DECREF(value);
3377 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3378 if (!value) goto failed;
3379 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3380 goto failed;
3381 Py_DECREF(value);
3382 break;
3383 case JoinedStr_kind:
3384 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3385 if (!result) goto failed;
3386 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3387 if (!value) goto failed;
3388 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3389 goto failed;
3390 Py_DECREF(value);
3391 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003392 case Bytes_kind:
3393 result = PyType_GenericNew(Bytes_type, NULL, NULL);
3394 if (!result) goto failed;
3395 value = ast2obj_bytes(o->v.Bytes.s);
3396 if (!value) goto failed;
3397 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3398 goto failed;
3399 Py_DECREF(value);
3400 break;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003401 case NameConstant_kind:
3402 result = PyType_GenericNew(NameConstant_type, NULL, NULL);
3403 if (!result) goto failed;
3404 value = ast2obj_singleton(o->v.NameConstant.value);
3405 if (!value) goto failed;
3406 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3407 goto failed;
3408 Py_DECREF(value);
3409 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003410 case Ellipsis_kind:
3411 result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
3412 if (!result) goto failed;
3413 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003414 case Constant_kind:
3415 result = PyType_GenericNew(Constant_type, NULL, NULL);
3416 if (!result) goto failed;
3417 value = ast2obj_constant(o->v.Constant.value);
3418 if (!value) goto failed;
3419 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3420 goto failed;
3421 Py_DECREF(value);
3422 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003423 case Attribute_kind:
3424 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3425 if (!result) goto failed;
3426 value = ast2obj_expr(o->v.Attribute.value);
3427 if (!value) goto failed;
3428 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3429 goto failed;
3430 Py_DECREF(value);
3431 value = ast2obj_identifier(o->v.Attribute.attr);
3432 if (!value) goto failed;
3433 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3434 goto failed;
3435 Py_DECREF(value);
3436 value = ast2obj_expr_context(o->v.Attribute.ctx);
3437 if (!value) goto failed;
3438 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3439 goto failed;
3440 Py_DECREF(value);
3441 break;
3442 case Subscript_kind:
3443 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3444 if (!result) goto failed;
3445 value = ast2obj_expr(o->v.Subscript.value);
3446 if (!value) goto failed;
3447 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3448 goto failed;
3449 Py_DECREF(value);
3450 value = ast2obj_slice(o->v.Subscript.slice);
3451 if (!value) goto failed;
3452 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3453 goto failed;
3454 Py_DECREF(value);
3455 value = ast2obj_expr_context(o->v.Subscript.ctx);
3456 if (!value) goto failed;
3457 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3458 goto failed;
3459 Py_DECREF(value);
3460 break;
3461 case Starred_kind:
3462 result = PyType_GenericNew(Starred_type, NULL, NULL);
3463 if (!result) goto failed;
3464 value = ast2obj_expr(o->v.Starred.value);
3465 if (!value) goto failed;
3466 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3467 goto failed;
3468 Py_DECREF(value);
3469 value = ast2obj_expr_context(o->v.Starred.ctx);
3470 if (!value) goto failed;
3471 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3472 goto failed;
3473 Py_DECREF(value);
3474 break;
3475 case Name_kind:
3476 result = PyType_GenericNew(Name_type, NULL, NULL);
3477 if (!result) goto failed;
3478 value = ast2obj_identifier(o->v.Name.id);
3479 if (!value) goto failed;
3480 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3481 goto failed;
3482 Py_DECREF(value);
3483 value = ast2obj_expr_context(o->v.Name.ctx);
3484 if (!value) goto failed;
3485 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3486 goto failed;
3487 Py_DECREF(value);
3488 break;
3489 case List_kind:
3490 result = PyType_GenericNew(List_type, NULL, NULL);
3491 if (!result) goto failed;
3492 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3493 if (!value) goto failed;
3494 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3495 goto failed;
3496 Py_DECREF(value);
3497 value = ast2obj_expr_context(o->v.List.ctx);
3498 if (!value) goto failed;
3499 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3500 goto failed;
3501 Py_DECREF(value);
3502 break;
3503 case Tuple_kind:
3504 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3505 if (!result) goto failed;
3506 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3507 if (!value) goto failed;
3508 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3509 goto failed;
3510 Py_DECREF(value);
3511 value = ast2obj_expr_context(o->v.Tuple.ctx);
3512 if (!value) goto failed;
3513 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3514 goto failed;
3515 Py_DECREF(value);
3516 break;
3517 }
3518 value = ast2obj_int(o->lineno);
3519 if (!value) goto failed;
3520 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3521 goto failed;
3522 Py_DECREF(value);
3523 value = ast2obj_int(o->col_offset);
3524 if (!value) goto failed;
3525 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3526 goto failed;
3527 Py_DECREF(value);
3528 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003529failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003530 Py_XDECREF(value);
3531 Py_XDECREF(result);
3532 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533}
3534
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003535PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003537 switch(o) {
3538 case Load:
3539 Py_INCREF(Load_singleton);
3540 return Load_singleton;
3541 case Store:
3542 Py_INCREF(Store_singleton);
3543 return Store_singleton;
3544 case Del:
3545 Py_INCREF(Del_singleton);
3546 return Del_singleton;
3547 case AugLoad:
3548 Py_INCREF(AugLoad_singleton);
3549 return AugLoad_singleton;
3550 case AugStore:
3551 Py_INCREF(AugStore_singleton);
3552 return AugStore_singleton;
3553 case Param:
3554 Py_INCREF(Param_singleton);
3555 return Param_singleton;
3556 default:
3557 /* should never happen, but just in case ... */
3558 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3559 return NULL;
3560 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003561}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003562PyObject*
3563ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003565 slice_ty o = (slice_ty)_o;
3566 PyObject *result = NULL, *value = NULL;
3567 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003568 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003569 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003570
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003571 switch (o->kind) {
3572 case Slice_kind:
3573 result = PyType_GenericNew(Slice_type, NULL, NULL);
3574 if (!result) goto failed;
3575 value = ast2obj_expr(o->v.Slice.lower);
3576 if (!value) goto failed;
3577 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3578 goto failed;
3579 Py_DECREF(value);
3580 value = ast2obj_expr(o->v.Slice.upper);
3581 if (!value) goto failed;
3582 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3583 goto failed;
3584 Py_DECREF(value);
3585 value = ast2obj_expr(o->v.Slice.step);
3586 if (!value) goto failed;
3587 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3588 goto failed;
3589 Py_DECREF(value);
3590 break;
3591 case ExtSlice_kind:
3592 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3593 if (!result) goto failed;
3594 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3595 if (!value) goto failed;
3596 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3597 goto failed;
3598 Py_DECREF(value);
3599 break;
3600 case Index_kind:
3601 result = PyType_GenericNew(Index_type, NULL, NULL);
3602 if (!result) goto failed;
3603 value = ast2obj_expr(o->v.Index.value);
3604 if (!value) goto failed;
3605 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3606 goto failed;
3607 Py_DECREF(value);
3608 break;
3609 }
3610 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003611failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003612 Py_XDECREF(value);
3613 Py_XDECREF(result);
3614 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615}
3616
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003617PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003619 switch(o) {
3620 case And:
3621 Py_INCREF(And_singleton);
3622 return And_singleton;
3623 case Or:
3624 Py_INCREF(Or_singleton);
3625 return Or_singleton;
3626 default:
3627 /* should never happen, but just in case ... */
3628 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3629 return NULL;
3630 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003631}
3632PyObject* ast2obj_operator(operator_ty o)
3633{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003634 switch(o) {
3635 case Add:
3636 Py_INCREF(Add_singleton);
3637 return Add_singleton;
3638 case Sub:
3639 Py_INCREF(Sub_singleton);
3640 return Sub_singleton;
3641 case Mult:
3642 Py_INCREF(Mult_singleton);
3643 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003644 case MatMult:
3645 Py_INCREF(MatMult_singleton);
3646 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003647 case Div:
3648 Py_INCREF(Div_singleton);
3649 return Div_singleton;
3650 case Mod:
3651 Py_INCREF(Mod_singleton);
3652 return Mod_singleton;
3653 case Pow:
3654 Py_INCREF(Pow_singleton);
3655 return Pow_singleton;
3656 case LShift:
3657 Py_INCREF(LShift_singleton);
3658 return LShift_singleton;
3659 case RShift:
3660 Py_INCREF(RShift_singleton);
3661 return RShift_singleton;
3662 case BitOr:
3663 Py_INCREF(BitOr_singleton);
3664 return BitOr_singleton;
3665 case BitXor:
3666 Py_INCREF(BitXor_singleton);
3667 return BitXor_singleton;
3668 case BitAnd:
3669 Py_INCREF(BitAnd_singleton);
3670 return BitAnd_singleton;
3671 case FloorDiv:
3672 Py_INCREF(FloorDiv_singleton);
3673 return FloorDiv_singleton;
3674 default:
3675 /* should never happen, but just in case ... */
3676 PyErr_Format(PyExc_SystemError, "unknown operator found");
3677 return NULL;
3678 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003679}
3680PyObject* ast2obj_unaryop(unaryop_ty o)
3681{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003682 switch(o) {
3683 case Invert:
3684 Py_INCREF(Invert_singleton);
3685 return Invert_singleton;
3686 case Not:
3687 Py_INCREF(Not_singleton);
3688 return Not_singleton;
3689 case UAdd:
3690 Py_INCREF(UAdd_singleton);
3691 return UAdd_singleton;
3692 case USub:
3693 Py_INCREF(USub_singleton);
3694 return USub_singleton;
3695 default:
3696 /* should never happen, but just in case ... */
3697 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3698 return NULL;
3699 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003700}
3701PyObject* ast2obj_cmpop(cmpop_ty o)
3702{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003703 switch(o) {
3704 case Eq:
3705 Py_INCREF(Eq_singleton);
3706 return Eq_singleton;
3707 case NotEq:
3708 Py_INCREF(NotEq_singleton);
3709 return NotEq_singleton;
3710 case Lt:
3711 Py_INCREF(Lt_singleton);
3712 return Lt_singleton;
3713 case LtE:
3714 Py_INCREF(LtE_singleton);
3715 return LtE_singleton;
3716 case Gt:
3717 Py_INCREF(Gt_singleton);
3718 return Gt_singleton;
3719 case GtE:
3720 Py_INCREF(GtE_singleton);
3721 return GtE_singleton;
3722 case Is:
3723 Py_INCREF(Is_singleton);
3724 return Is_singleton;
3725 case IsNot:
3726 Py_INCREF(IsNot_singleton);
3727 return IsNot_singleton;
3728 case In:
3729 Py_INCREF(In_singleton);
3730 return In_singleton;
3731 case NotIn:
3732 Py_INCREF(NotIn_singleton);
3733 return NotIn_singleton;
3734 default:
3735 /* should never happen, but just in case ... */
3736 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3737 return NULL;
3738 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003739}
3740PyObject*
3741ast2obj_comprehension(void* _o)
3742{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003743 comprehension_ty o = (comprehension_ty)_o;
3744 PyObject *result = NULL, *value = NULL;
3745 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003746 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003747 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003748
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003749 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3750 if (!result) return NULL;
3751 value = ast2obj_expr(o->target);
3752 if (!value) goto failed;
3753 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3754 goto failed;
3755 Py_DECREF(value);
3756 value = ast2obj_expr(o->iter);
3757 if (!value) goto failed;
3758 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3759 goto failed;
3760 Py_DECREF(value);
3761 value = ast2obj_list(o->ifs, ast2obj_expr);
3762 if (!value) goto failed;
3763 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3764 goto failed;
3765 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003766 value = ast2obj_int(o->is_async);
3767 if (!value) goto failed;
3768 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3769 goto failed;
3770 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003771 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003772failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003773 Py_XDECREF(value);
3774 Py_XDECREF(result);
3775 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003776}
3777
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003778PyObject*
3779ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003780{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003781 excepthandler_ty o = (excepthandler_ty)_o;
3782 PyObject *result = NULL, *value = NULL;
3783 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003784 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003785 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003786
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003787 switch (o->kind) {
3788 case ExceptHandler_kind:
3789 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3790 if (!result) goto failed;
3791 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003792 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003793 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3794 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003795 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003796 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003797 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003798 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3799 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003800 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003801 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3802 if (!value) goto failed;
3803 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3804 goto failed;
3805 Py_DECREF(value);
3806 break;
3807 }
3808 value = ast2obj_int(o->lineno);
3809 if (!value) goto failed;
3810 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3811 goto failed;
3812 Py_DECREF(value);
3813 value = ast2obj_int(o->col_offset);
3814 if (!value) goto failed;
3815 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3816 goto failed;
3817 Py_DECREF(value);
3818 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003819failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003820 Py_XDECREF(value);
3821 Py_XDECREF(result);
3822 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003823}
3824
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003825PyObject*
3826ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003827{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003828 arguments_ty o = (arguments_ty)_o;
3829 PyObject *result = NULL, *value = NULL;
3830 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003831 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003832 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003833
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003834 result = PyType_GenericNew(arguments_type, NULL, NULL);
3835 if (!result) return NULL;
3836 value = ast2obj_list(o->args, ast2obj_arg);
3837 if (!value) goto failed;
3838 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3839 goto failed;
3840 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003841 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003842 if (!value) goto failed;
3843 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3844 goto failed;
3845 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003846 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3847 if (!value) goto failed;
3848 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3849 goto failed;
3850 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003851 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003852 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003853 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003854 goto failed;
3855 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003856 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003857 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003858 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003859 goto failed;
3860 Py_DECREF(value);
3861 value = ast2obj_list(o->defaults, ast2obj_expr);
3862 if (!value) goto failed;
3863 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3864 goto failed;
3865 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003866 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003867failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003868 Py_XDECREF(value);
3869 Py_XDECREF(result);
3870 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871}
3872
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003873PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003874ast2obj_arg(void* _o)
3875{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003876 arg_ty o = (arg_ty)_o;
3877 PyObject *result = NULL, *value = NULL;
3878 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003879 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003880 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003881
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003882 result = PyType_GenericNew(arg_type, NULL, NULL);
3883 if (!result) return NULL;
3884 value = ast2obj_identifier(o->arg);
3885 if (!value) goto failed;
3886 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3887 goto failed;
3888 Py_DECREF(value);
3889 value = ast2obj_expr(o->annotation);
3890 if (!value) goto failed;
3891 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
3892 goto failed;
3893 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003894 value = ast2obj_int(o->lineno);
3895 if (!value) goto failed;
3896 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3897 goto failed;
3898 Py_DECREF(value);
3899 value = ast2obj_int(o->col_offset);
3900 if (!value) goto failed;
3901 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3902 goto failed;
3903 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003904 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00003905failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003906 Py_XDECREF(value);
3907 Py_XDECREF(result);
3908 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003909}
3910
3911PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003912ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003914 keyword_ty o = (keyword_ty)_o;
3915 PyObject *result = NULL, *value = NULL;
3916 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003917 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003918 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003919
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003920 result = PyType_GenericNew(keyword_type, NULL, NULL);
3921 if (!result) return NULL;
3922 value = ast2obj_identifier(o->arg);
3923 if (!value) goto failed;
3924 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3925 goto failed;
3926 Py_DECREF(value);
3927 value = ast2obj_expr(o->value);
3928 if (!value) goto failed;
3929 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3930 goto failed;
3931 Py_DECREF(value);
3932 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003933failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003934 Py_XDECREF(value);
3935 Py_XDECREF(result);
3936 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003937}
3938
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003939PyObject*
3940ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003941{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003942 alias_ty o = (alias_ty)_o;
3943 PyObject *result = NULL, *value = NULL;
3944 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003945 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003946 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003947
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 result = PyType_GenericNew(alias_type, NULL, NULL);
3949 if (!result) return NULL;
3950 value = ast2obj_identifier(o->name);
3951 if (!value) goto failed;
3952 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3953 goto failed;
3954 Py_DECREF(value);
3955 value = ast2obj_identifier(o->asname);
3956 if (!value) goto failed;
3957 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
3958 goto failed;
3959 Py_DECREF(value);
3960 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003961failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003962 Py_XDECREF(value);
3963 Py_XDECREF(result);
3964 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003965}
3966
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003967PyObject*
3968ast2obj_withitem(void* _o)
3969{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003970 withitem_ty o = (withitem_ty)_o;
3971 PyObject *result = NULL, *value = NULL;
3972 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003973 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003974 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003975
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003976 result = PyType_GenericNew(withitem_type, NULL, NULL);
3977 if (!result) return NULL;
3978 value = ast2obj_expr(o->context_expr);
3979 if (!value) goto failed;
3980 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
3981 goto failed;
3982 Py_DECREF(value);
3983 value = ast2obj_expr(o->optional_vars);
3984 if (!value) goto failed;
3985 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
3986 goto failed;
3987 Py_DECREF(value);
3988 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003989failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003990 Py_XDECREF(value);
3991 Py_XDECREF(result);
3992 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003993}
3994
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003995
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003996int
3997obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3998{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003999 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004000
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004001 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004002
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004003 if (obj == Py_None) {
4004 *out = NULL;
4005 return 0;
4006 }
4007 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
4008 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004009 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004010 }
4011 if (isinstance) {
4012 asdl_seq* body;
INADA Naokicb41b272017-02-23 00:31:59 +09004013 string docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004014
Serhiy Storchakabba22392017-11-11 16:41:32 +02004015 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4016 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004017 int res;
4018 Py_ssize_t len;
4019 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004020 if (!PyList_Check(tmp)) {
4021 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4022 goto failed;
4023 }
4024 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004025 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004026 if (body == NULL) goto failed;
4027 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004028 stmt_ty val;
4029 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004030 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004031 if (len != PyList_GET_SIZE(tmp)) {
4032 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
4033 goto failed;
4034 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004035 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004036 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004037 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004038 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004039 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4040 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4041 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004042 return 1;
4043 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004044 tmp = get_not_none(obj, &PyId_docstring);
4045 if (tmp != NULL) {
INADA Naokicb41b272017-02-23 00:31:59 +09004046 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004047 res = obj2ast_string(tmp, &docstring, arena);
4048 if (res != 0) goto failed;
4049 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004050 } else if (PyErr_Occurred()) {
4051 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09004052 } else {
4053 docstring = NULL;
4054 }
4055 *out = Module(body, docstring, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004056 if (*out == NULL) goto failed;
4057 return 0;
4058 }
4059 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
4060 if (isinstance == -1) {
4061 return 1;
4062 }
4063 if (isinstance) {
4064 asdl_seq* body;
4065
Serhiy Storchakabba22392017-11-11 16:41:32 +02004066 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4067 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004068 int res;
4069 Py_ssize_t len;
4070 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004071 if (!PyList_Check(tmp)) {
4072 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4073 goto failed;
4074 }
4075 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004076 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004077 if (body == NULL) goto failed;
4078 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004079 stmt_ty val;
4080 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004081 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004082 if (len != PyList_GET_SIZE(tmp)) {
4083 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4084 goto failed;
4085 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004086 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004087 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004088 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004089 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004090 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4091 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4092 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004093 return 1;
4094 }
4095 *out = Interactive(body, arena);
4096 if (*out == NULL) goto failed;
4097 return 0;
4098 }
4099 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4100 if (isinstance == -1) {
4101 return 1;
4102 }
4103 if (isinstance) {
4104 expr_ty body;
4105
Serhiy Storchakabba22392017-11-11 16:41:32 +02004106 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4107 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004108 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004109 res = obj2ast_expr(tmp, &body, arena);
4110 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004111 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004112 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004113 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4114 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4115 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004116 return 1;
4117 }
4118 *out = Expression(body, arena);
4119 if (*out == NULL) goto failed;
4120 return 0;
4121 }
4122 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4123 if (isinstance == -1) {
4124 return 1;
4125 }
4126 if (isinstance) {
4127 asdl_seq* body;
4128
Serhiy Storchakabba22392017-11-11 16:41:32 +02004129 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4130 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004131 int res;
4132 Py_ssize_t len;
4133 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004134 if (!PyList_Check(tmp)) {
4135 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4136 goto failed;
4137 }
4138 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004139 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004140 if (body == NULL) goto failed;
4141 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004142 stmt_ty val;
4143 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004144 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004145 if (len != PyList_GET_SIZE(tmp)) {
4146 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4147 goto failed;
4148 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004149 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004150 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004151 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004152 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004153 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4154 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4155 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004156 return 1;
4157 }
4158 *out = Suite(body, arena);
4159 if (*out == NULL) goto failed;
4160 return 0;
4161 }
4162
4163 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4164 failed:
4165 Py_XDECREF(tmp);
4166 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004167}
4168
4169int
4170obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4171{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004172 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004173
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004174 PyObject *tmp = NULL;
4175 int lineno;
4176 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004177
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004178 if (obj == Py_None) {
4179 *out = NULL;
4180 return 0;
4181 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004182 tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
4183 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004184 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004185 res = obj2ast_int(tmp, &lineno, arena);
4186 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004187 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004188 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004189 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4190 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4191 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004192 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004193 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004194 tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
4195 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004196 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004197 res = obj2ast_int(tmp, &col_offset, arena);
4198 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004199 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004200 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004201 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4202 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4203 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004204 return 1;
4205 }
4206 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4207 if (isinstance == -1) {
4208 return 1;
4209 }
4210 if (isinstance) {
4211 identifier name;
4212 arguments_ty args;
4213 asdl_seq* body;
4214 asdl_seq* decorator_list;
4215 expr_ty returns;
INADA Naokicb41b272017-02-23 00:31:59 +09004216 string docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004217
Serhiy Storchakabba22392017-11-11 16:41:32 +02004218 tmp = _PyObject_GetAttrId(obj, &PyId_name);
4219 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004220 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004221 res = obj2ast_identifier(tmp, &name, arena);
4222 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004223 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004224 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004225 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4226 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4227 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004228 return 1;
4229 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004230 tmp = _PyObject_GetAttrId(obj, &PyId_args);
4231 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004232 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004233 res = obj2ast_arguments(tmp, &args, arena);
4234 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004235 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004236 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004237 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4238 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4239 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004240 return 1;
4241 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004242 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4243 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004244 int res;
4245 Py_ssize_t len;
4246 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004247 if (!PyList_Check(tmp)) {
4248 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4249 goto failed;
4250 }
4251 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004252 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004253 if (body == NULL) goto failed;
4254 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004255 stmt_ty val;
4256 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004257 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004258 if (len != PyList_GET_SIZE(tmp)) {
4259 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4260 goto failed;
4261 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004262 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004263 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004264 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004265 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004266 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4267 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4268 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004269 return 1;
4270 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004271 tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
4272 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004273 int res;
4274 Py_ssize_t len;
4275 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004276 if (!PyList_Check(tmp)) {
4277 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4278 goto failed;
4279 }
4280 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004281 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004282 if (decorator_list == NULL) goto failed;
4283 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004284 expr_ty val;
4285 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004286 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004287 if (len != PyList_GET_SIZE(tmp)) {
4288 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4289 goto failed;
4290 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004291 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004292 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004293 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004294 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004295 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4296 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4297 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004298 return 1;
4299 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004300 tmp = get_not_none(obj, &PyId_returns);
4301 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004302 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004303 res = obj2ast_expr(tmp, &returns, arena);
4304 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004305 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004306 } else if (PyErr_Occurred()) {
4307 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004308 } else {
4309 returns = NULL;
4310 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004311 tmp = get_not_none(obj, &PyId_docstring);
4312 if (tmp != NULL) {
INADA Naokicb41b272017-02-23 00:31:59 +09004313 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004314 res = obj2ast_string(tmp, &docstring, arena);
4315 if (res != 0) goto failed;
4316 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004317 } else if (PyErr_Occurred()) {
4318 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09004319 } else {
4320 docstring = NULL;
4321 }
4322 *out = FunctionDef(name, args, body, decorator_list, returns,
4323 docstring, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004324 if (*out == NULL) goto failed;
4325 return 0;
4326 }
Yury Selivanov75445082015-05-11 22:57:16 -04004327 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4328 if (isinstance == -1) {
4329 return 1;
4330 }
4331 if (isinstance) {
4332 identifier name;
4333 arguments_ty args;
4334 asdl_seq* body;
4335 asdl_seq* decorator_list;
4336 expr_ty returns;
INADA Naokicb41b272017-02-23 00:31:59 +09004337 string docstring;
Yury Selivanov75445082015-05-11 22:57:16 -04004338
Serhiy Storchakabba22392017-11-11 16:41:32 +02004339 tmp = _PyObject_GetAttrId(obj, &PyId_name);
4340 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004341 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004342 res = obj2ast_identifier(tmp, &name, arena);
4343 if (res != 0) goto failed;
4344 Py_CLEAR(tmp);
4345 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004346 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4347 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4348 }
Yury Selivanov75445082015-05-11 22:57:16 -04004349 return 1;
4350 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004351 tmp = _PyObject_GetAttrId(obj, &PyId_args);
4352 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004353 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004354 res = obj2ast_arguments(tmp, &args, arena);
4355 if (res != 0) goto failed;
4356 Py_CLEAR(tmp);
4357 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004358 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4359 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4360 }
Yury Selivanov75445082015-05-11 22:57:16 -04004361 return 1;
4362 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004363 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4364 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004365 int res;
4366 Py_ssize_t len;
4367 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004368 if (!PyList_Check(tmp)) {
4369 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4370 goto failed;
4371 }
4372 len = PyList_GET_SIZE(tmp);
4373 body = _Py_asdl_seq_new(len, arena);
4374 if (body == NULL) goto failed;
4375 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004376 stmt_ty val;
4377 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004378 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004379 if (len != PyList_GET_SIZE(tmp)) {
4380 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4381 goto failed;
4382 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004383 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004384 }
4385 Py_CLEAR(tmp);
4386 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004387 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4388 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4389 }
Yury Selivanov75445082015-05-11 22:57:16 -04004390 return 1;
4391 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004392 tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
4393 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004394 int res;
4395 Py_ssize_t len;
4396 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004397 if (!PyList_Check(tmp)) {
4398 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4399 goto failed;
4400 }
4401 len = PyList_GET_SIZE(tmp);
4402 decorator_list = _Py_asdl_seq_new(len, arena);
4403 if (decorator_list == NULL) goto failed;
4404 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004405 expr_ty val;
4406 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004407 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004408 if (len != PyList_GET_SIZE(tmp)) {
4409 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4410 goto failed;
4411 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004412 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004413 }
4414 Py_CLEAR(tmp);
4415 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004416 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4417 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4418 }
Yury Selivanov75445082015-05-11 22:57:16 -04004419 return 1;
4420 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004421 tmp = get_not_none(obj, &PyId_returns);
4422 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004423 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004424 res = obj2ast_expr(tmp, &returns, arena);
4425 if (res != 0) goto failed;
4426 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004427 } else if (PyErr_Occurred()) {
4428 return 1;
Yury Selivanov75445082015-05-11 22:57:16 -04004429 } else {
4430 returns = NULL;
4431 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004432 tmp = get_not_none(obj, &PyId_docstring);
4433 if (tmp != NULL) {
INADA Naokicb41b272017-02-23 00:31:59 +09004434 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004435 res = obj2ast_string(tmp, &docstring, arena);
4436 if (res != 0) goto failed;
4437 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004438 } else if (PyErr_Occurred()) {
4439 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09004440 } else {
4441 docstring = NULL;
4442 }
Yury Selivanov75445082015-05-11 22:57:16 -04004443 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
INADA Naokicb41b272017-02-23 00:31:59 +09004444 docstring, lineno, col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004445 if (*out == NULL) goto failed;
4446 return 0;
4447 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004448 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4449 if (isinstance == -1) {
4450 return 1;
4451 }
4452 if (isinstance) {
4453 identifier name;
4454 asdl_seq* bases;
4455 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004456 asdl_seq* body;
4457 asdl_seq* decorator_list;
INADA Naokicb41b272017-02-23 00:31:59 +09004458 string docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004459
Serhiy Storchakabba22392017-11-11 16:41:32 +02004460 tmp = _PyObject_GetAttrId(obj, &PyId_name);
4461 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004462 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004463 res = obj2ast_identifier(tmp, &name, arena);
4464 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004465 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004466 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004467 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4468 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4469 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004470 return 1;
4471 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004472 tmp = _PyObject_GetAttrId(obj, &PyId_bases);
4473 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004474 int res;
4475 Py_ssize_t len;
4476 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004477 if (!PyList_Check(tmp)) {
4478 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4479 goto failed;
4480 }
4481 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004482 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004483 if (bases == NULL) goto failed;
4484 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004485 expr_ty val;
4486 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004487 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004488 if (len != PyList_GET_SIZE(tmp)) {
4489 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4490 goto failed;
4491 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004492 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004493 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004494 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004495 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004496 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4497 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4498 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004499 return 1;
4500 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004501 tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
4502 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004503 int res;
4504 Py_ssize_t len;
4505 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004506 if (!PyList_Check(tmp)) {
4507 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4508 goto failed;
4509 }
4510 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004511 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004512 if (keywords == NULL) goto failed;
4513 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004514 keyword_ty val;
4515 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004516 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004517 if (len != PyList_GET_SIZE(tmp)) {
4518 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4519 goto failed;
4520 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004521 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004522 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004523 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004524 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004525 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4526 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4527 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004528 return 1;
4529 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004530 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4531 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004532 int res;
4533 Py_ssize_t len;
4534 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004535 if (!PyList_Check(tmp)) {
4536 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4537 goto failed;
4538 }
4539 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004540 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004541 if (body == NULL) goto failed;
4542 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004543 stmt_ty val;
4544 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004545 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004546 if (len != PyList_GET_SIZE(tmp)) {
4547 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4548 goto failed;
4549 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004550 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004551 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004552 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004553 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004554 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4555 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4556 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004557 return 1;
4558 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004559 tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
4560 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004561 int res;
4562 Py_ssize_t len;
4563 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004564 if (!PyList_Check(tmp)) {
4565 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4566 goto failed;
4567 }
4568 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004569 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004570 if (decorator_list == NULL) goto failed;
4571 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004572 expr_ty val;
4573 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004574 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004575 if (len != PyList_GET_SIZE(tmp)) {
4576 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4577 goto failed;
4578 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004579 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004580 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004581 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004582 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004583 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4584 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4585 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004586 return 1;
4587 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004588 tmp = get_not_none(obj, &PyId_docstring);
4589 if (tmp != NULL) {
INADA Naokicb41b272017-02-23 00:31:59 +09004590 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004591 res = obj2ast_string(tmp, &docstring, arena);
4592 if (res != 0) goto failed;
4593 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004594 } else if (PyErr_Occurred()) {
4595 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09004596 } else {
4597 docstring = NULL;
4598 }
4599 *out = ClassDef(name, bases, keywords, body, decorator_list, docstring,
4600 lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004601 if (*out == NULL) goto failed;
4602 return 0;
4603 }
4604 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4605 if (isinstance == -1) {
4606 return 1;
4607 }
4608 if (isinstance) {
4609 expr_ty value;
4610
Serhiy Storchakabba22392017-11-11 16:41:32 +02004611 tmp = get_not_none(obj, &PyId_value);
4612 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004613 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004614 res = obj2ast_expr(tmp, &value, arena);
4615 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004616 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004617 } else if (PyErr_Occurred()) {
4618 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004619 } else {
4620 value = NULL;
4621 }
4622 *out = Return(value, lineno, col_offset, arena);
4623 if (*out == NULL) goto failed;
4624 return 0;
4625 }
4626 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4627 if (isinstance == -1) {
4628 return 1;
4629 }
4630 if (isinstance) {
4631 asdl_seq* targets;
4632
Serhiy Storchakabba22392017-11-11 16:41:32 +02004633 tmp = _PyObject_GetAttrId(obj, &PyId_targets);
4634 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004635 int res;
4636 Py_ssize_t len;
4637 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004638 if (!PyList_Check(tmp)) {
4639 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4640 goto failed;
4641 }
4642 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004643 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004644 if (targets == NULL) goto failed;
4645 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004646 expr_ty val;
4647 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004648 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004649 if (len != PyList_GET_SIZE(tmp)) {
4650 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4651 goto failed;
4652 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004653 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004654 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004655 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004656 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004657 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4658 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4659 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004660 return 1;
4661 }
4662 *out = Delete(targets, lineno, col_offset, arena);
4663 if (*out == NULL) goto failed;
4664 return 0;
4665 }
4666 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4667 if (isinstance == -1) {
4668 return 1;
4669 }
4670 if (isinstance) {
4671 asdl_seq* targets;
4672 expr_ty value;
4673
Serhiy Storchakabba22392017-11-11 16:41:32 +02004674 tmp = _PyObject_GetAttrId(obj, &PyId_targets);
4675 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004676 int res;
4677 Py_ssize_t len;
4678 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004679 if (!PyList_Check(tmp)) {
4680 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4681 goto failed;
4682 }
4683 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004684 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004685 if (targets == NULL) goto failed;
4686 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004687 expr_ty val;
4688 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004689 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004690 if (len != PyList_GET_SIZE(tmp)) {
4691 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4692 goto failed;
4693 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004694 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004695 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004696 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004697 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004698 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4699 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4700 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004701 return 1;
4702 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004703 tmp = _PyObject_GetAttrId(obj, &PyId_value);
4704 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004705 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004706 res = obj2ast_expr(tmp, &value, arena);
4707 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004708 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004709 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004710 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4711 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4712 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004713 return 1;
4714 }
4715 *out = Assign(targets, value, lineno, col_offset, arena);
4716 if (*out == NULL) goto failed;
4717 return 0;
4718 }
4719 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
4720 if (isinstance == -1) {
4721 return 1;
4722 }
4723 if (isinstance) {
4724 expr_ty target;
4725 operator_ty op;
4726 expr_ty value;
4727
Serhiy Storchakabba22392017-11-11 16:41:32 +02004728 tmp = _PyObject_GetAttrId(obj, &PyId_target);
4729 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004730 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004731 res = obj2ast_expr(tmp, &target, arena);
4732 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004733 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004734 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004735 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4736 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
4737 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004738 return 1;
4739 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004740 tmp = _PyObject_GetAttrId(obj, &PyId_op);
4741 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004742 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004743 res = obj2ast_operator(tmp, &op, arena);
4744 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004745 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004746 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004747 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4748 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
4749 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004750 return 1;
4751 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004752 tmp = _PyObject_GetAttrId(obj, &PyId_value);
4753 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004754 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004755 res = obj2ast_expr(tmp, &value, arena);
4756 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004757 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004758 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004759 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4760 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
4761 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004762 return 1;
4763 }
4764 *out = AugAssign(target, op, value, lineno, col_offset, arena);
4765 if (*out == NULL) goto failed;
4766 return 0;
4767 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004768 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
4769 if (isinstance == -1) {
4770 return 1;
4771 }
4772 if (isinstance) {
4773 expr_ty target;
4774 expr_ty annotation;
4775 expr_ty value;
4776 int simple;
4777
Serhiy Storchakabba22392017-11-11 16:41:32 +02004778 tmp = _PyObject_GetAttrId(obj, &PyId_target);
4779 if (tmp != NULL) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004780 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004781 res = obj2ast_expr(tmp, &target, arena);
4782 if (res != 0) goto failed;
4783 Py_CLEAR(tmp);
4784 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004785 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4786 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
4787 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004788 return 1;
4789 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004790 tmp = _PyObject_GetAttrId(obj, &PyId_annotation);
4791 if (tmp != NULL) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004792 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004793 res = obj2ast_expr(tmp, &annotation, arena);
4794 if (res != 0) goto failed;
4795 Py_CLEAR(tmp);
4796 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004797 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4798 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
4799 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004800 return 1;
4801 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004802 tmp = get_not_none(obj, &PyId_value);
4803 if (tmp != NULL) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004804 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004805 res = obj2ast_expr(tmp, &value, arena);
4806 if (res != 0) goto failed;
4807 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02004808 } else if (PyErr_Occurred()) {
4809 return 1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004810 } else {
4811 value = NULL;
4812 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004813 tmp = _PyObject_GetAttrId(obj, &PyId_simple);
4814 if (tmp != NULL) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004815 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004816 res = obj2ast_int(tmp, &simple, arena);
4817 if (res != 0) goto failed;
4818 Py_CLEAR(tmp);
4819 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004820 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4821 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
4822 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004823 return 1;
4824 }
4825 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
4826 arena);
4827 if (*out == NULL) goto failed;
4828 return 0;
4829 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004830 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
4831 if (isinstance == -1) {
4832 return 1;
4833 }
4834 if (isinstance) {
4835 expr_ty target;
4836 expr_ty iter;
4837 asdl_seq* body;
4838 asdl_seq* orelse;
4839
Serhiy Storchakabba22392017-11-11 16:41:32 +02004840 tmp = _PyObject_GetAttrId(obj, &PyId_target);
4841 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004842 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004843 res = obj2ast_expr(tmp, &target, arena);
4844 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004845 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004846 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004847 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4848 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4849 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004850 return 1;
4851 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004852 tmp = _PyObject_GetAttrId(obj, &PyId_iter);
4853 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004854 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004855 res = obj2ast_expr(tmp, &iter, arena);
4856 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004857 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004858 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004859 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4860 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4861 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004862 return 1;
4863 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004864 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4865 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004866 int res;
4867 Py_ssize_t len;
4868 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004869 if (!PyList_Check(tmp)) {
4870 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4871 goto failed;
4872 }
4873 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004874 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004875 if (body == NULL) goto failed;
4876 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004877 stmt_ty val;
4878 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004879 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004880 if (len != PyList_GET_SIZE(tmp)) {
4881 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
4882 goto failed;
4883 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004884 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004885 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004886 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004887 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004888 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4889 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4890 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004891 return 1;
4892 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004893 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
4894 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004895 int res;
4896 Py_ssize_t len;
4897 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004898 if (!PyList_Check(tmp)) {
4899 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4900 goto failed;
4901 }
4902 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004903 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004904 if (orelse == NULL) goto failed;
4905 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004906 stmt_ty val;
4907 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004908 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004909 if (len != PyList_GET_SIZE(tmp)) {
4910 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
4911 goto failed;
4912 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004913 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004914 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004915 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004916 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004917 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4918 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4919 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004920 return 1;
4921 }
4922 *out = For(target, iter, body, orelse, lineno, col_offset, arena);
4923 if (*out == NULL) goto failed;
4924 return 0;
4925 }
Yury Selivanov75445082015-05-11 22:57:16 -04004926 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
4927 if (isinstance == -1) {
4928 return 1;
4929 }
4930 if (isinstance) {
4931 expr_ty target;
4932 expr_ty iter;
4933 asdl_seq* body;
4934 asdl_seq* orelse;
4935
Serhiy Storchakabba22392017-11-11 16:41:32 +02004936 tmp = _PyObject_GetAttrId(obj, &PyId_target);
4937 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004938 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004939 res = obj2ast_expr(tmp, &target, arena);
4940 if (res != 0) goto failed;
4941 Py_CLEAR(tmp);
4942 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004943 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4944 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
4945 }
Yury Selivanov75445082015-05-11 22:57:16 -04004946 return 1;
4947 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004948 tmp = _PyObject_GetAttrId(obj, &PyId_iter);
4949 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004950 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004951 res = obj2ast_expr(tmp, &iter, arena);
4952 if (res != 0) goto failed;
4953 Py_CLEAR(tmp);
4954 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004955 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4956 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
4957 }
Yury Selivanov75445082015-05-11 22:57:16 -04004958 return 1;
4959 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004960 tmp = _PyObject_GetAttrId(obj, &PyId_body);
4961 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004962 int res;
4963 Py_ssize_t len;
4964 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004965 if (!PyList_Check(tmp)) {
4966 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4967 goto failed;
4968 }
4969 len = PyList_GET_SIZE(tmp);
4970 body = _Py_asdl_seq_new(len, arena);
4971 if (body == NULL) goto failed;
4972 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004973 stmt_ty val;
4974 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004975 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004976 if (len != PyList_GET_SIZE(tmp)) {
4977 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
4978 goto failed;
4979 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004980 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004981 }
4982 Py_CLEAR(tmp);
4983 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02004984 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4985 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
4986 }
Yury Selivanov75445082015-05-11 22:57:16 -04004987 return 1;
4988 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02004989 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
4990 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04004991 int res;
4992 Py_ssize_t len;
4993 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004994 if (!PyList_Check(tmp)) {
4995 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4996 goto failed;
4997 }
4998 len = PyList_GET_SIZE(tmp);
4999 orelse = _Py_asdl_seq_new(len, arena);
5000 if (orelse == NULL) goto failed;
5001 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005002 stmt_ty val;
5003 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005004 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005005 if (len != PyList_GET_SIZE(tmp)) {
5006 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
5007 goto failed;
5008 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005009 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005010 }
5011 Py_CLEAR(tmp);
5012 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005013 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5014 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
5015 }
Yury Selivanov75445082015-05-11 22:57:16 -04005016 return 1;
5017 }
5018 *out = AsyncFor(target, iter, body, orelse, lineno, col_offset, arena);
5019 if (*out == NULL) goto failed;
5020 return 0;
5021 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005022 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
5023 if (isinstance == -1) {
5024 return 1;
5025 }
5026 if (isinstance) {
5027 expr_ty test;
5028 asdl_seq* body;
5029 asdl_seq* orelse;
5030
Serhiy Storchakabba22392017-11-11 16:41:32 +02005031 tmp = _PyObject_GetAttrId(obj, &PyId_test);
5032 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005033 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005034 res = obj2ast_expr(tmp, &test, arena);
5035 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005036 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005037 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005038 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5039 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
5040 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005041 return 1;
5042 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005043 tmp = _PyObject_GetAttrId(obj, &PyId_body);
5044 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005045 int res;
5046 Py_ssize_t len;
5047 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005048 if (!PyList_Check(tmp)) {
5049 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5050 goto failed;
5051 }
5052 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005053 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005054 if (body == NULL) goto failed;
5055 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005056 stmt_ty val;
5057 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005058 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005059 if (len != PyList_GET_SIZE(tmp)) {
5060 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5061 goto failed;
5062 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005063 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005064 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005065 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005066 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005067 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5068 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
5069 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005070 return 1;
5071 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005072 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
5073 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005074 int res;
5075 Py_ssize_t len;
5076 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005077 if (!PyList_Check(tmp)) {
5078 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5079 goto failed;
5080 }
5081 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005082 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005083 if (orelse == NULL) goto failed;
5084 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005085 stmt_ty val;
5086 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005087 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005088 if (len != PyList_GET_SIZE(tmp)) {
5089 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5090 goto failed;
5091 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005092 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005093 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005094 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005095 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005096 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5097 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5098 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005099 return 1;
5100 }
5101 *out = While(test, body, orelse, lineno, col_offset, arena);
5102 if (*out == NULL) goto failed;
5103 return 0;
5104 }
5105 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5106 if (isinstance == -1) {
5107 return 1;
5108 }
5109 if (isinstance) {
5110 expr_ty test;
5111 asdl_seq* body;
5112 asdl_seq* orelse;
5113
Serhiy Storchakabba22392017-11-11 16:41:32 +02005114 tmp = _PyObject_GetAttrId(obj, &PyId_test);
5115 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005116 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005117 res = obj2ast_expr(tmp, &test, arena);
5118 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005119 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005120 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005121 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5122 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5123 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005124 return 1;
5125 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005126 tmp = _PyObject_GetAttrId(obj, &PyId_body);
5127 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005128 int res;
5129 Py_ssize_t len;
5130 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005131 if (!PyList_Check(tmp)) {
5132 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5133 goto failed;
5134 }
5135 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005136 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005137 if (body == NULL) goto failed;
5138 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005139 stmt_ty val;
5140 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005141 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005142 if (len != PyList_GET_SIZE(tmp)) {
5143 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5144 goto failed;
5145 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005146 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005147 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005148 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005149 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005150 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5151 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5152 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005153 return 1;
5154 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005155 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
5156 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005157 int res;
5158 Py_ssize_t len;
5159 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005160 if (!PyList_Check(tmp)) {
5161 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5162 goto failed;
5163 }
5164 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005165 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005166 if (orelse == NULL) goto failed;
5167 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005168 stmt_ty val;
5169 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005170 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005171 if (len != PyList_GET_SIZE(tmp)) {
5172 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5173 goto failed;
5174 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005175 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005176 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005177 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005178 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005179 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5180 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5181 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005182 return 1;
5183 }
5184 *out = If(test, body, orelse, lineno, col_offset, arena);
5185 if (*out == NULL) goto failed;
5186 return 0;
5187 }
5188 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5189 if (isinstance == -1) {
5190 return 1;
5191 }
5192 if (isinstance) {
5193 asdl_seq* items;
5194 asdl_seq* body;
5195
Serhiy Storchakabba22392017-11-11 16:41:32 +02005196 tmp = _PyObject_GetAttrId(obj, &PyId_items);
5197 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005198 int res;
5199 Py_ssize_t len;
5200 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005201 if (!PyList_Check(tmp)) {
5202 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5203 goto failed;
5204 }
5205 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005206 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005207 if (items == NULL) goto failed;
5208 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005209 withitem_ty val;
5210 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005211 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005212 if (len != PyList_GET_SIZE(tmp)) {
5213 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5214 goto failed;
5215 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005216 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005217 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005218 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005219 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005220 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5221 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5222 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005223 return 1;
5224 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005225 tmp = _PyObject_GetAttrId(obj, &PyId_body);
5226 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005227 int res;
5228 Py_ssize_t len;
5229 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005230 if (!PyList_Check(tmp)) {
5231 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5232 goto failed;
5233 }
5234 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005235 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005236 if (body == NULL) goto failed;
5237 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005238 stmt_ty val;
5239 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005240 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005241 if (len != PyList_GET_SIZE(tmp)) {
5242 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5243 goto failed;
5244 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005245 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005246 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005247 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005248 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005249 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5250 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5251 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005252 return 1;
5253 }
5254 *out = With(items, body, lineno, col_offset, arena);
5255 if (*out == NULL) goto failed;
5256 return 0;
5257 }
Yury Selivanov75445082015-05-11 22:57:16 -04005258 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5259 if (isinstance == -1) {
5260 return 1;
5261 }
5262 if (isinstance) {
5263 asdl_seq* items;
5264 asdl_seq* body;
5265
Serhiy Storchakabba22392017-11-11 16:41:32 +02005266 tmp = _PyObject_GetAttrId(obj, &PyId_items);
5267 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04005268 int res;
5269 Py_ssize_t len;
5270 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005271 if (!PyList_Check(tmp)) {
5272 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5273 goto failed;
5274 }
5275 len = PyList_GET_SIZE(tmp);
5276 items = _Py_asdl_seq_new(len, arena);
5277 if (items == NULL) goto failed;
5278 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005279 withitem_ty val;
5280 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005281 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005282 if (len != PyList_GET_SIZE(tmp)) {
5283 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5284 goto failed;
5285 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005286 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005287 }
5288 Py_CLEAR(tmp);
5289 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005290 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5291 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5292 }
Yury Selivanov75445082015-05-11 22:57:16 -04005293 return 1;
5294 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005295 tmp = _PyObject_GetAttrId(obj, &PyId_body);
5296 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04005297 int res;
5298 Py_ssize_t len;
5299 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005300 if (!PyList_Check(tmp)) {
5301 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5302 goto failed;
5303 }
5304 len = PyList_GET_SIZE(tmp);
5305 body = _Py_asdl_seq_new(len, arena);
5306 if (body == NULL) goto failed;
5307 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005308 stmt_ty val;
5309 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005310 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005311 if (len != PyList_GET_SIZE(tmp)) {
5312 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5313 goto failed;
5314 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005315 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005316 }
5317 Py_CLEAR(tmp);
5318 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005319 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5320 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5321 }
Yury Selivanov75445082015-05-11 22:57:16 -04005322 return 1;
5323 }
5324 *out = AsyncWith(items, body, lineno, col_offset, arena);
5325 if (*out == NULL) goto failed;
5326 return 0;
5327 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005328 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5329 if (isinstance == -1) {
5330 return 1;
5331 }
5332 if (isinstance) {
5333 expr_ty exc;
5334 expr_ty cause;
5335
Serhiy Storchakabba22392017-11-11 16:41:32 +02005336 tmp = get_not_none(obj, &PyId_exc);
5337 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005338 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005339 res = obj2ast_expr(tmp, &exc, arena);
5340 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005341 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02005342 } else if (PyErr_Occurred()) {
5343 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005344 } else {
5345 exc = NULL;
5346 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005347 tmp = get_not_none(obj, &PyId_cause);
5348 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005349 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005350 res = obj2ast_expr(tmp, &cause, arena);
5351 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005352 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02005353 } else if (PyErr_Occurred()) {
5354 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005355 } else {
5356 cause = NULL;
5357 }
5358 *out = Raise(exc, cause, lineno, col_offset, arena);
5359 if (*out == NULL) goto failed;
5360 return 0;
5361 }
5362 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5363 if (isinstance == -1) {
5364 return 1;
5365 }
5366 if (isinstance) {
5367 asdl_seq* body;
5368 asdl_seq* handlers;
5369 asdl_seq* orelse;
5370 asdl_seq* finalbody;
5371
Serhiy Storchakabba22392017-11-11 16:41:32 +02005372 tmp = _PyObject_GetAttrId(obj, &PyId_body);
5373 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005374 int res;
5375 Py_ssize_t len;
5376 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005377 if (!PyList_Check(tmp)) {
5378 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5379 goto failed;
5380 }
5381 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005382 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005383 if (body == NULL) goto failed;
5384 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005385 stmt_ty val;
5386 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005387 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005388 if (len != PyList_GET_SIZE(tmp)) {
5389 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5390 goto failed;
5391 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005392 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005393 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005394 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005395 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005396 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5397 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5398 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005399 return 1;
5400 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005401 tmp = _PyObject_GetAttrId(obj, &PyId_handlers);
5402 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005403 int res;
5404 Py_ssize_t len;
5405 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005406 if (!PyList_Check(tmp)) {
5407 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5408 goto failed;
5409 }
5410 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005411 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005412 if (handlers == NULL) goto failed;
5413 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005414 excepthandler_ty val;
5415 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005416 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005417 if (len != PyList_GET_SIZE(tmp)) {
5418 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5419 goto failed;
5420 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005421 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005422 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005423 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005424 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005425 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5426 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5427 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005428 return 1;
5429 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005430 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
5431 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005432 int res;
5433 Py_ssize_t len;
5434 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005435 if (!PyList_Check(tmp)) {
5436 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5437 goto failed;
5438 }
5439 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005440 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005441 if (orelse == NULL) goto failed;
5442 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005443 stmt_ty val;
5444 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005445 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005446 if (len != PyList_GET_SIZE(tmp)) {
5447 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5448 goto failed;
5449 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005450 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005451 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005452 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005453 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005454 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5455 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5456 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005457 return 1;
5458 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005459 tmp = _PyObject_GetAttrId(obj, &PyId_finalbody);
5460 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005461 int res;
5462 Py_ssize_t len;
5463 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005464 if (!PyList_Check(tmp)) {
5465 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5466 goto failed;
5467 }
5468 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005469 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005470 if (finalbody == NULL) goto failed;
5471 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005472 stmt_ty val;
5473 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005474 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005475 if (len != PyList_GET_SIZE(tmp)) {
5476 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5477 goto failed;
5478 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005479 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005480 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005481 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005482 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005483 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5484 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5485 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005486 return 1;
5487 }
5488 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
5489 arena);
5490 if (*out == NULL) goto failed;
5491 return 0;
5492 }
5493 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5494 if (isinstance == -1) {
5495 return 1;
5496 }
5497 if (isinstance) {
5498 expr_ty test;
5499 expr_ty msg;
5500
Serhiy Storchakabba22392017-11-11 16:41:32 +02005501 tmp = _PyObject_GetAttrId(obj, &PyId_test);
5502 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005503 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005504 res = obj2ast_expr(tmp, &test, arena);
5505 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005506 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005507 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005508 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5509 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5510 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005511 return 1;
5512 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005513 tmp = get_not_none(obj, &PyId_msg);
5514 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005515 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005516 res = obj2ast_expr(tmp, &msg, arena);
5517 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005518 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02005519 } else if (PyErr_Occurred()) {
5520 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005521 } else {
5522 msg = NULL;
5523 }
5524 *out = Assert(test, msg, lineno, col_offset, arena);
5525 if (*out == NULL) goto failed;
5526 return 0;
5527 }
5528 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5529 if (isinstance == -1) {
5530 return 1;
5531 }
5532 if (isinstance) {
5533 asdl_seq* names;
5534
Serhiy Storchakabba22392017-11-11 16:41:32 +02005535 tmp = _PyObject_GetAttrId(obj, &PyId_names);
5536 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005537 int res;
5538 Py_ssize_t len;
5539 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005540 if (!PyList_Check(tmp)) {
5541 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5542 goto failed;
5543 }
5544 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005545 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005546 if (names == NULL) goto failed;
5547 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005548 alias_ty val;
5549 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005550 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005551 if (len != PyList_GET_SIZE(tmp)) {
5552 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5553 goto failed;
5554 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005555 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005556 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005557 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005558 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005559 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5560 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5561 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005562 return 1;
5563 }
5564 *out = Import(names, lineno, col_offset, arena);
5565 if (*out == NULL) goto failed;
5566 return 0;
5567 }
5568 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5569 if (isinstance == -1) {
5570 return 1;
5571 }
5572 if (isinstance) {
5573 identifier module;
5574 asdl_seq* names;
5575 int level;
5576
Serhiy Storchakabba22392017-11-11 16:41:32 +02005577 tmp = get_not_none(obj, &PyId_module);
5578 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005579 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005580 res = obj2ast_identifier(tmp, &module, arena);
5581 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005582 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02005583 } else if (PyErr_Occurred()) {
5584 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005585 } else {
5586 module = NULL;
5587 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005588 tmp = _PyObject_GetAttrId(obj, &PyId_names);
5589 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005590 int res;
5591 Py_ssize_t len;
5592 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005593 if (!PyList_Check(tmp)) {
5594 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5595 goto failed;
5596 }
5597 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005598 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005599 if (names == NULL) goto failed;
5600 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005601 alias_ty val;
5602 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005603 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005604 if (len != PyList_GET_SIZE(tmp)) {
5605 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
5606 goto failed;
5607 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005608 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005609 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005610 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005611 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005612 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5613 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
5614 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005615 return 1;
5616 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005617 tmp = get_not_none(obj, &PyId_level);
5618 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005619 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005620 res = obj2ast_int(tmp, &level, arena);
5621 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005622 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02005623 } else if (PyErr_Occurred()) {
5624 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005625 } else {
5626 level = 0;
5627 }
5628 *out = ImportFrom(module, names, level, lineno, col_offset, arena);
5629 if (*out == NULL) goto failed;
5630 return 0;
5631 }
5632 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
5633 if (isinstance == -1) {
5634 return 1;
5635 }
5636 if (isinstance) {
5637 asdl_seq* names;
5638
Serhiy Storchakabba22392017-11-11 16:41:32 +02005639 tmp = _PyObject_GetAttrId(obj, &PyId_names);
5640 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005641 int res;
5642 Py_ssize_t len;
5643 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005644 if (!PyList_Check(tmp)) {
5645 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5646 goto failed;
5647 }
5648 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005649 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005650 if (names == NULL) goto failed;
5651 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005652 identifier val;
5653 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005654 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005655 if (len != PyList_GET_SIZE(tmp)) {
5656 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
5657 goto failed;
5658 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005659 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005660 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005661 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005662 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005663 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5664 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
5665 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005666 return 1;
5667 }
5668 *out = Global(names, lineno, col_offset, arena);
5669 if (*out == NULL) goto failed;
5670 return 0;
5671 }
5672 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
5673 if (isinstance == -1) {
5674 return 1;
5675 }
5676 if (isinstance) {
5677 asdl_seq* names;
5678
Serhiy Storchakabba22392017-11-11 16:41:32 +02005679 tmp = _PyObject_GetAttrId(obj, &PyId_names);
5680 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005681 int res;
5682 Py_ssize_t len;
5683 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005684 if (!PyList_Check(tmp)) {
5685 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5686 goto failed;
5687 }
5688 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005689 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005690 if (names == NULL) goto failed;
5691 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005692 identifier val;
5693 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005694 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005695 if (len != PyList_GET_SIZE(tmp)) {
5696 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
5697 goto failed;
5698 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005699 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005700 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005701 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005702 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005703 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5704 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
5705 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005706 return 1;
5707 }
5708 *out = Nonlocal(names, lineno, col_offset, arena);
5709 if (*out == NULL) goto failed;
5710 return 0;
5711 }
5712 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
5713 if (isinstance == -1) {
5714 return 1;
5715 }
5716 if (isinstance) {
5717 expr_ty value;
5718
Serhiy Storchakabba22392017-11-11 16:41:32 +02005719 tmp = _PyObject_GetAttrId(obj, &PyId_value);
5720 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005721 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005722 res = obj2ast_expr(tmp, &value, arena);
5723 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005724 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005725 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005726 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5727 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
5728 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005729 return 1;
5730 }
5731 *out = Expr(value, lineno, col_offset, arena);
5732 if (*out == NULL) goto failed;
5733 return 0;
5734 }
5735 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
5736 if (isinstance == -1) {
5737 return 1;
5738 }
5739 if (isinstance) {
5740
5741 *out = Pass(lineno, col_offset, arena);
5742 if (*out == NULL) goto failed;
5743 return 0;
5744 }
5745 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
5746 if (isinstance == -1) {
5747 return 1;
5748 }
5749 if (isinstance) {
5750
5751 *out = Break(lineno, col_offset, arena);
5752 if (*out == NULL) goto failed;
5753 return 0;
5754 }
5755 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
5756 if (isinstance == -1) {
5757 return 1;
5758 }
5759 if (isinstance) {
5760
5761 *out = Continue(lineno, col_offset, arena);
5762 if (*out == NULL) goto failed;
5763 return 0;
5764 }
5765
5766 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
5767 failed:
5768 Py_XDECREF(tmp);
5769 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005770}
5771
5772int
5773obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
5774{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005775 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005776
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005777 PyObject *tmp = NULL;
5778 int lineno;
5779 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005780
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005781 if (obj == Py_None) {
5782 *out = NULL;
5783 return 0;
5784 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005785 tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
5786 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005787 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005788 res = obj2ast_int(tmp, &lineno, arena);
5789 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005790 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005791 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005792 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5793 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
5794 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005795 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005796 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005797 tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
5798 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005799 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005800 res = obj2ast_int(tmp, &col_offset, arena);
5801 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005802 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005803 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005804 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5805 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
5806 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005807 return 1;
5808 }
5809 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
5810 if (isinstance == -1) {
5811 return 1;
5812 }
5813 if (isinstance) {
5814 boolop_ty op;
5815 asdl_seq* values;
5816
Serhiy Storchakabba22392017-11-11 16:41:32 +02005817 tmp = _PyObject_GetAttrId(obj, &PyId_op);
5818 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005819 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005820 res = obj2ast_boolop(tmp, &op, arena);
5821 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005822 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005823 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005824 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5825 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
5826 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005827 return 1;
5828 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005829 tmp = _PyObject_GetAttrId(obj, &PyId_values);
5830 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005831 int res;
5832 Py_ssize_t len;
5833 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005834 if (!PyList_Check(tmp)) {
5835 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5836 goto failed;
5837 }
5838 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005839 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005840 if (values == NULL) goto failed;
5841 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005842 expr_ty val;
5843 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005844 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005845 if (len != PyList_GET_SIZE(tmp)) {
5846 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
5847 goto failed;
5848 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005849 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005850 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005851 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005852 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005853 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5854 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
5855 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005856 return 1;
5857 }
5858 *out = BoolOp(op, values, lineno, col_offset, arena);
5859 if (*out == NULL) goto failed;
5860 return 0;
5861 }
5862 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
5863 if (isinstance == -1) {
5864 return 1;
5865 }
5866 if (isinstance) {
5867 expr_ty left;
5868 operator_ty op;
5869 expr_ty right;
5870
Serhiy Storchakabba22392017-11-11 16:41:32 +02005871 tmp = _PyObject_GetAttrId(obj, &PyId_left);
5872 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005873 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005874 res = obj2ast_expr(tmp, &left, arena);
5875 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005876 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005877 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005878 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5879 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
5880 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005881 return 1;
5882 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005883 tmp = _PyObject_GetAttrId(obj, &PyId_op);
5884 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005885 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005886 res = obj2ast_operator(tmp, &op, arena);
5887 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005888 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005889 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005890 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5891 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
5892 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005893 return 1;
5894 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005895 tmp = _PyObject_GetAttrId(obj, &PyId_right);
5896 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005897 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005898 res = obj2ast_expr(tmp, &right, arena);
5899 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005900 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005901 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005902 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5903 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
5904 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005905 return 1;
5906 }
5907 *out = BinOp(left, op, right, lineno, col_offset, arena);
5908 if (*out == NULL) goto failed;
5909 return 0;
5910 }
5911 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
5912 if (isinstance == -1) {
5913 return 1;
5914 }
5915 if (isinstance) {
5916 unaryop_ty op;
5917 expr_ty operand;
5918
Serhiy Storchakabba22392017-11-11 16:41:32 +02005919 tmp = _PyObject_GetAttrId(obj, &PyId_op);
5920 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005921 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005922 res = obj2ast_unaryop(tmp, &op, arena);
5923 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005924 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005925 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005926 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5927 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
5928 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005929 return 1;
5930 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005931 tmp = _PyObject_GetAttrId(obj, &PyId_operand);
5932 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005933 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005934 res = obj2ast_expr(tmp, &operand, arena);
5935 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005936 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005937 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005938 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5939 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
5940 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005941 return 1;
5942 }
5943 *out = UnaryOp(op, operand, lineno, col_offset, arena);
5944 if (*out == NULL) goto failed;
5945 return 0;
5946 }
5947 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
5948 if (isinstance == -1) {
5949 return 1;
5950 }
5951 if (isinstance) {
5952 arguments_ty args;
5953 expr_ty body;
5954
Serhiy Storchakabba22392017-11-11 16:41:32 +02005955 tmp = _PyObject_GetAttrId(obj, &PyId_args);
5956 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005957 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005958 res = obj2ast_arguments(tmp, &args, 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 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005962 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5963 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
5964 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005965 return 1;
5966 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02005967 tmp = _PyObject_GetAttrId(obj, &PyId_body);
5968 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005969 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005970 res = obj2ast_expr(tmp, &body, arena);
5971 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005972 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005973 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005974 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
5975 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
5976 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005977 return 1;
5978 }
5979 *out = Lambda(args, body, lineno, col_offset, arena);
5980 if (*out == NULL) goto failed;
5981 return 0;
5982 }
5983 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
5984 if (isinstance == -1) {
5985 return 1;
5986 }
5987 if (isinstance) {
5988 expr_ty test;
5989 expr_ty body;
5990 expr_ty orelse;
5991
Serhiy Storchakabba22392017-11-11 16:41:32 +02005992 tmp = _PyObject_GetAttrId(obj, &PyId_test);
5993 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005994 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005995 res = obj2ast_expr(tmp, &test, arena);
5996 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005997 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005998 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02005999 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6000 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
6001 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006002 return 1;
6003 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006004 tmp = _PyObject_GetAttrId(obj, &PyId_body);
6005 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006006 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006007 res = obj2ast_expr(tmp, &body, arena);
6008 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006009 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006010 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006011 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6012 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
6013 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006014 return 1;
6015 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006016 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
6017 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006018 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006019 res = obj2ast_expr(tmp, &orelse, arena);
6020 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006021 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006022 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006023 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6024 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6025 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006026 return 1;
6027 }
6028 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
6029 if (*out == NULL) goto failed;
6030 return 0;
6031 }
6032 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6033 if (isinstance == -1) {
6034 return 1;
6035 }
6036 if (isinstance) {
6037 asdl_seq* keys;
6038 asdl_seq* values;
6039
Serhiy Storchakabba22392017-11-11 16:41:32 +02006040 tmp = _PyObject_GetAttrId(obj, &PyId_keys);
6041 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006042 int res;
6043 Py_ssize_t len;
6044 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006045 if (!PyList_Check(tmp)) {
6046 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6047 goto failed;
6048 }
6049 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006050 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006051 if (keys == NULL) goto failed;
6052 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006053 expr_ty val;
6054 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006055 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006056 if (len != PyList_GET_SIZE(tmp)) {
6057 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6058 goto failed;
6059 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006060 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006061 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006062 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006063 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006064 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6065 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6066 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006067 return 1;
6068 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006069 tmp = _PyObject_GetAttrId(obj, &PyId_values);
6070 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006071 int res;
6072 Py_ssize_t len;
6073 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006074 if (!PyList_Check(tmp)) {
6075 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6076 goto failed;
6077 }
6078 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006079 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006080 if (values == NULL) goto failed;
6081 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006082 expr_ty val;
6083 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006084 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006085 if (len != PyList_GET_SIZE(tmp)) {
6086 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6087 goto failed;
6088 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006089 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006090 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006091 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006092 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006093 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6094 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6095 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006096 return 1;
6097 }
6098 *out = Dict(keys, values, lineno, col_offset, arena);
6099 if (*out == NULL) goto failed;
6100 return 0;
6101 }
6102 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6103 if (isinstance == -1) {
6104 return 1;
6105 }
6106 if (isinstance) {
6107 asdl_seq* elts;
6108
Serhiy Storchakabba22392017-11-11 16:41:32 +02006109 tmp = _PyObject_GetAttrId(obj, &PyId_elts);
6110 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006111 int res;
6112 Py_ssize_t len;
6113 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006114 if (!PyList_Check(tmp)) {
6115 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6116 goto failed;
6117 }
6118 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006119 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006120 if (elts == NULL) goto failed;
6121 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006122 expr_ty val;
6123 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006124 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006125 if (len != PyList_GET_SIZE(tmp)) {
6126 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6127 goto failed;
6128 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006129 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006130 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006131 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006132 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006133 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6134 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6135 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006136 return 1;
6137 }
6138 *out = Set(elts, lineno, col_offset, arena);
6139 if (*out == NULL) goto failed;
6140 return 0;
6141 }
6142 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6143 if (isinstance == -1) {
6144 return 1;
6145 }
6146 if (isinstance) {
6147 expr_ty elt;
6148 asdl_seq* generators;
6149
Serhiy Storchakabba22392017-11-11 16:41:32 +02006150 tmp = _PyObject_GetAttrId(obj, &PyId_elt);
6151 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006152 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006153 res = obj2ast_expr(tmp, &elt, arena);
6154 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006155 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006156 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006157 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6158 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6159 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006160 return 1;
6161 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006162 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
6163 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006164 int res;
6165 Py_ssize_t len;
6166 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006167 if (!PyList_Check(tmp)) {
6168 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6169 goto failed;
6170 }
6171 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006172 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006173 if (generators == NULL) goto failed;
6174 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006175 comprehension_ty val;
6176 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006177 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006178 if (len != PyList_GET_SIZE(tmp)) {
6179 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6180 goto failed;
6181 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006182 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006183 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006184 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006185 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006186 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6187 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6188 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006189 return 1;
6190 }
6191 *out = ListComp(elt, generators, lineno, col_offset, arena);
6192 if (*out == NULL) goto failed;
6193 return 0;
6194 }
6195 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6196 if (isinstance == -1) {
6197 return 1;
6198 }
6199 if (isinstance) {
6200 expr_ty elt;
6201 asdl_seq* generators;
6202
Serhiy Storchakabba22392017-11-11 16:41:32 +02006203 tmp = _PyObject_GetAttrId(obj, &PyId_elt);
6204 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006205 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006206 res = obj2ast_expr(tmp, &elt, arena);
6207 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006208 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006209 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006210 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6211 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6212 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006213 return 1;
6214 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006215 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
6216 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006217 int res;
6218 Py_ssize_t len;
6219 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006220 if (!PyList_Check(tmp)) {
6221 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6222 goto failed;
6223 }
6224 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006225 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006226 if (generators == NULL) goto failed;
6227 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006228 comprehension_ty val;
6229 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006230 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006231 if (len != PyList_GET_SIZE(tmp)) {
6232 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6233 goto failed;
6234 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006235 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006236 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006237 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006238 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006239 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6240 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6241 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006242 return 1;
6243 }
6244 *out = SetComp(elt, generators, lineno, col_offset, arena);
6245 if (*out == NULL) goto failed;
6246 return 0;
6247 }
6248 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6249 if (isinstance == -1) {
6250 return 1;
6251 }
6252 if (isinstance) {
6253 expr_ty key;
6254 expr_ty value;
6255 asdl_seq* generators;
6256
Serhiy Storchakabba22392017-11-11 16:41:32 +02006257 tmp = _PyObject_GetAttrId(obj, &PyId_key);
6258 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006259 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006260 res = obj2ast_expr(tmp, &key, arena);
6261 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006262 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006263 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006264 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6265 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6266 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006267 return 1;
6268 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006269 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6270 if (tmp != NULL) {
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);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006275 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006276 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6277 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6278 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006279 return 1;
6280 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006281 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
6282 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006283 int res;
6284 Py_ssize_t len;
6285 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006286 if (!PyList_Check(tmp)) {
6287 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6288 goto failed;
6289 }
6290 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006291 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006292 if (generators == NULL) goto failed;
6293 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006294 comprehension_ty val;
6295 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006296 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006297 if (len != PyList_GET_SIZE(tmp)) {
6298 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6299 goto failed;
6300 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006301 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006302 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006303 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006304 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006305 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6306 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6307 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006308 return 1;
6309 }
6310 *out = DictComp(key, value, generators, lineno, col_offset, arena);
6311 if (*out == NULL) goto failed;
6312 return 0;
6313 }
6314 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6315 if (isinstance == -1) {
6316 return 1;
6317 }
6318 if (isinstance) {
6319 expr_ty elt;
6320 asdl_seq* generators;
6321
Serhiy Storchakabba22392017-11-11 16:41:32 +02006322 tmp = _PyObject_GetAttrId(obj, &PyId_elt);
6323 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006324 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006325 res = obj2ast_expr(tmp, &elt, arena);
6326 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006327 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006328 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006329 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6330 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6331 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006332 return 1;
6333 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006334 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
6335 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006336 int res;
6337 Py_ssize_t len;
6338 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006339 if (!PyList_Check(tmp)) {
6340 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6341 goto failed;
6342 }
6343 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006344 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006345 if (generators == NULL) goto failed;
6346 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006347 comprehension_ty val;
6348 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006349 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006350 if (len != PyList_GET_SIZE(tmp)) {
6351 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6352 goto failed;
6353 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006354 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006355 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006356 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006357 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006358 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6359 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6360 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006361 return 1;
6362 }
6363 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
6364 if (*out == NULL) goto failed;
6365 return 0;
6366 }
Yury Selivanov75445082015-05-11 22:57:16 -04006367 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6368 if (isinstance == -1) {
6369 return 1;
6370 }
6371 if (isinstance) {
6372 expr_ty value;
6373
Serhiy Storchakabba22392017-11-11 16:41:32 +02006374 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6375 if (tmp != NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04006376 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006377 res = obj2ast_expr(tmp, &value, arena);
6378 if (res != 0) goto failed;
6379 Py_CLEAR(tmp);
6380 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006381 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6382 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6383 }
Yury Selivanov75445082015-05-11 22:57:16 -04006384 return 1;
6385 }
6386 *out = Await(value, lineno, col_offset, arena);
6387 if (*out == NULL) goto failed;
6388 return 0;
6389 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006390 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6391 if (isinstance == -1) {
6392 return 1;
6393 }
6394 if (isinstance) {
6395 expr_ty value;
6396
Serhiy Storchakabba22392017-11-11 16:41:32 +02006397 tmp = get_not_none(obj, &PyId_value);
6398 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006399 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006400 res = obj2ast_expr(tmp, &value, arena);
6401 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006402 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02006403 } else if (PyErr_Occurred()) {
6404 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006405 } else {
6406 value = NULL;
6407 }
6408 *out = Yield(value, lineno, col_offset, arena);
6409 if (*out == NULL) goto failed;
6410 return 0;
6411 }
6412 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6413 if (isinstance == -1) {
6414 return 1;
6415 }
6416 if (isinstance) {
6417 expr_ty value;
6418
Serhiy Storchakabba22392017-11-11 16:41:32 +02006419 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6420 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006421 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006422 res = obj2ast_expr(tmp, &value, arena);
6423 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006424 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006425 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006426 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6427 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6428 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006429 return 1;
6430 }
6431 *out = YieldFrom(value, lineno, col_offset, arena);
6432 if (*out == NULL) goto failed;
6433 return 0;
6434 }
6435 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6436 if (isinstance == -1) {
6437 return 1;
6438 }
6439 if (isinstance) {
6440 expr_ty left;
6441 asdl_int_seq* ops;
6442 asdl_seq* comparators;
6443
Serhiy Storchakabba22392017-11-11 16:41:32 +02006444 tmp = _PyObject_GetAttrId(obj, &PyId_left);
6445 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006446 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006447 res = obj2ast_expr(tmp, &left, arena);
6448 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006449 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006450 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006451 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6452 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6453 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006454 return 1;
6455 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006456 tmp = _PyObject_GetAttrId(obj, &PyId_ops);
6457 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006458 int res;
6459 Py_ssize_t len;
6460 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006461 if (!PyList_Check(tmp)) {
6462 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6463 goto failed;
6464 }
6465 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006466 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006467 if (ops == NULL) goto failed;
6468 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006469 cmpop_ty val;
6470 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006471 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006472 if (len != PyList_GET_SIZE(tmp)) {
6473 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
6474 goto failed;
6475 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006476 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006477 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006478 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006479 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006480 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6481 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6482 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006483 return 1;
6484 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006485 tmp = _PyObject_GetAttrId(obj, &PyId_comparators);
6486 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006487 int res;
6488 Py_ssize_t len;
6489 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006490 if (!PyList_Check(tmp)) {
6491 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6492 goto failed;
6493 }
6494 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006495 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006496 if (comparators == NULL) goto failed;
6497 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006498 expr_ty val;
6499 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006500 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006501 if (len != PyList_GET_SIZE(tmp)) {
6502 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
6503 goto failed;
6504 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006505 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006506 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006507 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006508 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006509 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6510 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
6511 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006512 return 1;
6513 }
6514 *out = Compare(left, ops, comparators, lineno, col_offset, arena);
6515 if (*out == NULL) goto failed;
6516 return 0;
6517 }
6518 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
6519 if (isinstance == -1) {
6520 return 1;
6521 }
6522 if (isinstance) {
6523 expr_ty func;
6524 asdl_seq* args;
6525 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006526
Serhiy Storchakabba22392017-11-11 16:41:32 +02006527 tmp = _PyObject_GetAttrId(obj, &PyId_func);
6528 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006529 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006530 res = obj2ast_expr(tmp, &func, arena);
6531 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006532 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006533 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006534 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6535 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
6536 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006537 return 1;
6538 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006539 tmp = _PyObject_GetAttrId(obj, &PyId_args);
6540 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006541 int res;
6542 Py_ssize_t len;
6543 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006544 if (!PyList_Check(tmp)) {
6545 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6546 goto failed;
6547 }
6548 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006549 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006550 if (args == NULL) goto failed;
6551 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006552 expr_ty val;
6553 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006554 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006555 if (len != PyList_GET_SIZE(tmp)) {
6556 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
6557 goto failed;
6558 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006559 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006560 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006561 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006562 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006563 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6564 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
6565 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006566 return 1;
6567 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006568 tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
6569 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006570 int res;
6571 Py_ssize_t len;
6572 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006573 if (!PyList_Check(tmp)) {
6574 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6575 goto failed;
6576 }
6577 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006578 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006579 if (keywords == NULL) goto failed;
6580 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006581 keyword_ty val;
6582 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006583 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006584 if (len != PyList_GET_SIZE(tmp)) {
6585 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
6586 goto failed;
6587 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006588 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006589 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006590 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006591 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006592 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6593 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
6594 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006595 return 1;
6596 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04006597 *out = Call(func, args, keywords, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006598 if (*out == NULL) goto failed;
6599 return 0;
6600 }
6601 isinstance = PyObject_IsInstance(obj, (PyObject*)Num_type);
6602 if (isinstance == -1) {
6603 return 1;
6604 }
6605 if (isinstance) {
6606 object n;
6607
Serhiy Storchakabba22392017-11-11 16:41:32 +02006608 tmp = _PyObject_GetAttrId(obj, &PyId_n);
6609 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006610 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006611 res = obj2ast_object(tmp, &n, arena);
6612 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006613 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006614 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006615 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6616 PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
6617 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006618 return 1;
6619 }
6620 *out = Num(n, lineno, col_offset, arena);
6621 if (*out == NULL) goto failed;
6622 return 0;
6623 }
6624 isinstance = PyObject_IsInstance(obj, (PyObject*)Str_type);
6625 if (isinstance == -1) {
6626 return 1;
6627 }
6628 if (isinstance) {
6629 string s;
6630
Serhiy Storchakabba22392017-11-11 16:41:32 +02006631 tmp = _PyObject_GetAttrId(obj, &PyId_s);
6632 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006633 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006634 res = obj2ast_string(tmp, &s, arena);
6635 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006636 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006637 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006638 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6639 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
6640 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006641 return 1;
6642 }
6643 *out = Str(s, lineno, col_offset, arena);
6644 if (*out == NULL) goto failed;
6645 return 0;
6646 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006647 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
6648 if (isinstance == -1) {
6649 return 1;
6650 }
6651 if (isinstance) {
6652 expr_ty value;
6653 int conversion;
6654 expr_ty format_spec;
6655
Serhiy Storchakabba22392017-11-11 16:41:32 +02006656 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6657 if (tmp != NULL) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006658 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006659 res = obj2ast_expr(tmp, &value, arena);
6660 if (res != 0) goto failed;
6661 Py_CLEAR(tmp);
6662 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006663 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6664 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
6665 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006666 return 1;
6667 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006668 tmp = get_not_none(obj, &PyId_conversion);
6669 if (tmp != NULL) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006670 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006671 res = obj2ast_int(tmp, &conversion, arena);
6672 if (res != 0) goto failed;
6673 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02006674 } else if (PyErr_Occurred()) {
6675 return 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006676 } else {
6677 conversion = 0;
6678 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006679 tmp = get_not_none(obj, &PyId_format_spec);
6680 if (tmp != NULL) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006681 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006682 res = obj2ast_expr(tmp, &format_spec, arena);
6683 if (res != 0) goto failed;
6684 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02006685 } else if (PyErr_Occurred()) {
6686 return 1;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006687 } else {
6688 format_spec = NULL;
6689 }
6690 *out = FormattedValue(value, conversion, format_spec, lineno,
6691 col_offset, arena);
6692 if (*out == NULL) goto failed;
6693 return 0;
6694 }
6695 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
6696 if (isinstance == -1) {
6697 return 1;
6698 }
6699 if (isinstance) {
6700 asdl_seq* values;
6701
Serhiy Storchakabba22392017-11-11 16:41:32 +02006702 tmp = _PyObject_GetAttrId(obj, &PyId_values);
6703 if (tmp != NULL) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006704 int res;
6705 Py_ssize_t len;
6706 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006707 if (!PyList_Check(tmp)) {
6708 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6709 goto failed;
6710 }
6711 len = PyList_GET_SIZE(tmp);
6712 values = _Py_asdl_seq_new(len, arena);
6713 if (values == NULL) goto failed;
6714 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006715 expr_ty val;
6716 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006717 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03006718 if (len != PyList_GET_SIZE(tmp)) {
6719 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
6720 goto failed;
6721 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006722 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006723 }
6724 Py_CLEAR(tmp);
6725 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006726 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6727 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
6728 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006729 return 1;
6730 }
6731 *out = JoinedStr(values, lineno, col_offset, arena);
6732 if (*out == NULL) goto failed;
6733 return 0;
6734 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006735 isinstance = PyObject_IsInstance(obj, (PyObject*)Bytes_type);
6736 if (isinstance == -1) {
6737 return 1;
6738 }
6739 if (isinstance) {
6740 bytes s;
6741
Serhiy Storchakabba22392017-11-11 16:41:32 +02006742 tmp = _PyObject_GetAttrId(obj, &PyId_s);
6743 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006744 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006745 res = obj2ast_bytes(tmp, &s, arena);
6746 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006747 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006748 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006749 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6750 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Bytes");
6751 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006752 return 1;
6753 }
6754 *out = Bytes(s, lineno, col_offset, arena);
6755 if (*out == NULL) goto failed;
6756 return 0;
6757 }
Victor Stinneree4b59c2013-07-27 00:01:35 +02006758 isinstance = PyObject_IsInstance(obj, (PyObject*)NameConstant_type);
6759 if (isinstance == -1) {
6760 return 1;
6761 }
6762 if (isinstance) {
6763 singleton value;
6764
Serhiy Storchakabba22392017-11-11 16:41:32 +02006765 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6766 if (tmp != NULL) {
Victor Stinneree4b59c2013-07-27 00:01:35 +02006767 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02006768 res = obj2ast_singleton(tmp, &value, arena);
6769 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02006770 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02006771 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006772 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6773 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NameConstant");
6774 }
Victor Stinneree4b59c2013-07-27 00:01:35 +02006775 return 1;
6776 }
6777 *out = NameConstant(value, lineno, col_offset, arena);
6778 if (*out == NULL) goto failed;
6779 return 0;
6780 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006781 isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type);
6782 if (isinstance == -1) {
6783 return 1;
6784 }
6785 if (isinstance) {
6786
6787 *out = Ellipsis(lineno, col_offset, arena);
6788 if (*out == NULL) goto failed;
6789 return 0;
6790 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006791 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
6792 if (isinstance == -1) {
6793 return 1;
6794 }
6795 if (isinstance) {
6796 constant value;
6797
Serhiy Storchakabba22392017-11-11 16:41:32 +02006798 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6799 if (tmp != NULL) {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006800 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006801 res = obj2ast_constant(tmp, &value, arena);
6802 if (res != 0) goto failed;
6803 Py_CLEAR(tmp);
6804 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006805 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6806 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
6807 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006808 return 1;
6809 }
6810 *out = Constant(value, lineno, col_offset, arena);
6811 if (*out == NULL) goto failed;
6812 return 0;
6813 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006814 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
6815 if (isinstance == -1) {
6816 return 1;
6817 }
6818 if (isinstance) {
6819 expr_ty value;
6820 identifier attr;
6821 expr_context_ty ctx;
6822
Serhiy Storchakabba22392017-11-11 16:41:32 +02006823 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6824 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006825 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006826 res = obj2ast_expr(tmp, &value, arena);
6827 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006828 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006829 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006830 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6831 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
6832 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006833 return 1;
6834 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006835 tmp = _PyObject_GetAttrId(obj, &PyId_attr);
6836 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006837 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006838 res = obj2ast_identifier(tmp, &attr, arena);
6839 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006840 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006841 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006842 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6843 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
6844 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006845 return 1;
6846 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006847 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
6848 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006849 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006850 res = obj2ast_expr_context(tmp, &ctx, arena);
6851 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006852 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006853 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006854 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6855 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
6856 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006857 return 1;
6858 }
6859 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
6860 if (*out == NULL) goto failed;
6861 return 0;
6862 }
6863 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
6864 if (isinstance == -1) {
6865 return 1;
6866 }
6867 if (isinstance) {
6868 expr_ty value;
6869 slice_ty slice;
6870 expr_context_ty ctx;
6871
Serhiy Storchakabba22392017-11-11 16:41:32 +02006872 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6873 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006874 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006875 res = obj2ast_expr(tmp, &value, arena);
6876 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006877 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006878 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006879 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6880 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
6881 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006882 return 1;
6883 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006884 tmp = _PyObject_GetAttrId(obj, &PyId_slice);
6885 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006886 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006887 res = obj2ast_slice(tmp, &slice, arena);
6888 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006889 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006890 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006891 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6892 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
6893 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006894 return 1;
6895 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006896 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
6897 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006898 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006899 res = obj2ast_expr_context(tmp, &ctx, arena);
6900 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006901 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006902 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006903 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6904 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
6905 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006906 return 1;
6907 }
6908 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
6909 if (*out == NULL) goto failed;
6910 return 0;
6911 }
6912 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
6913 if (isinstance == -1) {
6914 return 1;
6915 }
6916 if (isinstance) {
6917 expr_ty value;
6918 expr_context_ty ctx;
6919
Serhiy Storchakabba22392017-11-11 16:41:32 +02006920 tmp = _PyObject_GetAttrId(obj, &PyId_value);
6921 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006922 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006923 res = obj2ast_expr(tmp, &value, arena);
6924 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006925 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006926 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006927 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6928 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
6929 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006930 return 1;
6931 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006932 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
6933 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006934 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006935 res = obj2ast_expr_context(tmp, &ctx, arena);
6936 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006937 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006938 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006939 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6940 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
6941 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006942 return 1;
6943 }
6944 *out = Starred(value, ctx, lineno, col_offset, arena);
6945 if (*out == NULL) goto failed;
6946 return 0;
6947 }
6948 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
6949 if (isinstance == -1) {
6950 return 1;
6951 }
6952 if (isinstance) {
6953 identifier id;
6954 expr_context_ty ctx;
6955
Serhiy Storchakabba22392017-11-11 16:41:32 +02006956 tmp = _PyObject_GetAttrId(obj, &PyId_id);
6957 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006958 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006959 res = obj2ast_identifier(tmp, &id, arena);
6960 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006961 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006962 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006963 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6964 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
6965 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006966 return 1;
6967 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02006968 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
6969 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006970 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006971 res = obj2ast_expr_context(tmp, &ctx, arena);
6972 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006973 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006974 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02006975 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
6976 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
6977 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006978 return 1;
6979 }
6980 *out = Name(id, ctx, lineno, col_offset, arena);
6981 if (*out == NULL) goto failed;
6982 return 0;
6983 }
6984 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
6985 if (isinstance == -1) {
6986 return 1;
6987 }
6988 if (isinstance) {
6989 asdl_seq* elts;
6990 expr_context_ty ctx;
6991
Serhiy Storchakabba22392017-11-11 16:41:32 +02006992 tmp = _PyObject_GetAttrId(obj, &PyId_elts);
6993 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006994 int res;
6995 Py_ssize_t len;
6996 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006997 if (!PyList_Check(tmp)) {
6998 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6999 goto failed;
7000 }
7001 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007002 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007003 if (elts == NULL) goto failed;
7004 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007005 expr_ty val;
7006 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007007 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007008 if (len != PyList_GET_SIZE(tmp)) {
7009 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7010 goto failed;
7011 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007012 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007013 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007014 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007015 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007016 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7017 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7018 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007019 return 1;
7020 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007021 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
7022 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007023 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007024 res = obj2ast_expr_context(tmp, &ctx, arena);
7025 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007026 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007027 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007028 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7029 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7030 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007031 return 1;
7032 }
7033 *out = List(elts, ctx, lineno, col_offset, arena);
7034 if (*out == NULL) goto failed;
7035 return 0;
7036 }
7037 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7038 if (isinstance == -1) {
7039 return 1;
7040 }
7041 if (isinstance) {
7042 asdl_seq* elts;
7043 expr_context_ty ctx;
7044
Serhiy Storchakabba22392017-11-11 16:41:32 +02007045 tmp = _PyObject_GetAttrId(obj, &PyId_elts);
7046 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007047 int res;
7048 Py_ssize_t len;
7049 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007050 if (!PyList_Check(tmp)) {
7051 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7052 goto failed;
7053 }
7054 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007055 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007056 if (elts == NULL) goto failed;
7057 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007058 expr_ty val;
7059 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007060 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007061 if (len != PyList_GET_SIZE(tmp)) {
7062 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7063 goto failed;
7064 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007065 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007066 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007067 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007068 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007069 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7070 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7071 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007072 return 1;
7073 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007074 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
7075 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007076 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007077 res = obj2ast_expr_context(tmp, &ctx, arena);
7078 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007079 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007080 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007081 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7082 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7083 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007084 return 1;
7085 }
7086 *out = Tuple(elts, ctx, lineno, col_offset, arena);
7087 if (*out == NULL) goto failed;
7088 return 0;
7089 }
7090
7091 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7092 failed:
7093 Py_XDECREF(tmp);
7094 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007095}
7096
7097int
7098obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7099{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007100 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007101
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007102 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7103 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007104 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007105 }
7106 if (isinstance) {
7107 *out = Load;
7108 return 0;
7109 }
7110 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7111 if (isinstance == -1) {
7112 return 1;
7113 }
7114 if (isinstance) {
7115 *out = Store;
7116 return 0;
7117 }
7118 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7119 if (isinstance == -1) {
7120 return 1;
7121 }
7122 if (isinstance) {
7123 *out = Del;
7124 return 0;
7125 }
7126 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7127 if (isinstance == -1) {
7128 return 1;
7129 }
7130 if (isinstance) {
7131 *out = AugLoad;
7132 return 0;
7133 }
7134 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7135 if (isinstance == -1) {
7136 return 1;
7137 }
7138 if (isinstance) {
7139 *out = AugStore;
7140 return 0;
7141 }
7142 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7143 if (isinstance == -1) {
7144 return 1;
7145 }
7146 if (isinstance) {
7147 *out = Param;
7148 return 0;
7149 }
7150
7151 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7152 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007153}
7154
7155int
7156obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7157{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007158 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007159
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007160 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007161
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007162 if (obj == Py_None) {
7163 *out = NULL;
7164 return 0;
7165 }
7166 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7167 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007168 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007169 }
7170 if (isinstance) {
7171 expr_ty lower;
7172 expr_ty upper;
7173 expr_ty step;
7174
Serhiy Storchakabba22392017-11-11 16:41:32 +02007175 tmp = get_not_none(obj, &PyId_lower);
7176 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007177 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007178 res = obj2ast_expr(tmp, &lower, arena);
7179 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007180 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007181 } else if (PyErr_Occurred()) {
7182 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007183 } else {
7184 lower = NULL;
7185 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007186 tmp = get_not_none(obj, &PyId_upper);
7187 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007188 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007189 res = obj2ast_expr(tmp, &upper, arena);
7190 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007191 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007192 } else if (PyErr_Occurred()) {
7193 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007194 } else {
7195 upper = NULL;
7196 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007197 tmp = get_not_none(obj, &PyId_step);
7198 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007199 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007200 res = obj2ast_expr(tmp, &step, arena);
7201 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007202 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007203 } else if (PyErr_Occurred()) {
7204 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007205 } else {
7206 step = NULL;
7207 }
7208 *out = Slice(lower, upper, step, arena);
7209 if (*out == NULL) goto failed;
7210 return 0;
7211 }
7212 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7213 if (isinstance == -1) {
7214 return 1;
7215 }
7216 if (isinstance) {
7217 asdl_seq* dims;
7218
Serhiy Storchakabba22392017-11-11 16:41:32 +02007219 tmp = _PyObject_GetAttrId(obj, &PyId_dims);
7220 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007221 int res;
7222 Py_ssize_t len;
7223 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007224 if (!PyList_Check(tmp)) {
7225 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7226 goto failed;
7227 }
7228 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007229 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007230 if (dims == NULL) goto failed;
7231 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007232 slice_ty val;
7233 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007234 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007235 if (len != PyList_GET_SIZE(tmp)) {
7236 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7237 goto failed;
7238 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007239 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007240 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007241 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007242 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007243 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7244 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7245 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007246 return 1;
7247 }
7248 *out = ExtSlice(dims, arena);
7249 if (*out == NULL) goto failed;
7250 return 0;
7251 }
7252 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7253 if (isinstance == -1) {
7254 return 1;
7255 }
7256 if (isinstance) {
7257 expr_ty value;
7258
Serhiy Storchakabba22392017-11-11 16:41:32 +02007259 tmp = _PyObject_GetAttrId(obj, &PyId_value);
7260 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007261 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007262 res = obj2ast_expr(tmp, &value, arena);
7263 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007264 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007265 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007266 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7267 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7268 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007269 return 1;
7270 }
7271 *out = Index(value, arena);
7272 if (*out == NULL) goto failed;
7273 return 0;
7274 }
7275
7276 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7277 failed:
7278 Py_XDECREF(tmp);
7279 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007280}
7281
7282int
7283obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7284{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007285 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007286
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007287 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7288 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007289 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007290 }
7291 if (isinstance) {
7292 *out = And;
7293 return 0;
7294 }
7295 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7296 if (isinstance == -1) {
7297 return 1;
7298 }
7299 if (isinstance) {
7300 *out = Or;
7301 return 0;
7302 }
7303
7304 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7305 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007306}
7307
7308int
7309obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7310{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007311 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007312
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007313 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7314 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007315 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007316 }
7317 if (isinstance) {
7318 *out = Add;
7319 return 0;
7320 }
7321 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7322 if (isinstance == -1) {
7323 return 1;
7324 }
7325 if (isinstance) {
7326 *out = Sub;
7327 return 0;
7328 }
7329 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7330 if (isinstance == -1) {
7331 return 1;
7332 }
7333 if (isinstance) {
7334 *out = Mult;
7335 return 0;
7336 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007337 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7338 if (isinstance == -1) {
7339 return 1;
7340 }
7341 if (isinstance) {
7342 *out = MatMult;
7343 return 0;
7344 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007345 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7346 if (isinstance == -1) {
7347 return 1;
7348 }
7349 if (isinstance) {
7350 *out = Div;
7351 return 0;
7352 }
7353 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7354 if (isinstance == -1) {
7355 return 1;
7356 }
7357 if (isinstance) {
7358 *out = Mod;
7359 return 0;
7360 }
7361 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7362 if (isinstance == -1) {
7363 return 1;
7364 }
7365 if (isinstance) {
7366 *out = Pow;
7367 return 0;
7368 }
7369 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7370 if (isinstance == -1) {
7371 return 1;
7372 }
7373 if (isinstance) {
7374 *out = LShift;
7375 return 0;
7376 }
7377 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7378 if (isinstance == -1) {
7379 return 1;
7380 }
7381 if (isinstance) {
7382 *out = RShift;
7383 return 0;
7384 }
7385 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7386 if (isinstance == -1) {
7387 return 1;
7388 }
7389 if (isinstance) {
7390 *out = BitOr;
7391 return 0;
7392 }
7393 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7394 if (isinstance == -1) {
7395 return 1;
7396 }
7397 if (isinstance) {
7398 *out = BitXor;
7399 return 0;
7400 }
7401 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7402 if (isinstance == -1) {
7403 return 1;
7404 }
7405 if (isinstance) {
7406 *out = BitAnd;
7407 return 0;
7408 }
7409 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7410 if (isinstance == -1) {
7411 return 1;
7412 }
7413 if (isinstance) {
7414 *out = FloorDiv;
7415 return 0;
7416 }
7417
7418 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7419 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007420}
7421
7422int
7423obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7424{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007425 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007426
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007427 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7428 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007429 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007430 }
7431 if (isinstance) {
7432 *out = Invert;
7433 return 0;
7434 }
7435 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7436 if (isinstance == -1) {
7437 return 1;
7438 }
7439 if (isinstance) {
7440 *out = Not;
7441 return 0;
7442 }
7443 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7444 if (isinstance == -1) {
7445 return 1;
7446 }
7447 if (isinstance) {
7448 *out = UAdd;
7449 return 0;
7450 }
7451 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7452 if (isinstance == -1) {
7453 return 1;
7454 }
7455 if (isinstance) {
7456 *out = USub;
7457 return 0;
7458 }
7459
7460 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7461 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007462}
7463
7464int
7465obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7466{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007467 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007468
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007469 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7470 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007471 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007472 }
7473 if (isinstance) {
7474 *out = Eq;
7475 return 0;
7476 }
7477 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7478 if (isinstance == -1) {
7479 return 1;
7480 }
7481 if (isinstance) {
7482 *out = NotEq;
7483 return 0;
7484 }
7485 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7486 if (isinstance == -1) {
7487 return 1;
7488 }
7489 if (isinstance) {
7490 *out = Lt;
7491 return 0;
7492 }
7493 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7494 if (isinstance == -1) {
7495 return 1;
7496 }
7497 if (isinstance) {
7498 *out = LtE;
7499 return 0;
7500 }
7501 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7502 if (isinstance == -1) {
7503 return 1;
7504 }
7505 if (isinstance) {
7506 *out = Gt;
7507 return 0;
7508 }
7509 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
7510 if (isinstance == -1) {
7511 return 1;
7512 }
7513 if (isinstance) {
7514 *out = GtE;
7515 return 0;
7516 }
7517 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
7518 if (isinstance == -1) {
7519 return 1;
7520 }
7521 if (isinstance) {
7522 *out = Is;
7523 return 0;
7524 }
7525 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
7526 if (isinstance == -1) {
7527 return 1;
7528 }
7529 if (isinstance) {
7530 *out = IsNot;
7531 return 0;
7532 }
7533 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
7534 if (isinstance == -1) {
7535 return 1;
7536 }
7537 if (isinstance) {
7538 *out = In;
7539 return 0;
7540 }
7541 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
7542 if (isinstance == -1) {
7543 return 1;
7544 }
7545 if (isinstance) {
7546 *out = NotIn;
7547 return 0;
7548 }
7549
7550 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
7551 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007552}
7553
7554int
7555obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
7556{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007557 PyObject* tmp = NULL;
7558 expr_ty target;
7559 expr_ty iter;
7560 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007561 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007562
Serhiy Storchakabba22392017-11-11 16:41:32 +02007563 tmp = _PyObject_GetAttrId(obj, &PyId_target);
7564 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007565 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007566 res = obj2ast_expr(tmp, &target, arena);
7567 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007568 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007569 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007570 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7571 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
7572 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007573 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007574 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007575 tmp = _PyObject_GetAttrId(obj, &PyId_iter);
7576 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007577 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007578 res = obj2ast_expr(tmp, &iter, arena);
7579 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007580 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007581 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007582 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7583 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
7584 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007585 return 1;
7586 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007587 tmp = _PyObject_GetAttrId(obj, &PyId_ifs);
7588 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007589 int res;
7590 Py_ssize_t len;
7591 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007592 if (!PyList_Check(tmp)) {
7593 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7594 goto failed;
7595 }
7596 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007597 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007598 if (ifs == NULL) goto failed;
7599 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007600 expr_ty val;
7601 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007602 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007603 if (len != PyList_GET_SIZE(tmp)) {
7604 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
7605 goto failed;
7606 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007607 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007608 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007609 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007610 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007611 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7612 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
7613 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007614 return 1;
7615 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007616 tmp = _PyObject_GetAttrId(obj, &PyId_is_async);
7617 if (tmp != NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007618 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007619 res = obj2ast_int(tmp, &is_async, arena);
7620 if (res != 0) goto failed;
7621 Py_CLEAR(tmp);
7622 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007623 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7624 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
7625 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007626 return 1;
7627 }
7628 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007629 return 0;
7630failed:
7631 Py_XDECREF(tmp);
7632 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007633}
7634
7635int
7636obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
7637{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007638 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00007639
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007640 PyObject *tmp = NULL;
7641 int lineno;
7642 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007643
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007644 if (obj == Py_None) {
7645 *out = NULL;
7646 return 0;
7647 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007648 tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
7649 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007650 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007651 res = obj2ast_int(tmp, &lineno, arena);
7652 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007653 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007654 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007655 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7656 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
7657 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007658 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007659 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007660 tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
7661 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007662 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007663 res = obj2ast_int(tmp, &col_offset, arena);
7664 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007665 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007666 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007667 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7668 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
7669 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007670 return 1;
7671 }
7672 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
7673 if (isinstance == -1) {
7674 return 1;
7675 }
7676 if (isinstance) {
7677 expr_ty type;
7678 identifier name;
7679 asdl_seq* body;
7680
Serhiy Storchakabba22392017-11-11 16:41:32 +02007681 tmp = get_not_none(obj, &PyId_type);
7682 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007683 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007684 res = obj2ast_expr(tmp, &type, arena);
7685 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007686 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007687 } else if (PyErr_Occurred()) {
7688 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007689 } else {
7690 type = NULL;
7691 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007692 tmp = get_not_none(obj, &PyId_name);
7693 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007694 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007695 res = obj2ast_identifier(tmp, &name, arena);
7696 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007697 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007698 } else if (PyErr_Occurred()) {
7699 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007700 } else {
7701 name = NULL;
7702 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007703 tmp = _PyObject_GetAttrId(obj, &PyId_body);
7704 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007705 int res;
7706 Py_ssize_t len;
7707 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007708 if (!PyList_Check(tmp)) {
7709 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7710 goto failed;
7711 }
7712 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007713 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007714 if (body == NULL) goto failed;
7715 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007716 stmt_ty val;
7717 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007718 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007719 if (len != PyList_GET_SIZE(tmp)) {
7720 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
7721 goto failed;
7722 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007723 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007724 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007725 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007726 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007727 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7728 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
7729 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007730 return 1;
7731 }
7732 *out = ExceptHandler(type, name, body, lineno, col_offset, arena);
7733 if (*out == NULL) goto failed;
7734 return 0;
7735 }
7736
7737 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
7738 failed:
7739 Py_XDECREF(tmp);
7740 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007741}
7742
7743int
7744obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
7745{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007746 PyObject* tmp = NULL;
7747 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007748 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007749 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007750 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007751 arg_ty kwarg;
7752 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007753
Serhiy Storchakabba22392017-11-11 16:41:32 +02007754 tmp = _PyObject_GetAttrId(obj, &PyId_args);
7755 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007756 int res;
7757 Py_ssize_t len;
7758 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007759 if (!PyList_Check(tmp)) {
7760 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7761 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007762 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007763 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007764 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007765 if (args == NULL) goto failed;
7766 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007767 arg_ty val;
7768 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007769 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007770 if (len != PyList_GET_SIZE(tmp)) {
7771 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
7772 goto failed;
7773 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007774 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007775 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007776 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007777 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007778 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7779 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
7780 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007781 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007782 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007783 tmp = get_not_none(obj, &PyId_vararg);
7784 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007785 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007786 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007787 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007788 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007789 } else if (PyErr_Occurred()) {
7790 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007791 } else {
7792 vararg = NULL;
7793 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007794 tmp = _PyObject_GetAttrId(obj, &PyId_kwonlyargs);
7795 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007796 int res;
7797 Py_ssize_t len;
7798 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007799 if (!PyList_Check(tmp)) {
7800 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7801 goto failed;
7802 }
7803 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007804 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007805 if (kwonlyargs == NULL) goto failed;
7806 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007807 arg_ty val;
7808 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007809 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007810 if (len != PyList_GET_SIZE(tmp)) {
7811 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
7812 goto failed;
7813 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007814 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007815 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007816 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007817 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007818 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7819 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
7820 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007821 return 1;
7822 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007823 tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults);
7824 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007825 int res;
7826 Py_ssize_t len;
7827 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007828 if (!PyList_Check(tmp)) {
7829 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7830 goto failed;
7831 }
7832 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007833 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007834 if (kw_defaults == NULL) goto failed;
7835 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007836 expr_ty val;
7837 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007838 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007839 if (len != PyList_GET_SIZE(tmp)) {
7840 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
7841 goto failed;
7842 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007843 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007844 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007845 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007846 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007847 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7848 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
7849 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007850 return 1;
7851 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007852 tmp = get_not_none(obj, &PyId_kwarg);
7853 if (tmp != NULL) {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007854 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007855 res = obj2ast_arg(tmp, &kwarg, arena);
7856 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02007857 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007858 } else if (PyErr_Occurred()) {
7859 return 1;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007860 } else {
7861 kwarg = NULL;
7862 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007863 tmp = _PyObject_GetAttrId(obj, &PyId_defaults);
7864 if (tmp != NULL) {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007865 int res;
7866 Py_ssize_t len;
7867 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007868 if (!PyList_Check(tmp)) {
7869 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7870 goto failed;
7871 }
7872 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007873 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007874 if (defaults == NULL) goto failed;
7875 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007876 expr_ty val;
7877 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007878 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007879 if (len != PyList_GET_SIZE(tmp)) {
7880 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
7881 goto failed;
7882 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007883 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007884 }
Victor Stinnerb3189902013-07-27 00:04:42 +02007885 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007886 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007887 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7888 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
7889 }
Victor Stinneree4b59c2013-07-27 00:01:35 +02007890 return 1;
7891 }
7892 *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults,
7893 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007894 return 0;
7895failed:
7896 Py_XDECREF(tmp);
7897 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007898}
7899
7900int
7901obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
7902{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007903 PyObject* tmp = NULL;
7904 identifier arg;
7905 expr_ty annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01007906 int lineno;
7907 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007908
Serhiy Storchakabba22392017-11-11 16:41:32 +02007909 tmp = _PyObject_GetAttrId(obj, &PyId_arg);
7910 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007911 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007912 res = obj2ast_identifier(tmp, &arg, arena);
7913 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007914 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007915 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007916 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7917 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
7918 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007919 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007920 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007921 tmp = get_not_none(obj, &PyId_annotation);
7922 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007923 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007924 res = obj2ast_expr(tmp, &annotation, arena);
7925 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007926 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007927 } else if (PyErr_Occurred()) {
7928 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007929 } else {
7930 annotation = NULL;
7931 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007932 tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
7933 if (tmp != NULL) {
Victor Stinnerc106c682015-11-06 17:01:48 +01007934 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01007935 res = obj2ast_int(tmp, &lineno, arena);
7936 if (res != 0) goto failed;
7937 Py_CLEAR(tmp);
7938 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007939 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7940 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
7941 }
Victor Stinnerc106c682015-11-06 17:01:48 +01007942 return 1;
7943 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007944 tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
7945 if (tmp != NULL) {
Victor Stinnerc106c682015-11-06 17:01:48 +01007946 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01007947 res = obj2ast_int(tmp, &col_offset, arena);
7948 if (res != 0) goto failed;
7949 Py_CLEAR(tmp);
7950 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007951 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7952 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
7953 }
Victor Stinnerc106c682015-11-06 17:01:48 +01007954 return 1;
7955 }
7956 *out = arg(arg, annotation, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007957 return 0;
7958failed:
7959 Py_XDECREF(tmp);
7960 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007961}
7962
7963int
7964obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
7965{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007966 PyObject* tmp = NULL;
7967 identifier arg;
7968 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007969
Serhiy Storchakabba22392017-11-11 16:41:32 +02007970 tmp = get_not_none(obj, &PyId_arg);
7971 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007972 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007973 res = obj2ast_identifier(tmp, &arg, arena);
7974 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007975 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02007976 } else if (PyErr_Occurred()) {
7977 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007978 } else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04007979 arg = NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007980 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02007981 tmp = _PyObject_GetAttrId(obj, &PyId_value);
7982 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007983 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007984 res = obj2ast_expr(tmp, &value, arena);
7985 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007986 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007987 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02007988 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
7989 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
7990 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007991 return 1;
7992 }
7993 *out = keyword(arg, value, arena);
7994 return 0;
7995failed:
7996 Py_XDECREF(tmp);
7997 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007998}
7999
8000int
8001obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8002{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008003 PyObject* tmp = NULL;
8004 identifier name;
8005 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008006
Serhiy Storchakabba22392017-11-11 16:41:32 +02008007 tmp = _PyObject_GetAttrId(obj, &PyId_name);
8008 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008009 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008010 res = obj2ast_identifier(tmp, &name, arena);
8011 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008012 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008013 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02008014 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
8015 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8016 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008017 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008018 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02008019 tmp = get_not_none(obj, &PyId_asname);
8020 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008021 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008022 res = obj2ast_identifier(tmp, &asname, arena);
8023 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008024 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02008025 } else if (PyErr_Occurred()) {
8026 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008027 } else {
8028 asname = NULL;
8029 }
8030 *out = alias(name, asname, arena);
8031 return 0;
8032failed:
8033 Py_XDECREF(tmp);
8034 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008035}
8036
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008037int
8038obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8039{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008040 PyObject* tmp = NULL;
8041 expr_ty context_expr;
8042 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008043
Serhiy Storchakabba22392017-11-11 16:41:32 +02008044 tmp = _PyObject_GetAttrId(obj, &PyId_context_expr);
8045 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008046 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008047 res = obj2ast_expr(tmp, &context_expr, arena);
8048 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008049 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008050 } else {
Serhiy Storchakabba22392017-11-11 16:41:32 +02008051 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
8052 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8053 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008054 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008055 }
Serhiy Storchakabba22392017-11-11 16:41:32 +02008056 tmp = get_not_none(obj, &PyId_optional_vars);
8057 if (tmp != NULL) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008058 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008059 res = obj2ast_expr(tmp, &optional_vars, arena);
8060 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008061 Py_CLEAR(tmp);
Serhiy Storchakabba22392017-11-11 16:41:32 +02008062 } else if (PyErr_Occurred()) {
8063 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008064 } else {
8065 optional_vars = NULL;
8066 }
8067 *out = withitem(context_expr, optional_vars, arena);
8068 return 0;
8069failed:
8070 Py_XDECREF(tmp);
8071 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008072}
8073
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008074
Martin v. Löwis1a214512008-06-11 05:26:20 +00008075static struct PyModuleDef _astmodule = {
8076 PyModuleDef_HEAD_INIT, "_ast"
8077};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008078PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008079PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008080{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008081 PyObject *m, *d;
8082 if (!init_types()) return NULL;
8083 m = PyModule_Create(&_astmodule);
8084 if (!m) return NULL;
8085 d = PyModule_GetDict(m);
8086 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008087 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008088 return NULL;
8089 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8090 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8091 NULL;
8092 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8093 0) return NULL;
8094 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8095 return NULL;
8096 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8097 NULL;
8098 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8099 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8100 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008101 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8102 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008103 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8104 return NULL;
8105 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8106 NULL;
8107 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8108 NULL;
8109 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8110 NULL;
8111 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8112 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008113 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8114 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008115 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008116 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8117 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008118 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8119 NULL;
8120 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8121 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008122 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8123 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008124 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8125 NULL;
8126 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8127 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8128 NULL;
8129 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8130 NULL;
8131 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8132 return NULL;
8133 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8134 NULL;
8135 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8136 return NULL;
8137 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8138 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8139 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8140 NULL;
8141 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8142 return NULL;
8143 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8144 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8145 NULL;
8146 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8147 NULL;
8148 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8149 NULL;
8150 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8151 NULL;
8152 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8153 NULL;
8154 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8155 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8156 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8157 return NULL;
8158 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8159 NULL;
8160 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8161 return NULL;
8162 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8163 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008164 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8165 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008166 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8167 NULL;
8168 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8169 return NULL;
8170 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8171 NULL;
8172 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
8173 if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return NULL;
8174 if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008175 if (PyDict_SetItemString(d, "FormattedValue",
8176 (PyObject*)FormattedValue_type) < 0) return NULL;
8177 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8178 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008179 if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return
8180 NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008181 if (PyDict_SetItemString(d, "NameConstant", (PyObject*)NameConstant_type) <
8182 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008183 if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
8184 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008185 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8186 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008187 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8188 return NULL;
8189 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8190 return NULL;
8191 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8192 NULL;
8193 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8194 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8195 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8196 NULL;
8197 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8198 0) return NULL;
8199 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8200 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8201 NULL;
8202 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8203 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8204 NULL;
8205 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8206 return NULL;
8207 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8208 NULL;
8209 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8210 NULL;
8211 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8212 NULL;
8213 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8214 return NULL;
8215 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8216 NULL;
8217 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8218 NULL;
8219 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8220 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8221 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8222 return NULL;
8223 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8224 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8225 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008226 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8227 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008228 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8229 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8230 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8231 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8232 NULL;
8233 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8234 NULL;
8235 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8236 NULL;
8237 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8238 NULL;
8239 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8240 NULL;
8241 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8242 return NULL;
8243 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8244 NULL;
8245 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8246 NULL;
8247 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8248 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8249 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8250 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8251 NULL;
8252 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8253 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8254 NULL;
8255 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8256 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8257 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8258 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8259 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8260 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8261 NULL;
8262 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8263 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8264 NULL;
8265 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8266 < 0) return NULL;
8267 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8268 < 0) return NULL;
8269 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8270 < 0) return NULL;
8271 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8272 return NULL;
8273 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8274 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8275 NULL;
8276 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8277 NULL;
8278 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8279 return NULL;
8280 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008281}
8282
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008283
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008284PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008285{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008286 if (!init_types())
8287 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008288 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008289}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008290
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008291/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8292mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008293{
8294 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008295 PyObject *req_type[3];
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008296 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008297 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008298
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008299 req_type[0] = (PyObject*)Module_type;
8300 req_type[1] = (PyObject*)Expression_type;
8301 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008302
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008303 assert(0 <= mode && mode <= 2);
8304
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008305 if (!init_types())
8306 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008307
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008308 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8309 if (isinstance == -1)
8310 return NULL;
8311 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008312 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8313 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008314 return NULL;
8315 }
8316 if (obj2ast_mod(ast, &res, arena) != 0)
8317 return NULL;
8318 else
8319 return res;
8320}
8321
8322int PyAST_Check(PyObject* obj)
8323{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008324 if (!init_types())
8325 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00008326 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008327}
8328
Martin v. Löwis5b222132007-06-10 09:51:05 +00008329