blob: f7a056845e9565de000006d95a372c44ca188906 [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;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200548 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
549 goto cleanup;
550 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000551 if (fields) {
552 numfields = PySequence_Size(fields);
553 if (numfields == -1)
554 goto cleanup;
555 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900556
Neal Norwitz207c9f32008-03-31 04:42:11 +0000557 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900558 if (numfields < PyTuple_GET_SIZE(args)) {
559 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
560 "%zd positional argument%s",
561 Py_TYPE(self)->tp_name,
562 numfields, numfields == 1 ? "" : "s");
563 res = -1;
564 goto cleanup;
565 }
566 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
567 /* cannot be reached when fields is NULL */
568 PyObject *name = PySequence_GetItem(fields, i);
569 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000570 res = -1;
571 goto cleanup;
572 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900573 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
574 Py_DECREF(name);
575 if (res < 0)
576 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000577 }
578 if (kw) {
579 i = 0; /* needed by PyDict_Next */
580 while (PyDict_Next(kw, &i, &key, &value)) {
581 res = PyObject_SetAttr(self, key, value);
582 if (res < 0)
583 goto cleanup;
584 }
585 }
586 cleanup:
587 Py_XDECREF(fields);
588 return res;
589}
590
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000591/* Pickling support */
592static PyObject *
593ast_type_reduce(PyObject *self, PyObject *unused)
594{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200595 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200596 PyObject *dict;
597 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
598 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000599 }
600 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200601 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000602 }
603 return Py_BuildValue("O()", Py_TYPE(self));
604}
605
606static PyMethodDef ast_type_methods[] = {
607 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
608 {NULL}
609};
610
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700611static PyGetSetDef ast_type_getsets[] = {
612 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
613 {NULL}
614};
615
Neal Norwitz207c9f32008-03-31 04:42:11 +0000616static PyTypeObject AST_type = {
617 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000618 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700619 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000620 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500621 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000622 0, /* tp_print */
623 0, /* tp_getattr */
624 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000625 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000626 0, /* tp_repr */
627 0, /* tp_as_number */
628 0, /* tp_as_sequence */
629 0, /* tp_as_mapping */
630 0, /* tp_hash */
631 0, /* tp_call */
632 0, /* tp_str */
633 PyObject_GenericGetAttr, /* tp_getattro */
634 PyObject_GenericSetAttr, /* tp_setattro */
635 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700636 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000637 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700638 (traverseproc)ast_traverse, /* tp_traverse */
639 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000640 0, /* tp_richcompare */
641 0, /* tp_weaklistoffset */
642 0, /* tp_iter */
643 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000644 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000645 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700646 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000647 0, /* tp_base */
648 0, /* tp_dict */
649 0, /* tp_descr_get */
650 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700651 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000652 (initproc)ast_type_init, /* tp_init */
653 PyType_GenericAlloc, /* tp_alloc */
654 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700655 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000656};
657
658
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000659static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
660{
INADA Naokifc489082017-01-25 22:33:43 +0900661 _Py_IDENTIFIER(__module__);
662 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000663 PyObject *fnames, *result;
664 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000665 fnames = PyTuple_New(num_fields);
666 if (!fnames) return NULL;
667 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000668 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000669 if (!field) {
670 Py_DECREF(fnames);
671 return NULL;
672 }
673 PyTuple_SET_ITEM(fnames, i, field);
674 }
INADA Naokifc489082017-01-25 22:33:43 +0900675 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
676 type, base,
677 _PyUnicode_FromId(&PyId__fields), fnames,
678 _PyUnicode_FromId(&PyId___module__),
679 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000680 Py_DECREF(fnames);
681 return (PyTypeObject*)result;
682}
683
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000684static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
685{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000686 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000687 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000688 if (!l)
689 return 0;
690 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000691 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000692 if (!s) {
693 Py_DECREF(l);
694 return 0;
695 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000696 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000697 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200698 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000699 Py_DECREF(l);
700 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000701}
702
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000703/* Conversion AST -> Python */
704
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000705static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
706{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700707 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000708 PyObject *result = PyList_New(n);
709 PyObject *value;
710 if (!result)
711 return NULL;
712 for (i = 0; i < n; i++) {
713 value = func(asdl_seq_GET(seq, i));
714 if (!value) {
715 Py_DECREF(result);
716 return NULL;
717 }
718 PyList_SET_ITEM(result, i, value);
719 }
720 return result;
721}
722
723static PyObject* ast2obj_object(void *o)
724{
725 if (!o)
726 o = Py_None;
727 Py_INCREF((PyObject*)o);
728 return (PyObject*)o;
729}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500730#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100731#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000732#define ast2obj_identifier ast2obj_object
733#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500734#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000735
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000736static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000737{
Christian Heimes217cfd12007-12-02 14:31:20 +0000738 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000739}
740
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000741/* Conversion Python -> AST */
742
Benjamin Peterson442f2092012-12-06 17:41:04 -0500743static int obj2ast_singleton(PyObject *obj, PyObject** out, PyArena* arena)
744{
745 if (obj != Py_None && obj != Py_True && obj != Py_False) {
746 PyErr_SetString(PyExc_ValueError,
747 "AST singleton must be True, False, or None");
748 return 1;
749 }
750 *out = obj;
751 return 0;
752}
753
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000754static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
755{
756 if (obj == Py_None)
757 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200758 if (obj) {
759 if (PyArena_AddPyObject(arena, obj) < 0) {
760 *out = NULL;
761 return -1;
762 }
763 Py_INCREF(obj);
764 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000765 *out = obj;
766 return 0;
767}
768
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100769static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
770{
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100771 if (obj) {
772 if (PyArena_AddPyObject(arena, obj) < 0) {
773 *out = NULL;
774 return -1;
775 }
776 Py_INCREF(obj);
777 }
778 *out = obj;
779 return 0;
780}
781
Benjamin Peterson180e6352011-07-22 11:09:07 -0500782static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500783{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500784 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
785 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500786 return 1;
787 }
788 return obj2ast_object(obj, out, arena);
789}
790
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500791static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
792{
Benjamin Peterson0224d4e2011-08-31 22:13:03 -0400793 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
Benjamin Peterson180e6352011-07-22 11:09:07 -0500794 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
795 return 1;
796 }
797 return obj2ast_object(obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500798}
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000799
Benjamin Petersone2498412011-08-09 16:08:39 -0500800static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
801{
802 if (!PyBytes_CheckExact(obj)) {
803 PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
804 return 1;
805 }
806 return obj2ast_object(obj, out, arena);
807}
808
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000809static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
810{
811 int i;
812 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100813 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000814 return 1;
815 }
816
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300817 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000818 if (i == -1 && PyErr_Occurred())
819 return 1;
820 *out = i;
821 return 0;
822}
823
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000824static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000825{
826 PyObject *empty_tuple, *d;
827 if (PyType_Ready(&AST_type) < 0)
828 return -1;
829 d = AST_type.tp_dict;
830 empty_tuple = PyTuple_New(0);
831 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900832 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
833 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000834 Py_XDECREF(empty_tuple);
835 return -1;
836 }
837 Py_DECREF(empty_tuple);
838 return 0;
839}
840
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000841
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000842static int init_types(void)
843{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200844 static int initialized;
845 if (initialized) return 1;
846 if (add_ast_fields() < 0) return 0;
847 mod_type = make_type("mod", &AST_type, NULL, 0);
848 if (!mod_type) return 0;
849 if (!add_attributes(mod_type, NULL, 0)) return 0;
INADA Naokicb41b272017-02-23 00:31:59 +0900850 Module_type = make_type("Module", mod_type, Module_fields, 2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200851 if (!Module_type) return 0;
852 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
853 1);
854 if (!Interactive_type) return 0;
855 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
856 if (!Expression_type) return 0;
857 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
858 if (!Suite_type) return 0;
859 stmt_type = make_type("stmt", &AST_type, NULL, 0);
860 if (!stmt_type) return 0;
861 if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
862 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
INADA Naokicb41b272017-02-23 00:31:59 +0900863 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200864 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400865 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
INADA Naokicb41b272017-02-23 00:31:59 +0900866 AsyncFunctionDef_fields, 6);
Yury Selivanov75445082015-05-11 22:57:16 -0400867 if (!AsyncFunctionDef_type) return 0;
INADA Naokicb41b272017-02-23 00:31:59 +0900868 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200869 if (!ClassDef_type) return 0;
870 Return_type = make_type("Return", stmt_type, Return_fields, 1);
871 if (!Return_type) return 0;
872 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
873 if (!Delete_type) return 0;
874 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
875 if (!Assign_type) return 0;
876 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
877 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700878 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
879 if (!AnnAssign_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200880 For_type = make_type("For", stmt_type, For_fields, 4);
881 if (!For_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400882 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4);
883 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200884 While_type = make_type("While", stmt_type, While_fields, 3);
885 if (!While_type) return 0;
886 If_type = make_type("If", stmt_type, If_fields, 3);
887 if (!If_type) return 0;
888 With_type = make_type("With", stmt_type, With_fields, 2);
889 if (!With_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400890 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 2);
891 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200892 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
893 if (!Raise_type) return 0;
894 Try_type = make_type("Try", stmt_type, Try_fields, 4);
895 if (!Try_type) return 0;
896 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
897 if (!Assert_type) return 0;
898 Import_type = make_type("Import", stmt_type, Import_fields, 1);
899 if (!Import_type) return 0;
900 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
901 if (!ImportFrom_type) return 0;
902 Global_type = make_type("Global", stmt_type, Global_fields, 1);
903 if (!Global_type) return 0;
904 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
905 if (!Nonlocal_type) return 0;
906 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
907 if (!Expr_type) return 0;
908 Pass_type = make_type("Pass", stmt_type, NULL, 0);
909 if (!Pass_type) return 0;
910 Break_type = make_type("Break", stmt_type, NULL, 0);
911 if (!Break_type) return 0;
912 Continue_type = make_type("Continue", stmt_type, NULL, 0);
913 if (!Continue_type) return 0;
914 expr_type = make_type("expr", &AST_type, NULL, 0);
915 if (!expr_type) return 0;
916 if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
917 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
918 if (!BoolOp_type) return 0;
919 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
920 if (!BinOp_type) return 0;
921 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
922 if (!UnaryOp_type) return 0;
923 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
924 if (!Lambda_type) return 0;
925 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
926 if (!IfExp_type) return 0;
927 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
928 if (!Dict_type) return 0;
929 Set_type = make_type("Set", expr_type, Set_fields, 1);
930 if (!Set_type) return 0;
931 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
932 if (!ListComp_type) return 0;
933 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
934 if (!SetComp_type) return 0;
935 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
936 if (!DictComp_type) return 0;
937 GeneratorExp_type = make_type("GeneratorExp", expr_type,
938 GeneratorExp_fields, 2);
939 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400940 Await_type = make_type("Await", expr_type, Await_fields, 1);
941 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200942 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
943 if (!Yield_type) return 0;
944 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
945 if (!YieldFrom_type) return 0;
946 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
947 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400948 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200949 if (!Call_type) return 0;
950 Num_type = make_type("Num", expr_type, Num_fields, 1);
951 if (!Num_type) return 0;
952 Str_type = make_type("Str", expr_type, Str_fields, 1);
953 if (!Str_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400954 FormattedValue_type = make_type("FormattedValue", expr_type,
955 FormattedValue_fields, 3);
956 if (!FormattedValue_type) return 0;
957 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
958 if (!JoinedStr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200959 Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);
960 if (!Bytes_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +0200961 NameConstant_type = make_type("NameConstant", expr_type,
962 NameConstant_fields, 1);
963 if (!NameConstant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200964 Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);
965 if (!Ellipsis_type) return 0;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100966 Constant_type = make_type("Constant", expr_type, Constant_fields, 1);
967 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200968 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
969 if (!Attribute_type) return 0;
970 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
971 if (!Subscript_type) return 0;
972 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
973 if (!Starred_type) return 0;
974 Name_type = make_type("Name", expr_type, Name_fields, 2);
975 if (!Name_type) return 0;
976 List_type = make_type("List", expr_type, List_fields, 2);
977 if (!List_type) return 0;
978 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
979 if (!Tuple_type) return 0;
980 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
981 if (!expr_context_type) return 0;
982 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
983 Load_type = make_type("Load", expr_context_type, NULL, 0);
984 if (!Load_type) return 0;
985 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
986 if (!Load_singleton) return 0;
987 Store_type = make_type("Store", expr_context_type, NULL, 0);
988 if (!Store_type) return 0;
989 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
990 if (!Store_singleton) return 0;
991 Del_type = make_type("Del", expr_context_type, NULL, 0);
992 if (!Del_type) return 0;
993 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
994 if (!Del_singleton) return 0;
995 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
996 if (!AugLoad_type) return 0;
997 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
998 if (!AugLoad_singleton) return 0;
999 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
1000 if (!AugStore_type) return 0;
1001 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
1002 if (!AugStore_singleton) return 0;
1003 Param_type = make_type("Param", expr_context_type, NULL, 0);
1004 if (!Param_type) return 0;
1005 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
1006 if (!Param_singleton) return 0;
1007 slice_type = make_type("slice", &AST_type, NULL, 0);
1008 if (!slice_type) return 0;
1009 if (!add_attributes(slice_type, NULL, 0)) return 0;
1010 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1011 if (!Slice_type) return 0;
1012 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1013 if (!ExtSlice_type) return 0;
1014 Index_type = make_type("Index", slice_type, Index_fields, 1);
1015 if (!Index_type) return 0;
1016 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1017 if (!boolop_type) return 0;
1018 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1019 And_type = make_type("And", boolop_type, NULL, 0);
1020 if (!And_type) return 0;
1021 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1022 if (!And_singleton) return 0;
1023 Or_type = make_type("Or", boolop_type, NULL, 0);
1024 if (!Or_type) return 0;
1025 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1026 if (!Or_singleton) return 0;
1027 operator_type = make_type("operator", &AST_type, NULL, 0);
1028 if (!operator_type) return 0;
1029 if (!add_attributes(operator_type, NULL, 0)) return 0;
1030 Add_type = make_type("Add", operator_type, NULL, 0);
1031 if (!Add_type) return 0;
1032 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1033 if (!Add_singleton) return 0;
1034 Sub_type = make_type("Sub", operator_type, NULL, 0);
1035 if (!Sub_type) return 0;
1036 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1037 if (!Sub_singleton) return 0;
1038 Mult_type = make_type("Mult", operator_type, NULL, 0);
1039 if (!Mult_type) return 0;
1040 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1041 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001042 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1043 if (!MatMult_type) return 0;
1044 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1045 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001046 Div_type = make_type("Div", operator_type, NULL, 0);
1047 if (!Div_type) return 0;
1048 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1049 if (!Div_singleton) return 0;
1050 Mod_type = make_type("Mod", operator_type, NULL, 0);
1051 if (!Mod_type) return 0;
1052 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1053 if (!Mod_singleton) return 0;
1054 Pow_type = make_type("Pow", operator_type, NULL, 0);
1055 if (!Pow_type) return 0;
1056 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1057 if (!Pow_singleton) return 0;
1058 LShift_type = make_type("LShift", operator_type, NULL, 0);
1059 if (!LShift_type) return 0;
1060 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1061 if (!LShift_singleton) return 0;
1062 RShift_type = make_type("RShift", operator_type, NULL, 0);
1063 if (!RShift_type) return 0;
1064 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1065 if (!RShift_singleton) return 0;
1066 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1067 if (!BitOr_type) return 0;
1068 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1069 if (!BitOr_singleton) return 0;
1070 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1071 if (!BitXor_type) return 0;
1072 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1073 if (!BitXor_singleton) return 0;
1074 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1075 if (!BitAnd_type) return 0;
1076 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1077 if (!BitAnd_singleton) return 0;
1078 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1079 if (!FloorDiv_type) return 0;
1080 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1081 if (!FloorDiv_singleton) return 0;
1082 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1083 if (!unaryop_type) return 0;
1084 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1085 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1086 if (!Invert_type) return 0;
1087 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1088 if (!Invert_singleton) return 0;
1089 Not_type = make_type("Not", unaryop_type, NULL, 0);
1090 if (!Not_type) return 0;
1091 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1092 if (!Not_singleton) return 0;
1093 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1094 if (!UAdd_type) return 0;
1095 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1096 if (!UAdd_singleton) return 0;
1097 USub_type = make_type("USub", unaryop_type, NULL, 0);
1098 if (!USub_type) return 0;
1099 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1100 if (!USub_singleton) return 0;
1101 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1102 if (!cmpop_type) return 0;
1103 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1104 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1105 if (!Eq_type) return 0;
1106 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1107 if (!Eq_singleton) return 0;
1108 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1109 if (!NotEq_type) return 0;
1110 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1111 if (!NotEq_singleton) return 0;
1112 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1113 if (!Lt_type) return 0;
1114 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1115 if (!Lt_singleton) return 0;
1116 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1117 if (!LtE_type) return 0;
1118 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1119 if (!LtE_singleton) return 0;
1120 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1121 if (!Gt_type) return 0;
1122 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1123 if (!Gt_singleton) return 0;
1124 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1125 if (!GtE_type) return 0;
1126 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1127 if (!GtE_singleton) return 0;
1128 Is_type = make_type("Is", cmpop_type, NULL, 0);
1129 if (!Is_type) return 0;
1130 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1131 if (!Is_singleton) return 0;
1132 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1133 if (!IsNot_type) return 0;
1134 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1135 if (!IsNot_singleton) return 0;
1136 In_type = make_type("In", cmpop_type, NULL, 0);
1137 if (!In_type) return 0;
1138 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1139 if (!In_singleton) return 0;
1140 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1141 if (!NotIn_type) return 0;
1142 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1143 if (!NotIn_singleton) return 0;
1144 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001145 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001146 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001147 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001148 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1149 if (!excepthandler_type) return 0;
1150 if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
1151 return 0;
1152 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1153 ExceptHandler_fields, 3);
1154 if (!ExceptHandler_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001155 arguments_type = make_type("arguments", &AST_type, arguments_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001156 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001157 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001158 arg_type = make_type("arg", &AST_type, arg_fields, 2);
1159 if (!arg_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001160 if (!add_attributes(arg_type, arg_attributes, 2)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001161 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1162 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001163 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001164 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1165 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001166 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001167 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1168 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001169 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001170 initialized = 1;
1171 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001172}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001173
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001174static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1175static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1176static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1177static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1178 arena);
1179static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1180static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1181static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1182static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1183static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1184static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1185 arena);
1186static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1187 arena);
1188static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1189static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1190static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1191static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001192static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001193
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194mod_ty
INADA Naokicb41b272017-02-23 00:31:59 +09001195Module(asdl_seq * body, string docstring, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001197 mod_ty p;
1198 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1199 if (!p)
1200 return NULL;
1201 p->kind = Module_kind;
1202 p->v.Module.body = body;
INADA Naokicb41b272017-02-23 00:31:59 +09001203 p->v.Module.docstring = docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001204 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205}
1206
1207mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001208Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001210 mod_ty p;
1211 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1212 if (!p)
1213 return NULL;
1214 p->kind = Interactive_kind;
1215 p->v.Interactive.body = body;
1216 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217}
1218
1219mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001222 mod_ty p;
1223 if (!body) {
1224 PyErr_SetString(PyExc_ValueError,
1225 "field body is required for Expression");
1226 return NULL;
1227 }
1228 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1229 if (!p)
1230 return NULL;
1231 p->kind = Expression_kind;
1232 p->v.Expression.body = body;
1233 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234}
1235
1236mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001237Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001239 mod_ty p;
1240 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1241 if (!p)
1242 return NULL;
1243 p->kind = Suite_kind;
1244 p->v.Suite.body = body;
1245 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246}
1247
1248stmt_ty
1249FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
INADA Naokicb41b272017-02-23 00:31:59 +09001250 decorator_list, expr_ty returns, string docstring, int lineno, int
1251 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001253 stmt_ty p;
1254 if (!name) {
1255 PyErr_SetString(PyExc_ValueError,
1256 "field name is required for FunctionDef");
1257 return NULL;
1258 }
1259 if (!args) {
1260 PyErr_SetString(PyExc_ValueError,
1261 "field args is required for FunctionDef");
1262 return NULL;
1263 }
1264 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1265 if (!p)
1266 return NULL;
1267 p->kind = FunctionDef_kind;
1268 p->v.FunctionDef.name = name;
1269 p->v.FunctionDef.args = args;
1270 p->v.FunctionDef.body = body;
1271 p->v.FunctionDef.decorator_list = decorator_list;
1272 p->v.FunctionDef.returns = returns;
INADA Naokicb41b272017-02-23 00:31:59 +09001273 p->v.FunctionDef.docstring = docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001274 p->lineno = lineno;
1275 p->col_offset = col_offset;
1276 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001277}
1278
1279stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001280AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
INADA Naokicb41b272017-02-23 00:31:59 +09001281 * decorator_list, expr_ty returns, string docstring, int
1282 lineno, int col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001283{
1284 stmt_ty p;
1285 if (!name) {
1286 PyErr_SetString(PyExc_ValueError,
1287 "field name is required for AsyncFunctionDef");
1288 return NULL;
1289 }
1290 if (!args) {
1291 PyErr_SetString(PyExc_ValueError,
1292 "field args is required for AsyncFunctionDef");
1293 return NULL;
1294 }
1295 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1296 if (!p)
1297 return NULL;
1298 p->kind = AsyncFunctionDef_kind;
1299 p->v.AsyncFunctionDef.name = name;
1300 p->v.AsyncFunctionDef.args = args;
1301 p->v.AsyncFunctionDef.body = body;
1302 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1303 p->v.AsyncFunctionDef.returns = returns;
INADA Naokicb41b272017-02-23 00:31:59 +09001304 p->v.AsyncFunctionDef.docstring = docstring;
Yury Selivanov75445082015-05-11 22:57:16 -04001305 p->lineno = lineno;
1306 p->col_offset = col_offset;
1307 return p;
1308}
1309
1310stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001311ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
INADA Naokicb41b272017-02-23 00:31:59 +09001312 body, asdl_seq * decorator_list, string docstring, int lineno, int
1313 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001315 stmt_ty p;
1316 if (!name) {
1317 PyErr_SetString(PyExc_ValueError,
1318 "field name is required for ClassDef");
1319 return NULL;
1320 }
1321 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1322 if (!p)
1323 return NULL;
1324 p->kind = ClassDef_kind;
1325 p->v.ClassDef.name = name;
1326 p->v.ClassDef.bases = bases;
1327 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001328 p->v.ClassDef.body = body;
1329 p->v.ClassDef.decorator_list = decorator_list;
INADA Naokicb41b272017-02-23 00:31:59 +09001330 p->v.ClassDef.docstring = docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001331 p->lineno = lineno;
1332 p->col_offset = col_offset;
1333 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334}
1335
1336stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001337Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001339 stmt_ty p;
1340 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1341 if (!p)
1342 return NULL;
1343 p->kind = Return_kind;
1344 p->v.Return.value = value;
1345 p->lineno = lineno;
1346 p->col_offset = col_offset;
1347 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348}
1349
1350stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001351Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001353 stmt_ty p;
1354 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1355 if (!p)
1356 return NULL;
1357 p->kind = Delete_kind;
1358 p->v.Delete.targets = targets;
1359 p->lineno = lineno;
1360 p->col_offset = col_offset;
1361 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362}
1363
1364stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001365Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1366 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001368 stmt_ty p;
1369 if (!value) {
1370 PyErr_SetString(PyExc_ValueError,
1371 "field value is required for Assign");
1372 return NULL;
1373 }
1374 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1375 if (!p)
1376 return NULL;
1377 p->kind = Assign_kind;
1378 p->v.Assign.targets = targets;
1379 p->v.Assign.value = value;
1380 p->lineno = lineno;
1381 p->col_offset = col_offset;
1382 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383}
1384
1385stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001386AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1387 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001389 stmt_ty p;
1390 if (!target) {
1391 PyErr_SetString(PyExc_ValueError,
1392 "field target is required for AugAssign");
1393 return NULL;
1394 }
1395 if (!op) {
1396 PyErr_SetString(PyExc_ValueError,
1397 "field op is required for AugAssign");
1398 return NULL;
1399 }
1400 if (!value) {
1401 PyErr_SetString(PyExc_ValueError,
1402 "field value is required for AugAssign");
1403 return NULL;
1404 }
1405 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1406 if (!p)
1407 return NULL;
1408 p->kind = AugAssign_kind;
1409 p->v.AugAssign.target = target;
1410 p->v.AugAssign.op = op;
1411 p->v.AugAssign.value = value;
1412 p->lineno = lineno;
1413 p->col_offset = col_offset;
1414 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415}
1416
1417stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001418AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
1419 lineno, int col_offset, PyArena *arena)
1420{
1421 stmt_ty p;
1422 if (!target) {
1423 PyErr_SetString(PyExc_ValueError,
1424 "field target is required for AnnAssign");
1425 return NULL;
1426 }
1427 if (!annotation) {
1428 PyErr_SetString(PyExc_ValueError,
1429 "field annotation is required for AnnAssign");
1430 return NULL;
1431 }
1432 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1433 if (!p)
1434 return NULL;
1435 p->kind = AnnAssign_kind;
1436 p->v.AnnAssign.target = target;
1437 p->v.AnnAssign.annotation = annotation;
1438 p->v.AnnAssign.value = value;
1439 p->v.AnnAssign.simple = simple;
1440 p->lineno = lineno;
1441 p->col_offset = col_offset;
1442 return p;
1443}
1444
1445stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001447 lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001449 stmt_ty p;
1450 if (!target) {
1451 PyErr_SetString(PyExc_ValueError,
1452 "field target is required for For");
1453 return NULL;
1454 }
1455 if (!iter) {
1456 PyErr_SetString(PyExc_ValueError,
1457 "field iter is required for For");
1458 return NULL;
1459 }
1460 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1461 if (!p)
1462 return NULL;
1463 p->kind = For_kind;
1464 p->v.For.target = target;
1465 p->v.For.iter = iter;
1466 p->v.For.body = body;
1467 p->v.For.orelse = orelse;
1468 p->lineno = lineno;
1469 p->col_offset = col_offset;
1470 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471}
1472
1473stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001474AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
1475 lineno, int col_offset, PyArena *arena)
1476{
1477 stmt_ty p;
1478 if (!target) {
1479 PyErr_SetString(PyExc_ValueError,
1480 "field target is required for AsyncFor");
1481 return NULL;
1482 }
1483 if (!iter) {
1484 PyErr_SetString(PyExc_ValueError,
1485 "field iter is required for AsyncFor");
1486 return NULL;
1487 }
1488 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1489 if (!p)
1490 return NULL;
1491 p->kind = AsyncFor_kind;
1492 p->v.AsyncFor.target = target;
1493 p->v.AsyncFor.iter = iter;
1494 p->v.AsyncFor.body = body;
1495 p->v.AsyncFor.orelse = orelse;
1496 p->lineno = lineno;
1497 p->col_offset = col_offset;
1498 return p;
1499}
1500
1501stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001502While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1503 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001505 stmt_ty p;
1506 if (!test) {
1507 PyErr_SetString(PyExc_ValueError,
1508 "field test is required for While");
1509 return NULL;
1510 }
1511 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1512 if (!p)
1513 return NULL;
1514 p->kind = While_kind;
1515 p->v.While.test = test;
1516 p->v.While.body = body;
1517 p->v.While.orelse = orelse;
1518 p->lineno = lineno;
1519 p->col_offset = col_offset;
1520 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521}
1522
1523stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001524If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1525 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001527 stmt_ty p;
1528 if (!test) {
1529 PyErr_SetString(PyExc_ValueError,
1530 "field test is required for If");
1531 return NULL;
1532 }
1533 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1534 if (!p)
1535 return NULL;
1536 p->kind = If_kind;
1537 p->v.If.test = test;
1538 p->v.If.body = body;
1539 p->v.If.orelse = orelse;
1540 p->lineno = lineno;
1541 p->col_offset = col_offset;
1542 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543}
1544
1545stmt_ty
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001546With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
1547 *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001548{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001549 stmt_ty p;
1550 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1551 if (!p)
1552 return NULL;
1553 p->kind = With_kind;
1554 p->v.With.items = items;
1555 p->v.With.body = body;
1556 p->lineno = lineno;
1557 p->col_offset = col_offset;
1558 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001559}
1560
1561stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001562AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset,
1563 PyArena *arena)
1564{
1565 stmt_ty p;
1566 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1567 if (!p)
1568 return NULL;
1569 p->kind = AsyncWith_kind;
1570 p->v.AsyncWith.items = items;
1571 p->v.AsyncWith.body = body;
1572 p->lineno = lineno;
1573 p->col_offset = col_offset;
1574 return p;
1575}
1576
1577stmt_ty
Collin Winter828f04a2007-08-31 00:04:24 +00001578Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001580 stmt_ty p;
1581 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1582 if (!p)
1583 return NULL;
1584 p->kind = Raise_kind;
1585 p->v.Raise.exc = exc;
1586 p->v.Raise.cause = cause;
1587 p->lineno = lineno;
1588 p->col_offset = col_offset;
1589 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590}
1591
1592stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001593Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
1594 finalbody, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001596 stmt_ty p;
1597 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1598 if (!p)
1599 return NULL;
1600 p->kind = Try_kind;
1601 p->v.Try.body = body;
1602 p->v.Try.handlers = handlers;
1603 p->v.Try.orelse = orelse;
1604 p->v.Try.finalbody = finalbody;
1605 p->lineno = lineno;
1606 p->col_offset = col_offset;
1607 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001608}
1609
1610stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001611Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001612{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001613 stmt_ty p;
1614 if (!test) {
1615 PyErr_SetString(PyExc_ValueError,
1616 "field test is required for Assert");
1617 return NULL;
1618 }
1619 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1620 if (!p)
1621 return NULL;
1622 p->kind = Assert_kind;
1623 p->v.Assert.test = test;
1624 p->v.Assert.msg = msg;
1625 p->lineno = lineno;
1626 p->col_offset = col_offset;
1627 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001628}
1629
1630stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001631Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001632{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001633 stmt_ty p;
1634 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1635 if (!p)
1636 return NULL;
1637 p->kind = Import_kind;
1638 p->v.Import.names = names;
1639 p->lineno = lineno;
1640 p->col_offset = col_offset;
1641 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001642}
1643
1644stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001645ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1646 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001648 stmt_ty p;
1649 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1650 if (!p)
1651 return NULL;
1652 p->kind = ImportFrom_kind;
1653 p->v.ImportFrom.module = module;
1654 p->v.ImportFrom.names = names;
1655 p->v.ImportFrom.level = level;
1656 p->lineno = lineno;
1657 p->col_offset = col_offset;
1658 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001659}
1660
1661stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001662Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001664 stmt_ty p;
1665 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1666 if (!p)
1667 return NULL;
1668 p->kind = Global_kind;
1669 p->v.Global.names = names;
1670 p->lineno = lineno;
1671 p->col_offset = col_offset;
1672 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673}
1674
1675stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00001676Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1677{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001678 stmt_ty p;
1679 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1680 if (!p)
1681 return NULL;
1682 p->kind = Nonlocal_kind;
1683 p->v.Nonlocal.names = names;
1684 p->lineno = lineno;
1685 p->col_offset = col_offset;
1686 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001687}
1688
1689stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001690Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001692 stmt_ty p;
1693 if (!value) {
1694 PyErr_SetString(PyExc_ValueError,
1695 "field value is required for Expr");
1696 return NULL;
1697 }
1698 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1699 if (!p)
1700 return NULL;
1701 p->kind = Expr_kind;
1702 p->v.Expr.value = value;
1703 p->lineno = lineno;
1704 p->col_offset = col_offset;
1705 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706}
1707
1708stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001709Pass(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001711 stmt_ty p;
1712 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1713 if (!p)
1714 return NULL;
1715 p->kind = Pass_kind;
1716 p->lineno = lineno;
1717 p->col_offset = col_offset;
1718 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719}
1720
1721stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001722Break(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001724 stmt_ty p;
1725 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1726 if (!p)
1727 return NULL;
1728 p->kind = Break_kind;
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 +00001735Continue(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 = Continue_kind;
1742 p->lineno = lineno;
1743 p->col_offset = col_offset;
1744 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745}
1746
1747expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001748BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1749 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001751 expr_ty p;
1752 if (!op) {
1753 PyErr_SetString(PyExc_ValueError,
1754 "field op is required for BoolOp");
1755 return NULL;
1756 }
1757 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1758 if (!p)
1759 return NULL;
1760 p->kind = BoolOp_kind;
1761 p->v.BoolOp.op = op;
1762 p->v.BoolOp.values = values;
1763 p->lineno = lineno;
1764 p->col_offset = col_offset;
1765 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766}
1767
1768expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001769BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1770 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001772 expr_ty p;
1773 if (!left) {
1774 PyErr_SetString(PyExc_ValueError,
1775 "field left is required for BinOp");
1776 return NULL;
1777 }
1778 if (!op) {
1779 PyErr_SetString(PyExc_ValueError,
1780 "field op is required for BinOp");
1781 return NULL;
1782 }
1783 if (!right) {
1784 PyErr_SetString(PyExc_ValueError,
1785 "field right is required for BinOp");
1786 return NULL;
1787 }
1788 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1789 if (!p)
1790 return NULL;
1791 p->kind = BinOp_kind;
1792 p->v.BinOp.left = left;
1793 p->v.BinOp.op = op;
1794 p->v.BinOp.right = right;
1795 p->lineno = lineno;
1796 p->col_offset = col_offset;
1797 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798}
1799
1800expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001801UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1802 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001804 expr_ty p;
1805 if (!op) {
1806 PyErr_SetString(PyExc_ValueError,
1807 "field op is required for UnaryOp");
1808 return NULL;
1809 }
1810 if (!operand) {
1811 PyErr_SetString(PyExc_ValueError,
1812 "field operand is required for UnaryOp");
1813 return NULL;
1814 }
1815 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1816 if (!p)
1817 return NULL;
1818 p->kind = UnaryOp_kind;
1819 p->v.UnaryOp.op = op;
1820 p->v.UnaryOp.operand = operand;
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 +00001827Lambda(arguments_ty args, expr_ty body, 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 (!args) {
1832 PyErr_SetString(PyExc_ValueError,
1833 "field args is required for Lambda");
1834 return NULL;
1835 }
1836 if (!body) {
1837 PyErr_SetString(PyExc_ValueError,
1838 "field body is required for Lambda");
1839 return NULL;
1840 }
1841 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1842 if (!p)
1843 return NULL;
1844 p->kind = Lambda_kind;
1845 p->v.Lambda.args = args;
1846 p->v.Lambda.body = body;
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 +00001853IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1854 PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001855{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001856 expr_ty p;
1857 if (!test) {
1858 PyErr_SetString(PyExc_ValueError,
1859 "field test is required for IfExp");
1860 return NULL;
1861 }
1862 if (!body) {
1863 PyErr_SetString(PyExc_ValueError,
1864 "field body is required for IfExp");
1865 return NULL;
1866 }
1867 if (!orelse) {
1868 PyErr_SetString(PyExc_ValueError,
1869 "field orelse is required for IfExp");
1870 return NULL;
1871 }
1872 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1873 if (!p)
1874 return NULL;
1875 p->kind = IfExp_kind;
1876 p->v.IfExp.test = test;
1877 p->v.IfExp.body = body;
1878 p->v.IfExp.orelse = orelse;
1879 p->lineno = lineno;
1880 p->col_offset = col_offset;
1881 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001882}
1883
1884expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001885Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1886 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001888 expr_ty p;
1889 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1890 if (!p)
1891 return NULL;
1892 p->kind = Dict_kind;
1893 p->v.Dict.keys = keys;
1894 p->v.Dict.values = values;
1895 p->lineno = lineno;
1896 p->col_offset = col_offset;
1897 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898}
1899
1900expr_ty
Guido van Rossum86e58e22006-08-28 15:27:34 +00001901Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1902{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001903 expr_ty p;
1904 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1905 if (!p)
1906 return NULL;
1907 p->kind = Set_kind;
1908 p->v.Set.elts = elts;
1909 p->lineno = lineno;
1910 p->col_offset = col_offset;
1911 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001912}
1913
1914expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001915ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1916 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001918 expr_ty p;
1919 if (!elt) {
1920 PyErr_SetString(PyExc_ValueError,
1921 "field elt is required for ListComp");
1922 return NULL;
1923 }
1924 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1925 if (!p)
1926 return NULL;
1927 p->kind = ListComp_kind;
1928 p->v.ListComp.elt = elt;
1929 p->v.ListComp.generators = generators;
1930 p->lineno = lineno;
1931 p->col_offset = col_offset;
1932 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933}
1934
1935expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001936SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1937 *arena)
1938{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001939 expr_ty p;
1940 if (!elt) {
1941 PyErr_SetString(PyExc_ValueError,
1942 "field elt is required for SetComp");
1943 return NULL;
1944 }
1945 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1946 if (!p)
1947 return NULL;
1948 p->kind = SetComp_kind;
1949 p->v.SetComp.elt = elt;
1950 p->v.SetComp.generators = generators;
1951 p->lineno = lineno;
1952 p->col_offset = col_offset;
1953 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001954}
1955
1956expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001957DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1958 col_offset, PyArena *arena)
1959{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001960 expr_ty p;
1961 if (!key) {
1962 PyErr_SetString(PyExc_ValueError,
1963 "field key is required for DictComp");
1964 return NULL;
1965 }
1966 if (!value) {
1967 PyErr_SetString(PyExc_ValueError,
1968 "field value is required for DictComp");
1969 return NULL;
1970 }
1971 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1972 if (!p)
1973 return NULL;
1974 p->kind = DictComp_kind;
1975 p->v.DictComp.key = key;
1976 p->v.DictComp.value = value;
1977 p->v.DictComp.generators = generators;
1978 p->lineno = lineno;
1979 p->col_offset = col_offset;
1980 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001981}
1982
1983expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001984GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1985 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001987 expr_ty p;
1988 if (!elt) {
1989 PyErr_SetString(PyExc_ValueError,
1990 "field elt is required for GeneratorExp");
1991 return NULL;
1992 }
1993 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1994 if (!p)
1995 return NULL;
1996 p->kind = GeneratorExp_kind;
1997 p->v.GeneratorExp.elt = elt;
1998 p->v.GeneratorExp.generators = generators;
1999 p->lineno = lineno;
2000 p->col_offset = col_offset;
2001 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002}
2003
2004expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04002005Await(expr_ty value, int lineno, int col_offset, PyArena *arena)
2006{
2007 expr_ty p;
2008 if (!value) {
2009 PyErr_SetString(PyExc_ValueError,
2010 "field value is required for Await");
2011 return NULL;
2012 }
2013 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2014 if (!p)
2015 return NULL;
2016 p->kind = Await_kind;
2017 p->v.Await.value = value;
2018 p->lineno = lineno;
2019 p->col_offset = col_offset;
2020 return p;
2021}
2022
2023expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002024Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002026 expr_ty p;
2027 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2028 if (!p)
2029 return NULL;
2030 p->kind = Yield_kind;
2031 p->v.Yield.value = value;
2032 p->lineno = lineno;
2033 p->col_offset = col_offset;
2034 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035}
2036
2037expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05002038YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena)
2039{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002040 expr_ty p;
2041 if (!value) {
2042 PyErr_SetString(PyExc_ValueError,
2043 "field value is required for YieldFrom");
2044 return NULL;
2045 }
2046 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2047 if (!p)
2048 return NULL;
2049 p->kind = YieldFrom_kind;
2050 p->v.YieldFrom.value = value;
2051 p->lineno = lineno;
2052 p->col_offset = col_offset;
2053 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002054}
2055
2056expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002057Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
2058 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002060 expr_ty p;
2061 if (!left) {
2062 PyErr_SetString(PyExc_ValueError,
2063 "field left is required for Compare");
2064 return NULL;
2065 }
2066 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2067 if (!p)
2068 return NULL;
2069 p->kind = Compare_kind;
2070 p->v.Compare.left = left;
2071 p->v.Compare.ops = ops;
2072 p->v.Compare.comparators = comparators;
2073 p->lineno = lineno;
2074 p->col_offset = col_offset;
2075 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076}
2077
2078expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002079Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
2080 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002082 expr_ty p;
2083 if (!func) {
2084 PyErr_SetString(PyExc_ValueError,
2085 "field func is required for Call");
2086 return NULL;
2087 }
2088 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2089 if (!p)
2090 return NULL;
2091 p->kind = Call_kind;
2092 p->v.Call.func = func;
2093 p->v.Call.args = args;
2094 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002095 p->lineno = lineno;
2096 p->col_offset = col_offset;
2097 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098}
2099
2100expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002101Num(object n, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002103 expr_ty p;
2104 if (!n) {
2105 PyErr_SetString(PyExc_ValueError,
2106 "field n is required for Num");
2107 return NULL;
2108 }
2109 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2110 if (!p)
2111 return NULL;
2112 p->kind = Num_kind;
2113 p->v.Num.n = n;
2114 p->lineno = lineno;
2115 p->col_offset = col_offset;
2116 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117}
2118
2119expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002120Str(string s, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002122 expr_ty p;
2123 if (!s) {
2124 PyErr_SetString(PyExc_ValueError,
2125 "field s is required for Str");
2126 return NULL;
2127 }
2128 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2129 if (!p)
2130 return NULL;
2131 p->kind = Str_kind;
2132 p->v.Str.s = s;
2133 p->lineno = lineno;
2134 p->col_offset = col_offset;
2135 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136}
2137
2138expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002139FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
2140 int col_offset, PyArena *arena)
2141{
2142 expr_ty p;
2143 if (!value) {
2144 PyErr_SetString(PyExc_ValueError,
2145 "field value is required for FormattedValue");
2146 return NULL;
2147 }
2148 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2149 if (!p)
2150 return NULL;
2151 p->kind = FormattedValue_kind;
2152 p->v.FormattedValue.value = value;
2153 p->v.FormattedValue.conversion = conversion;
2154 p->v.FormattedValue.format_spec = format_spec;
2155 p->lineno = lineno;
2156 p->col_offset = col_offset;
2157 return p;
2158}
2159
2160expr_ty
2161JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena *arena)
2162{
2163 expr_ty p;
2164 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2165 if (!p)
2166 return NULL;
2167 p->kind = JoinedStr_kind;
2168 p->v.JoinedStr.values = values;
2169 p->lineno = lineno;
2170 p->col_offset = col_offset;
2171 return p;
2172}
2173
2174expr_ty
Benjamin Petersone2498412011-08-09 16:08:39 -05002175Bytes(bytes s, int lineno, int col_offset, PyArena *arena)
Thomas Wouters00e41de2007-02-23 19:56:57 +00002176{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002177 expr_ty p;
2178 if (!s) {
2179 PyErr_SetString(PyExc_ValueError,
2180 "field s is required for Bytes");
2181 return NULL;
2182 }
2183 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2184 if (!p)
2185 return NULL;
2186 p->kind = Bytes_kind;
2187 p->v.Bytes.s = s;
2188 p->lineno = lineno;
2189 p->col_offset = col_offset;
2190 return p;
Thomas Wouters00e41de2007-02-23 19:56:57 +00002191}
2192
2193expr_ty
Benjamin Peterson442f2092012-12-06 17:41:04 -05002194NameConstant(singleton value, int lineno, int col_offset, PyArena *arena)
2195{
Victor Stinneree4b59c2013-07-27 00:01:35 +02002196 expr_ty p;
2197 if (!value) {
2198 PyErr_SetString(PyExc_ValueError,
2199 "field value is required for NameConstant");
2200 return NULL;
2201 }
2202 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2203 if (!p)
2204 return NULL;
2205 p->kind = NameConstant_kind;
2206 p->v.NameConstant.value = value;
2207 p->lineno = lineno;
2208 p->col_offset = col_offset;
2209 return p;
Benjamin Peterson442f2092012-12-06 17:41:04 -05002210}
2211
2212expr_ty
Georg Brandl52318d62006-09-06 07:06:08 +00002213Ellipsis(int lineno, int col_offset, PyArena *arena)
2214{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002215 expr_ty p;
2216 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2217 if (!p)
2218 return NULL;
2219 p->kind = Ellipsis_kind;
2220 p->lineno = lineno;
2221 p->col_offset = col_offset;
2222 return p;
Georg Brandl52318d62006-09-06 07:06:08 +00002223}
2224
2225expr_ty
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002226Constant(constant value, int lineno, int col_offset, PyArena *arena)
2227{
2228 expr_ty p;
2229 if (!value) {
2230 PyErr_SetString(PyExc_ValueError,
2231 "field value is required for Constant");
2232 return NULL;
2233 }
2234 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2235 if (!p)
2236 return NULL;
2237 p->kind = Constant_kind;
2238 p->v.Constant.value = value;
2239 p->lineno = lineno;
2240 p->col_offset = col_offset;
2241 return p;
2242}
2243
2244expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002245Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
2246 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002248 expr_ty p;
2249 if (!value) {
2250 PyErr_SetString(PyExc_ValueError,
2251 "field value is required for Attribute");
2252 return NULL;
2253 }
2254 if (!attr) {
2255 PyErr_SetString(PyExc_ValueError,
2256 "field attr is required for Attribute");
2257 return NULL;
2258 }
2259 if (!ctx) {
2260 PyErr_SetString(PyExc_ValueError,
2261 "field ctx is required for Attribute");
2262 return NULL;
2263 }
2264 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2265 if (!p)
2266 return NULL;
2267 p->kind = Attribute_kind;
2268 p->v.Attribute.value = value;
2269 p->v.Attribute.attr = attr;
2270 p->v.Attribute.ctx = ctx;
2271 p->lineno = lineno;
2272 p->col_offset = col_offset;
2273 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274}
2275
2276expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002277Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
2278 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002280 expr_ty p;
2281 if (!value) {
2282 PyErr_SetString(PyExc_ValueError,
2283 "field value is required for Subscript");
2284 return NULL;
2285 }
2286 if (!slice) {
2287 PyErr_SetString(PyExc_ValueError,
2288 "field slice is required for Subscript");
2289 return NULL;
2290 }
2291 if (!ctx) {
2292 PyErr_SetString(PyExc_ValueError,
2293 "field ctx is required for Subscript");
2294 return NULL;
2295 }
2296 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2297 if (!p)
2298 return NULL;
2299 p->kind = Subscript_kind;
2300 p->v.Subscript.value = value;
2301 p->v.Subscript.slice = slice;
2302 p->v.Subscript.ctx = ctx;
2303 p->lineno = lineno;
2304 p->col_offset = col_offset;
2305 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306}
2307
2308expr_ty
Guido van Rossum0368b722007-05-11 16:50:42 +00002309Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
2310 *arena)
2311{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002312 expr_ty p;
2313 if (!value) {
2314 PyErr_SetString(PyExc_ValueError,
2315 "field value is required for Starred");
2316 return NULL;
2317 }
2318 if (!ctx) {
2319 PyErr_SetString(PyExc_ValueError,
2320 "field ctx is required for Starred");
2321 return NULL;
2322 }
2323 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2324 if (!p)
2325 return NULL;
2326 p->kind = Starred_kind;
2327 p->v.Starred.value = value;
2328 p->v.Starred.ctx = ctx;
2329 p->lineno = lineno;
2330 p->col_offset = col_offset;
2331 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002332}
2333
2334expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002335Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
2336 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002338 expr_ty p;
2339 if (!id) {
2340 PyErr_SetString(PyExc_ValueError,
2341 "field id is required for Name");
2342 return NULL;
2343 }
2344 if (!ctx) {
2345 PyErr_SetString(PyExc_ValueError,
2346 "field ctx is required for Name");
2347 return NULL;
2348 }
2349 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2350 if (!p)
2351 return NULL;
2352 p->kind = Name_kind;
2353 p->v.Name.id = id;
2354 p->v.Name.ctx = ctx;
2355 p->lineno = lineno;
2356 p->col_offset = col_offset;
2357 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358}
2359
2360expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002361List(asdl_seq * elts, 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 (!ctx) {
2366 PyErr_SetString(PyExc_ValueError,
2367 "field ctx is required for List");
2368 return NULL;
2369 }
2370 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2371 if (!p)
2372 return NULL;
2373 p->kind = List_kind;
2374 p->v.List.elts = elts;
2375 p->v.List.ctx = ctx;
2376 p->lineno = lineno;
2377 p->col_offset = col_offset;
2378 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379}
2380
2381expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002382Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2383 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002385 expr_ty p;
2386 if (!ctx) {
2387 PyErr_SetString(PyExc_ValueError,
2388 "field ctx is required for Tuple");
2389 return NULL;
2390 }
2391 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2392 if (!p)
2393 return NULL;
2394 p->kind = Tuple_kind;
2395 p->v.Tuple.elts = elts;
2396 p->v.Tuple.ctx = ctx;
2397 p->lineno = lineno;
2398 p->col_offset = col_offset;
2399 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400}
2401
2402slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002403Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002405 slice_ty p;
2406 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2407 if (!p)
2408 return NULL;
2409 p->kind = Slice_kind;
2410 p->v.Slice.lower = lower;
2411 p->v.Slice.upper = upper;
2412 p->v.Slice.step = step;
2413 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414}
2415
2416slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002417ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002419 slice_ty p;
2420 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2421 if (!p)
2422 return NULL;
2423 p->kind = ExtSlice_kind;
2424 p->v.ExtSlice.dims = dims;
2425 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426}
2427
2428slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002429Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002431 slice_ty p;
2432 if (!value) {
2433 PyErr_SetString(PyExc_ValueError,
2434 "field value is required for Index");
2435 return NULL;
2436 }
2437 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2438 if (!p)
2439 return NULL;
2440 p->kind = Index_kind;
2441 p->v.Index.value = value;
2442 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443}
2444
2445comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002446comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2447 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002449 comprehension_ty p;
2450 if (!target) {
2451 PyErr_SetString(PyExc_ValueError,
2452 "field target is required for comprehension");
2453 return NULL;
2454 }
2455 if (!iter) {
2456 PyErr_SetString(PyExc_ValueError,
2457 "field iter is required for comprehension");
2458 return NULL;
2459 }
2460 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2461 if (!p)
2462 return NULL;
2463 p->target = target;
2464 p->iter = iter;
2465 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002466 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002467 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468}
2469
2470excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002471ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002472 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002474 excepthandler_ty p;
2475 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2476 if (!p)
2477 return NULL;
2478 p->kind = ExceptHandler_kind;
2479 p->v.ExceptHandler.type = type;
2480 p->v.ExceptHandler.name = name;
2481 p->v.ExceptHandler.body = body;
2482 p->lineno = lineno;
2483 p->col_offset = col_offset;
2484 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485}
2486
2487arguments_ty
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002488arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
2489 kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002491 arguments_ty p;
2492 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2493 if (!p)
2494 return NULL;
2495 p->args = args;
2496 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002497 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002498 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002499 p->kwarg = kwarg;
2500 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002501 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502}
2503
Neal Norwitzc1505362006-12-28 06:47:50 +00002504arg_ty
Victor Stinnerc106c682015-11-06 17:01:48 +01002505arg(identifier arg, expr_ty annotation, int lineno, int col_offset, PyArena
2506 *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002507{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002508 arg_ty p;
2509 if (!arg) {
2510 PyErr_SetString(PyExc_ValueError,
2511 "field arg is required for arg");
2512 return NULL;
2513 }
2514 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2515 if (!p)
2516 return NULL;
2517 p->arg = arg;
2518 p->annotation = annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01002519 p->lineno = lineno;
2520 p->col_offset = col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002521 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002522}
2523
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002525keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002527 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002528 if (!value) {
2529 PyErr_SetString(PyExc_ValueError,
2530 "field value is required for keyword");
2531 return NULL;
2532 }
2533 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2534 if (!p)
2535 return NULL;
2536 p->arg = arg;
2537 p->value = value;
2538 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539}
2540
2541alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002542alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002544 alias_ty p;
2545 if (!name) {
2546 PyErr_SetString(PyExc_ValueError,
2547 "field name is required for alias");
2548 return NULL;
2549 }
2550 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2551 if (!p)
2552 return NULL;
2553 p->name = name;
2554 p->asname = asname;
2555 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556}
2557
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002558withitem_ty
2559withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2560{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002561 withitem_ty p;
2562 if (!context_expr) {
2563 PyErr_SetString(PyExc_ValueError,
2564 "field context_expr is required for withitem");
2565 return NULL;
2566 }
2567 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2568 if (!p)
2569 return NULL;
2570 p->context_expr = context_expr;
2571 p->optional_vars = optional_vars;
2572 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002573}
2574
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002575
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002576PyObject*
2577ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002578{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002579 mod_ty o = (mod_ty)_o;
2580 PyObject *result = NULL, *value = NULL;
2581 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002582 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002583 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002584
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002585 switch (o->kind) {
2586 case Module_kind:
2587 result = PyType_GenericNew(Module_type, NULL, NULL);
2588 if (!result) goto failed;
2589 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2590 if (!value) goto failed;
2591 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2592 goto failed;
2593 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002594 value = ast2obj_string(o->v.Module.docstring);
2595 if (!value) goto failed;
2596 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2597 goto failed;
2598 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002599 break;
2600 case Interactive_kind:
2601 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2602 if (!result) goto failed;
2603 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2604 if (!value) goto failed;
2605 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2606 goto failed;
2607 Py_DECREF(value);
2608 break;
2609 case Expression_kind:
2610 result = PyType_GenericNew(Expression_type, NULL, NULL);
2611 if (!result) goto failed;
2612 value = ast2obj_expr(o->v.Expression.body);
2613 if (!value) goto failed;
2614 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2615 goto failed;
2616 Py_DECREF(value);
2617 break;
2618 case Suite_kind:
2619 result = PyType_GenericNew(Suite_type, NULL, NULL);
2620 if (!result) goto failed;
2621 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2622 if (!value) goto failed;
2623 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2624 goto failed;
2625 Py_DECREF(value);
2626 break;
2627 }
2628 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002629failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002630 Py_XDECREF(value);
2631 Py_XDECREF(result);
2632 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633}
2634
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002635PyObject*
2636ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002638 stmt_ty o = (stmt_ty)_o;
2639 PyObject *result = NULL, *value = NULL;
2640 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002641 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002642 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002643
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002644 switch (o->kind) {
2645 case FunctionDef_kind:
2646 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2647 if (!result) goto failed;
2648 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002649 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002650 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2651 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002652 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002653 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002654 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002655 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2656 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002657 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002658 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2659 if (!value) goto failed;
2660 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2661 goto failed;
2662 Py_DECREF(value);
2663 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2664 if (!value) goto failed;
2665 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2666 goto failed;
2667 Py_DECREF(value);
2668 value = ast2obj_expr(o->v.FunctionDef.returns);
2669 if (!value) goto failed;
2670 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2671 goto failed;
2672 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002673 value = ast2obj_string(o->v.FunctionDef.docstring);
2674 if (!value) goto failed;
2675 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2676 goto failed;
2677 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002678 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002679 case AsyncFunctionDef_kind:
2680 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2681 if (!result) goto failed;
2682 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2683 if (!value) goto failed;
2684 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2685 goto failed;
2686 Py_DECREF(value);
2687 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2688 if (!value) goto failed;
2689 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2690 goto failed;
2691 Py_DECREF(value);
2692 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2693 if (!value) goto failed;
2694 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2695 goto failed;
2696 Py_DECREF(value);
2697 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2698 ast2obj_expr);
2699 if (!value) goto failed;
2700 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2701 goto failed;
2702 Py_DECREF(value);
2703 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2704 if (!value) goto failed;
2705 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2706 goto failed;
2707 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002708 value = ast2obj_string(o->v.AsyncFunctionDef.docstring);
2709 if (!value) goto failed;
2710 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2711 goto failed;
2712 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002713 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002714 case ClassDef_kind:
2715 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2716 if (!result) goto failed;
2717 value = ast2obj_identifier(o->v.ClassDef.name);
2718 if (!value) goto failed;
2719 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2720 goto failed;
2721 Py_DECREF(value);
2722 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2723 if (!value) goto failed;
2724 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2725 goto failed;
2726 Py_DECREF(value);
2727 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2728 if (!value) goto failed;
2729 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2730 goto failed;
2731 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002732 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2733 if (!value) goto failed;
2734 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2735 goto failed;
2736 Py_DECREF(value);
2737 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2738 if (!value) goto failed;
2739 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2740 goto failed;
2741 Py_DECREF(value);
INADA Naokicb41b272017-02-23 00:31:59 +09002742 value = ast2obj_string(o->v.ClassDef.docstring);
2743 if (!value) goto failed;
2744 if (_PyObject_SetAttrId(result, &PyId_docstring, value) == -1)
2745 goto failed;
2746 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002747 break;
2748 case Return_kind:
2749 result = PyType_GenericNew(Return_type, NULL, NULL);
2750 if (!result) goto failed;
2751 value = ast2obj_expr(o->v.Return.value);
2752 if (!value) goto failed;
2753 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2754 goto failed;
2755 Py_DECREF(value);
2756 break;
2757 case Delete_kind:
2758 result = PyType_GenericNew(Delete_type, NULL, NULL);
2759 if (!result) goto failed;
2760 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2761 if (!value) goto failed;
2762 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2763 goto failed;
2764 Py_DECREF(value);
2765 break;
2766 case Assign_kind:
2767 result = PyType_GenericNew(Assign_type, NULL, NULL);
2768 if (!result) goto failed;
2769 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2770 if (!value) goto failed;
2771 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2772 goto failed;
2773 Py_DECREF(value);
2774 value = ast2obj_expr(o->v.Assign.value);
2775 if (!value) goto failed;
2776 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2777 goto failed;
2778 Py_DECREF(value);
2779 break;
2780 case AugAssign_kind:
2781 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2782 if (!result) goto failed;
2783 value = ast2obj_expr(o->v.AugAssign.target);
2784 if (!value) goto failed;
2785 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2786 goto failed;
2787 Py_DECREF(value);
2788 value = ast2obj_operator(o->v.AugAssign.op);
2789 if (!value) goto failed;
2790 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2791 goto failed;
2792 Py_DECREF(value);
2793 value = ast2obj_expr(o->v.AugAssign.value);
2794 if (!value) goto failed;
2795 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2796 goto failed;
2797 Py_DECREF(value);
2798 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002799 case AnnAssign_kind:
2800 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2801 if (!result) goto failed;
2802 value = ast2obj_expr(o->v.AnnAssign.target);
2803 if (!value) goto failed;
2804 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2805 goto failed;
2806 Py_DECREF(value);
2807 value = ast2obj_expr(o->v.AnnAssign.annotation);
2808 if (!value) goto failed;
2809 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2810 goto failed;
2811 Py_DECREF(value);
2812 value = ast2obj_expr(o->v.AnnAssign.value);
2813 if (!value) goto failed;
2814 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2815 goto failed;
2816 Py_DECREF(value);
2817 value = ast2obj_int(o->v.AnnAssign.simple);
2818 if (!value) goto failed;
2819 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2820 goto failed;
2821 Py_DECREF(value);
2822 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002823 case For_kind:
2824 result = PyType_GenericNew(For_type, NULL, NULL);
2825 if (!result) goto failed;
2826 value = ast2obj_expr(o->v.For.target);
2827 if (!value) goto failed;
2828 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2829 goto failed;
2830 Py_DECREF(value);
2831 value = ast2obj_expr(o->v.For.iter);
2832 if (!value) goto failed;
2833 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2834 goto failed;
2835 Py_DECREF(value);
2836 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2837 if (!value) goto failed;
2838 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2839 goto failed;
2840 Py_DECREF(value);
2841 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2842 if (!value) goto failed;
2843 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2844 goto failed;
2845 Py_DECREF(value);
2846 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002847 case AsyncFor_kind:
2848 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2849 if (!result) goto failed;
2850 value = ast2obj_expr(o->v.AsyncFor.target);
2851 if (!value) goto failed;
2852 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2853 goto failed;
2854 Py_DECREF(value);
2855 value = ast2obj_expr(o->v.AsyncFor.iter);
2856 if (!value) goto failed;
2857 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2858 goto failed;
2859 Py_DECREF(value);
2860 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2861 if (!value) goto failed;
2862 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2863 goto failed;
2864 Py_DECREF(value);
2865 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2866 if (!value) goto failed;
2867 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2868 goto failed;
2869 Py_DECREF(value);
2870 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002871 case While_kind:
2872 result = PyType_GenericNew(While_type, NULL, NULL);
2873 if (!result) goto failed;
2874 value = ast2obj_expr(o->v.While.test);
2875 if (!value) goto failed;
2876 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2877 goto failed;
2878 Py_DECREF(value);
2879 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2880 if (!value) goto failed;
2881 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2882 goto failed;
2883 Py_DECREF(value);
2884 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2885 if (!value) goto failed;
2886 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2887 goto failed;
2888 Py_DECREF(value);
2889 break;
2890 case If_kind:
2891 result = PyType_GenericNew(If_type, NULL, NULL);
2892 if (!result) goto failed;
2893 value = ast2obj_expr(o->v.If.test);
2894 if (!value) goto failed;
2895 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2896 goto failed;
2897 Py_DECREF(value);
2898 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2899 if (!value) goto failed;
2900 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2901 goto failed;
2902 Py_DECREF(value);
2903 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2904 if (!value) goto failed;
2905 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2906 goto failed;
2907 Py_DECREF(value);
2908 break;
2909 case With_kind:
2910 result = PyType_GenericNew(With_type, NULL, NULL);
2911 if (!result) goto failed;
2912 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
2913 if (!value) goto failed;
2914 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2915 goto failed;
2916 Py_DECREF(value);
2917 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2918 if (!value) goto failed;
2919 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2920 goto failed;
2921 Py_DECREF(value);
2922 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002923 case AsyncWith_kind:
2924 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
2925 if (!result) goto failed;
2926 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
2927 if (!value) goto failed;
2928 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2929 goto failed;
2930 Py_DECREF(value);
2931 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
2932 if (!value) goto failed;
2933 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2934 goto failed;
2935 Py_DECREF(value);
2936 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002937 case Raise_kind:
2938 result = PyType_GenericNew(Raise_type, NULL, NULL);
2939 if (!result) goto failed;
2940 value = ast2obj_expr(o->v.Raise.exc);
2941 if (!value) goto failed;
2942 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
2943 goto failed;
2944 Py_DECREF(value);
2945 value = ast2obj_expr(o->v.Raise.cause);
2946 if (!value) goto failed;
2947 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
2948 goto failed;
2949 Py_DECREF(value);
2950 break;
2951 case Try_kind:
2952 result = PyType_GenericNew(Try_type, NULL, NULL);
2953 if (!result) goto failed;
2954 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
2955 if (!value) goto failed;
2956 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2957 goto failed;
2958 Py_DECREF(value);
2959 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
2960 if (!value) goto failed;
2961 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
2962 goto failed;
2963 Py_DECREF(value);
2964 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
2965 if (!value) goto failed;
2966 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2967 goto failed;
2968 Py_DECREF(value);
2969 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
2970 if (!value) goto failed;
2971 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
2972 goto failed;
2973 Py_DECREF(value);
2974 break;
2975 case Assert_kind:
2976 result = PyType_GenericNew(Assert_type, NULL, NULL);
2977 if (!result) goto failed;
2978 value = ast2obj_expr(o->v.Assert.test);
2979 if (!value) goto failed;
2980 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2981 goto failed;
2982 Py_DECREF(value);
2983 value = ast2obj_expr(o->v.Assert.msg);
2984 if (!value) goto failed;
2985 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
2986 goto failed;
2987 Py_DECREF(value);
2988 break;
2989 case Import_kind:
2990 result = PyType_GenericNew(Import_type, NULL, NULL);
2991 if (!result) goto failed;
2992 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2993 if (!value) goto failed;
2994 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2995 goto failed;
2996 Py_DECREF(value);
2997 break;
2998 case ImportFrom_kind:
2999 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
3000 if (!result) goto failed;
3001 value = ast2obj_identifier(o->v.ImportFrom.module);
3002 if (!value) goto failed;
3003 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
3004 goto failed;
3005 Py_DECREF(value);
3006 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
3007 if (!value) goto failed;
3008 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3009 goto failed;
3010 Py_DECREF(value);
3011 value = ast2obj_int(o->v.ImportFrom.level);
3012 if (!value) goto failed;
3013 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
3014 goto failed;
3015 Py_DECREF(value);
3016 break;
3017 case Global_kind:
3018 result = PyType_GenericNew(Global_type, NULL, NULL);
3019 if (!result) goto failed;
3020 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
3021 if (!value) goto failed;
3022 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3023 goto failed;
3024 Py_DECREF(value);
3025 break;
3026 case Nonlocal_kind:
3027 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3028 if (!result) goto failed;
3029 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3030 if (!value) goto failed;
3031 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3032 goto failed;
3033 Py_DECREF(value);
3034 break;
3035 case Expr_kind:
3036 result = PyType_GenericNew(Expr_type, NULL, NULL);
3037 if (!result) goto failed;
3038 value = ast2obj_expr(o->v.Expr.value);
3039 if (!value) goto failed;
3040 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3041 goto failed;
3042 Py_DECREF(value);
3043 break;
3044 case Pass_kind:
3045 result = PyType_GenericNew(Pass_type, NULL, NULL);
3046 if (!result) goto failed;
3047 break;
3048 case Break_kind:
3049 result = PyType_GenericNew(Break_type, NULL, NULL);
3050 if (!result) goto failed;
3051 break;
3052 case Continue_kind:
3053 result = PyType_GenericNew(Continue_type, NULL, NULL);
3054 if (!result) goto failed;
3055 break;
3056 }
3057 value = ast2obj_int(o->lineno);
3058 if (!value) goto failed;
3059 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3060 goto failed;
3061 Py_DECREF(value);
3062 value = ast2obj_int(o->col_offset);
3063 if (!value) goto failed;
3064 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3065 goto failed;
3066 Py_DECREF(value);
3067 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003068failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003069 Py_XDECREF(value);
3070 Py_XDECREF(result);
3071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072}
3073
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003074PyObject*
3075ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003077 expr_ty o = (expr_ty)_o;
3078 PyObject *result = NULL, *value = NULL;
3079 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003080 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003081 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003082
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003083 switch (o->kind) {
3084 case BoolOp_kind:
3085 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3086 if (!result) goto failed;
3087 value = ast2obj_boolop(o->v.BoolOp.op);
3088 if (!value) goto failed;
3089 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3090 goto failed;
3091 Py_DECREF(value);
3092 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3093 if (!value) goto failed;
3094 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3095 goto failed;
3096 Py_DECREF(value);
3097 break;
3098 case BinOp_kind:
3099 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3100 if (!result) goto failed;
3101 value = ast2obj_expr(o->v.BinOp.left);
3102 if (!value) goto failed;
3103 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3104 goto failed;
3105 Py_DECREF(value);
3106 value = ast2obj_operator(o->v.BinOp.op);
3107 if (!value) goto failed;
3108 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3109 goto failed;
3110 Py_DECREF(value);
3111 value = ast2obj_expr(o->v.BinOp.right);
3112 if (!value) goto failed;
3113 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3114 goto failed;
3115 Py_DECREF(value);
3116 break;
3117 case UnaryOp_kind:
3118 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3119 if (!result) goto failed;
3120 value = ast2obj_unaryop(o->v.UnaryOp.op);
3121 if (!value) goto failed;
3122 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3123 goto failed;
3124 Py_DECREF(value);
3125 value = ast2obj_expr(o->v.UnaryOp.operand);
3126 if (!value) goto failed;
3127 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3128 goto failed;
3129 Py_DECREF(value);
3130 break;
3131 case Lambda_kind:
3132 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3133 if (!result) goto failed;
3134 value = ast2obj_arguments(o->v.Lambda.args);
3135 if (!value) goto failed;
3136 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3137 goto failed;
3138 Py_DECREF(value);
3139 value = ast2obj_expr(o->v.Lambda.body);
3140 if (!value) goto failed;
3141 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3142 goto failed;
3143 Py_DECREF(value);
3144 break;
3145 case IfExp_kind:
3146 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3147 if (!result) goto failed;
3148 value = ast2obj_expr(o->v.IfExp.test);
3149 if (!value) goto failed;
3150 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3151 goto failed;
3152 Py_DECREF(value);
3153 value = ast2obj_expr(o->v.IfExp.body);
3154 if (!value) goto failed;
3155 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3156 goto failed;
3157 Py_DECREF(value);
3158 value = ast2obj_expr(o->v.IfExp.orelse);
3159 if (!value) goto failed;
3160 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3161 goto failed;
3162 Py_DECREF(value);
3163 break;
3164 case Dict_kind:
3165 result = PyType_GenericNew(Dict_type, NULL, NULL);
3166 if (!result) goto failed;
3167 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3168 if (!value) goto failed;
3169 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3170 goto failed;
3171 Py_DECREF(value);
3172 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3173 if (!value) goto failed;
3174 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3175 goto failed;
3176 Py_DECREF(value);
3177 break;
3178 case Set_kind:
3179 result = PyType_GenericNew(Set_type, NULL, NULL);
3180 if (!result) goto failed;
3181 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3182 if (!value) goto failed;
3183 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3184 goto failed;
3185 Py_DECREF(value);
3186 break;
3187 case ListComp_kind:
3188 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3189 if (!result) goto failed;
3190 value = ast2obj_expr(o->v.ListComp.elt);
3191 if (!value) goto failed;
3192 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3193 goto failed;
3194 Py_DECREF(value);
3195 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3196 if (!value) goto failed;
3197 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3198 goto failed;
3199 Py_DECREF(value);
3200 break;
3201 case SetComp_kind:
3202 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3203 if (!result) goto failed;
3204 value = ast2obj_expr(o->v.SetComp.elt);
3205 if (!value) goto failed;
3206 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3207 goto failed;
3208 Py_DECREF(value);
3209 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3210 if (!value) goto failed;
3211 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3212 goto failed;
3213 Py_DECREF(value);
3214 break;
3215 case DictComp_kind:
3216 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3217 if (!result) goto failed;
3218 value = ast2obj_expr(o->v.DictComp.key);
3219 if (!value) goto failed;
3220 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3221 goto failed;
3222 Py_DECREF(value);
3223 value = ast2obj_expr(o->v.DictComp.value);
3224 if (!value) goto failed;
3225 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3226 goto failed;
3227 Py_DECREF(value);
3228 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3229 if (!value) goto failed;
3230 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3231 goto failed;
3232 Py_DECREF(value);
3233 break;
3234 case GeneratorExp_kind:
3235 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3236 if (!result) goto failed;
3237 value = ast2obj_expr(o->v.GeneratorExp.elt);
3238 if (!value) goto failed;
3239 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3240 goto failed;
3241 Py_DECREF(value);
3242 value = ast2obj_list(o->v.GeneratorExp.generators,
3243 ast2obj_comprehension);
3244 if (!value) goto failed;
3245 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3246 goto failed;
3247 Py_DECREF(value);
3248 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003249 case Await_kind:
3250 result = PyType_GenericNew(Await_type, NULL, NULL);
3251 if (!result) goto failed;
3252 value = ast2obj_expr(o->v.Await.value);
3253 if (!value) goto failed;
3254 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3255 goto failed;
3256 Py_DECREF(value);
3257 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003258 case Yield_kind:
3259 result = PyType_GenericNew(Yield_type, NULL, NULL);
3260 if (!result) goto failed;
3261 value = ast2obj_expr(o->v.Yield.value);
3262 if (!value) goto failed;
3263 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3264 goto failed;
3265 Py_DECREF(value);
3266 break;
3267 case YieldFrom_kind:
3268 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3269 if (!result) goto failed;
3270 value = ast2obj_expr(o->v.YieldFrom.value);
3271 if (!value) goto failed;
3272 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3273 goto failed;
3274 Py_DECREF(value);
3275 break;
3276 case Compare_kind:
3277 result = PyType_GenericNew(Compare_type, NULL, NULL);
3278 if (!result) goto failed;
3279 value = ast2obj_expr(o->v.Compare.left);
3280 if (!value) goto failed;
3281 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3282 goto failed;
3283 Py_DECREF(value);
3284 {
3285 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3286 value = PyList_New(n);
3287 if (!value) goto failed;
3288 for(i = 0; i < n; i++)
3289 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003291 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003292 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3293 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003294 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003295 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003296 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003297 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3298 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003299 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003300 break;
3301 case Call_kind:
3302 result = PyType_GenericNew(Call_type, NULL, NULL);
3303 if (!result) goto failed;
3304 value = ast2obj_expr(o->v.Call.func);
3305 if (!value) goto failed;
3306 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3307 goto failed;
3308 Py_DECREF(value);
3309 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3310 if (!value) goto failed;
3311 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3312 goto failed;
3313 Py_DECREF(value);
3314 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3315 if (!value) goto failed;
3316 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3317 goto failed;
3318 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003319 break;
3320 case Num_kind:
3321 result = PyType_GenericNew(Num_type, NULL, NULL);
3322 if (!result) goto failed;
3323 value = ast2obj_object(o->v.Num.n);
3324 if (!value) goto failed;
3325 if (_PyObject_SetAttrId(result, &PyId_n, value) == -1)
3326 goto failed;
3327 Py_DECREF(value);
3328 break;
3329 case Str_kind:
3330 result = PyType_GenericNew(Str_type, NULL, NULL);
3331 if (!result) goto failed;
3332 value = ast2obj_string(o->v.Str.s);
3333 if (!value) goto failed;
3334 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3335 goto failed;
3336 Py_DECREF(value);
3337 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003338 case FormattedValue_kind:
3339 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3340 if (!result) goto failed;
3341 value = ast2obj_expr(o->v.FormattedValue.value);
3342 if (!value) goto failed;
3343 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3344 goto failed;
3345 Py_DECREF(value);
3346 value = ast2obj_int(o->v.FormattedValue.conversion);
3347 if (!value) goto failed;
3348 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3349 goto failed;
3350 Py_DECREF(value);
3351 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3352 if (!value) goto failed;
3353 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3354 goto failed;
3355 Py_DECREF(value);
3356 break;
3357 case JoinedStr_kind:
3358 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3359 if (!result) goto failed;
3360 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3361 if (!value) goto failed;
3362 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3363 goto failed;
3364 Py_DECREF(value);
3365 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003366 case Bytes_kind:
3367 result = PyType_GenericNew(Bytes_type, NULL, NULL);
3368 if (!result) goto failed;
3369 value = ast2obj_bytes(o->v.Bytes.s);
3370 if (!value) goto failed;
3371 if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
3372 goto failed;
3373 Py_DECREF(value);
3374 break;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003375 case NameConstant_kind:
3376 result = PyType_GenericNew(NameConstant_type, NULL, NULL);
3377 if (!result) goto failed;
3378 value = ast2obj_singleton(o->v.NameConstant.value);
3379 if (!value) goto failed;
3380 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3381 goto failed;
3382 Py_DECREF(value);
3383 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003384 case Ellipsis_kind:
3385 result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
3386 if (!result) goto failed;
3387 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003388 case Constant_kind:
3389 result = PyType_GenericNew(Constant_type, NULL, NULL);
3390 if (!result) goto failed;
3391 value = ast2obj_constant(o->v.Constant.value);
3392 if (!value) goto failed;
3393 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3394 goto failed;
3395 Py_DECREF(value);
3396 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003397 case Attribute_kind:
3398 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3399 if (!result) goto failed;
3400 value = ast2obj_expr(o->v.Attribute.value);
3401 if (!value) goto failed;
3402 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3403 goto failed;
3404 Py_DECREF(value);
3405 value = ast2obj_identifier(o->v.Attribute.attr);
3406 if (!value) goto failed;
3407 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3408 goto failed;
3409 Py_DECREF(value);
3410 value = ast2obj_expr_context(o->v.Attribute.ctx);
3411 if (!value) goto failed;
3412 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3413 goto failed;
3414 Py_DECREF(value);
3415 break;
3416 case Subscript_kind:
3417 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3418 if (!result) goto failed;
3419 value = ast2obj_expr(o->v.Subscript.value);
3420 if (!value) goto failed;
3421 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3422 goto failed;
3423 Py_DECREF(value);
3424 value = ast2obj_slice(o->v.Subscript.slice);
3425 if (!value) goto failed;
3426 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3427 goto failed;
3428 Py_DECREF(value);
3429 value = ast2obj_expr_context(o->v.Subscript.ctx);
3430 if (!value) goto failed;
3431 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3432 goto failed;
3433 Py_DECREF(value);
3434 break;
3435 case Starred_kind:
3436 result = PyType_GenericNew(Starred_type, NULL, NULL);
3437 if (!result) goto failed;
3438 value = ast2obj_expr(o->v.Starred.value);
3439 if (!value) goto failed;
3440 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3441 goto failed;
3442 Py_DECREF(value);
3443 value = ast2obj_expr_context(o->v.Starred.ctx);
3444 if (!value) goto failed;
3445 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3446 goto failed;
3447 Py_DECREF(value);
3448 break;
3449 case Name_kind:
3450 result = PyType_GenericNew(Name_type, NULL, NULL);
3451 if (!result) goto failed;
3452 value = ast2obj_identifier(o->v.Name.id);
3453 if (!value) goto failed;
3454 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3455 goto failed;
3456 Py_DECREF(value);
3457 value = ast2obj_expr_context(o->v.Name.ctx);
3458 if (!value) goto failed;
3459 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3460 goto failed;
3461 Py_DECREF(value);
3462 break;
3463 case List_kind:
3464 result = PyType_GenericNew(List_type, NULL, NULL);
3465 if (!result) goto failed;
3466 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3467 if (!value) goto failed;
3468 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3469 goto failed;
3470 Py_DECREF(value);
3471 value = ast2obj_expr_context(o->v.List.ctx);
3472 if (!value) goto failed;
3473 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3474 goto failed;
3475 Py_DECREF(value);
3476 break;
3477 case Tuple_kind:
3478 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3479 if (!result) goto failed;
3480 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3481 if (!value) goto failed;
3482 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3483 goto failed;
3484 Py_DECREF(value);
3485 value = ast2obj_expr_context(o->v.Tuple.ctx);
3486 if (!value) goto failed;
3487 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3488 goto failed;
3489 Py_DECREF(value);
3490 break;
3491 }
3492 value = ast2obj_int(o->lineno);
3493 if (!value) goto failed;
3494 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3495 goto failed;
3496 Py_DECREF(value);
3497 value = ast2obj_int(o->col_offset);
3498 if (!value) goto failed;
3499 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3500 goto failed;
3501 Py_DECREF(value);
3502 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003503failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003504 Py_XDECREF(value);
3505 Py_XDECREF(result);
3506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003507}
3508
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003509PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003510{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003511 switch(o) {
3512 case Load:
3513 Py_INCREF(Load_singleton);
3514 return Load_singleton;
3515 case Store:
3516 Py_INCREF(Store_singleton);
3517 return Store_singleton;
3518 case Del:
3519 Py_INCREF(Del_singleton);
3520 return Del_singleton;
3521 case AugLoad:
3522 Py_INCREF(AugLoad_singleton);
3523 return AugLoad_singleton;
3524 case AugStore:
3525 Py_INCREF(AugStore_singleton);
3526 return AugStore_singleton;
3527 case Param:
3528 Py_INCREF(Param_singleton);
3529 return Param_singleton;
3530 default:
3531 /* should never happen, but just in case ... */
3532 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3533 return NULL;
3534 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003535}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003536PyObject*
3537ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003538{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003539 slice_ty o = (slice_ty)_o;
3540 PyObject *result = NULL, *value = NULL;
3541 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003542 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003543 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003544
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003545 switch (o->kind) {
3546 case Slice_kind:
3547 result = PyType_GenericNew(Slice_type, NULL, NULL);
3548 if (!result) goto failed;
3549 value = ast2obj_expr(o->v.Slice.lower);
3550 if (!value) goto failed;
3551 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3552 goto failed;
3553 Py_DECREF(value);
3554 value = ast2obj_expr(o->v.Slice.upper);
3555 if (!value) goto failed;
3556 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3557 goto failed;
3558 Py_DECREF(value);
3559 value = ast2obj_expr(o->v.Slice.step);
3560 if (!value) goto failed;
3561 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3562 goto failed;
3563 Py_DECREF(value);
3564 break;
3565 case ExtSlice_kind:
3566 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3567 if (!result) goto failed;
3568 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3569 if (!value) goto failed;
3570 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3571 goto failed;
3572 Py_DECREF(value);
3573 break;
3574 case Index_kind:
3575 result = PyType_GenericNew(Index_type, NULL, NULL);
3576 if (!result) goto failed;
3577 value = ast2obj_expr(o->v.Index.value);
3578 if (!value) goto failed;
3579 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3580 goto failed;
3581 Py_DECREF(value);
3582 break;
3583 }
3584 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003585failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003586 Py_XDECREF(value);
3587 Py_XDECREF(result);
3588 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003589}
3590
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003591PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003593 switch(o) {
3594 case And:
3595 Py_INCREF(And_singleton);
3596 return And_singleton;
3597 case Or:
3598 Py_INCREF(Or_singleton);
3599 return Or_singleton;
3600 default:
3601 /* should never happen, but just in case ... */
3602 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3603 return NULL;
3604 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003605}
3606PyObject* ast2obj_operator(operator_ty o)
3607{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003608 switch(o) {
3609 case Add:
3610 Py_INCREF(Add_singleton);
3611 return Add_singleton;
3612 case Sub:
3613 Py_INCREF(Sub_singleton);
3614 return Sub_singleton;
3615 case Mult:
3616 Py_INCREF(Mult_singleton);
3617 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003618 case MatMult:
3619 Py_INCREF(MatMult_singleton);
3620 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003621 case Div:
3622 Py_INCREF(Div_singleton);
3623 return Div_singleton;
3624 case Mod:
3625 Py_INCREF(Mod_singleton);
3626 return Mod_singleton;
3627 case Pow:
3628 Py_INCREF(Pow_singleton);
3629 return Pow_singleton;
3630 case LShift:
3631 Py_INCREF(LShift_singleton);
3632 return LShift_singleton;
3633 case RShift:
3634 Py_INCREF(RShift_singleton);
3635 return RShift_singleton;
3636 case BitOr:
3637 Py_INCREF(BitOr_singleton);
3638 return BitOr_singleton;
3639 case BitXor:
3640 Py_INCREF(BitXor_singleton);
3641 return BitXor_singleton;
3642 case BitAnd:
3643 Py_INCREF(BitAnd_singleton);
3644 return BitAnd_singleton;
3645 case FloorDiv:
3646 Py_INCREF(FloorDiv_singleton);
3647 return FloorDiv_singleton;
3648 default:
3649 /* should never happen, but just in case ... */
3650 PyErr_Format(PyExc_SystemError, "unknown operator found");
3651 return NULL;
3652 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003653}
3654PyObject* ast2obj_unaryop(unaryop_ty o)
3655{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003656 switch(o) {
3657 case Invert:
3658 Py_INCREF(Invert_singleton);
3659 return Invert_singleton;
3660 case Not:
3661 Py_INCREF(Not_singleton);
3662 return Not_singleton;
3663 case UAdd:
3664 Py_INCREF(UAdd_singleton);
3665 return UAdd_singleton;
3666 case USub:
3667 Py_INCREF(USub_singleton);
3668 return USub_singleton;
3669 default:
3670 /* should never happen, but just in case ... */
3671 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3672 return NULL;
3673 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003674}
3675PyObject* ast2obj_cmpop(cmpop_ty o)
3676{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003677 switch(o) {
3678 case Eq:
3679 Py_INCREF(Eq_singleton);
3680 return Eq_singleton;
3681 case NotEq:
3682 Py_INCREF(NotEq_singleton);
3683 return NotEq_singleton;
3684 case Lt:
3685 Py_INCREF(Lt_singleton);
3686 return Lt_singleton;
3687 case LtE:
3688 Py_INCREF(LtE_singleton);
3689 return LtE_singleton;
3690 case Gt:
3691 Py_INCREF(Gt_singleton);
3692 return Gt_singleton;
3693 case GtE:
3694 Py_INCREF(GtE_singleton);
3695 return GtE_singleton;
3696 case Is:
3697 Py_INCREF(Is_singleton);
3698 return Is_singleton;
3699 case IsNot:
3700 Py_INCREF(IsNot_singleton);
3701 return IsNot_singleton;
3702 case In:
3703 Py_INCREF(In_singleton);
3704 return In_singleton;
3705 case NotIn:
3706 Py_INCREF(NotIn_singleton);
3707 return NotIn_singleton;
3708 default:
3709 /* should never happen, but just in case ... */
3710 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3711 return NULL;
3712 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003713}
3714PyObject*
3715ast2obj_comprehension(void* _o)
3716{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003717 comprehension_ty o = (comprehension_ty)_o;
3718 PyObject *result = NULL, *value = NULL;
3719 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003720 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003721 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003722
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003723 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3724 if (!result) return NULL;
3725 value = ast2obj_expr(o->target);
3726 if (!value) goto failed;
3727 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3728 goto failed;
3729 Py_DECREF(value);
3730 value = ast2obj_expr(o->iter);
3731 if (!value) goto failed;
3732 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3733 goto failed;
3734 Py_DECREF(value);
3735 value = ast2obj_list(o->ifs, ast2obj_expr);
3736 if (!value) goto failed;
3737 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3738 goto failed;
3739 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003740 value = ast2obj_int(o->is_async);
3741 if (!value) goto failed;
3742 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3743 goto failed;
3744 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003745 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003746failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003747 Py_XDECREF(value);
3748 Py_XDECREF(result);
3749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003750}
3751
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003752PyObject*
3753ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003755 excepthandler_ty o = (excepthandler_ty)_o;
3756 PyObject *result = NULL, *value = NULL;
3757 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003758 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003759 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003760
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003761 switch (o->kind) {
3762 case ExceptHandler_kind:
3763 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3764 if (!result) goto failed;
3765 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003766 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003767 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3768 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003769 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003770 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003771 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003772 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3773 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003774 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003775 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3776 if (!value) goto failed;
3777 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3778 goto failed;
3779 Py_DECREF(value);
3780 break;
3781 }
3782 value = ast2obj_int(o->lineno);
3783 if (!value) goto failed;
3784 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3785 goto failed;
3786 Py_DECREF(value);
3787 value = ast2obj_int(o->col_offset);
3788 if (!value) goto failed;
3789 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3790 goto failed;
3791 Py_DECREF(value);
3792 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003793failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003794 Py_XDECREF(value);
3795 Py_XDECREF(result);
3796 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003797}
3798
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003799PyObject*
3800ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003801{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003802 arguments_ty o = (arguments_ty)_o;
3803 PyObject *result = NULL, *value = NULL;
3804 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003805 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003806 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003807
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003808 result = PyType_GenericNew(arguments_type, NULL, NULL);
3809 if (!result) return NULL;
3810 value = ast2obj_list(o->args, ast2obj_arg);
3811 if (!value) goto failed;
3812 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3813 goto failed;
3814 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003815 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003816 if (!value) goto failed;
3817 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3818 goto failed;
3819 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003820 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3821 if (!value) goto failed;
3822 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3823 goto failed;
3824 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003825 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003826 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003827 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003828 goto failed;
3829 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003830 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003831 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003832 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003833 goto failed;
3834 Py_DECREF(value);
3835 value = ast2obj_list(o->defaults, ast2obj_expr);
3836 if (!value) goto failed;
3837 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3838 goto failed;
3839 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003840 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003841failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003842 Py_XDECREF(value);
3843 Py_XDECREF(result);
3844 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003845}
3846
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003847PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003848ast2obj_arg(void* _o)
3849{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003850 arg_ty o = (arg_ty)_o;
3851 PyObject *result = NULL, *value = NULL;
3852 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003853 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003854 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003855
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003856 result = PyType_GenericNew(arg_type, NULL, NULL);
3857 if (!result) return NULL;
3858 value = ast2obj_identifier(o->arg);
3859 if (!value) goto failed;
3860 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3861 goto failed;
3862 Py_DECREF(value);
3863 value = ast2obj_expr(o->annotation);
3864 if (!value) goto failed;
3865 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
3866 goto failed;
3867 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003868 value = ast2obj_int(o->lineno);
3869 if (!value) goto failed;
3870 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3871 goto failed;
3872 Py_DECREF(value);
3873 value = ast2obj_int(o->col_offset);
3874 if (!value) goto failed;
3875 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3876 goto failed;
3877 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003878 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00003879failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003880 Py_XDECREF(value);
3881 Py_XDECREF(result);
3882 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003883}
3884
3885PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003886ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003887{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003888 keyword_ty o = (keyword_ty)_o;
3889 PyObject *result = NULL, *value = NULL;
3890 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003891 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003892 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003893
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003894 result = PyType_GenericNew(keyword_type, NULL, NULL);
3895 if (!result) return NULL;
3896 value = ast2obj_identifier(o->arg);
3897 if (!value) goto failed;
3898 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3899 goto failed;
3900 Py_DECREF(value);
3901 value = ast2obj_expr(o->value);
3902 if (!value) goto failed;
3903 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3904 goto failed;
3905 Py_DECREF(value);
3906 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003907failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003908 Py_XDECREF(value);
3909 Py_XDECREF(result);
3910 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911}
3912
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003913PyObject*
3914ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003915{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003916 alias_ty o = (alias_ty)_o;
3917 PyObject *result = NULL, *value = NULL;
3918 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003919 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003920 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003921
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003922 result = PyType_GenericNew(alias_type, NULL, NULL);
3923 if (!result) return NULL;
3924 value = ast2obj_identifier(o->name);
3925 if (!value) goto failed;
3926 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3927 goto failed;
3928 Py_DECREF(value);
3929 value = ast2obj_identifier(o->asname);
3930 if (!value) goto failed;
3931 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
3932 goto failed;
3933 Py_DECREF(value);
3934 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003935failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003936 Py_XDECREF(value);
3937 Py_XDECREF(result);
3938 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003939}
3940
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003941PyObject*
3942ast2obj_withitem(void* _o)
3943{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003944 withitem_ty o = (withitem_ty)_o;
3945 PyObject *result = NULL, *value = NULL;
3946 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003947 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003949
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003950 result = PyType_GenericNew(withitem_type, NULL, NULL);
3951 if (!result) return NULL;
3952 value = ast2obj_expr(o->context_expr);
3953 if (!value) goto failed;
3954 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
3955 goto failed;
3956 Py_DECREF(value);
3957 value = ast2obj_expr(o->optional_vars);
3958 if (!value) goto failed;
3959 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
3960 goto failed;
3961 Py_DECREF(value);
3962 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003963failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003964 Py_XDECREF(value);
3965 Py_XDECREF(result);
3966 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003967}
3968
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003969
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003970int
3971obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3972{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003973 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003974
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003975 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003976
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003977 if (obj == Py_None) {
3978 *out = NULL;
3979 return 0;
3980 }
3981 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3982 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003983 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003984 }
3985 if (isinstance) {
3986 asdl_seq* body;
INADA Naokicb41b272017-02-23 00:31:59 +09003987 string docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003988
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003989 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
3990 return 1;
3991 }
3992 if (tmp == NULL) {
3993 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
3994 return 1;
3995 }
3996 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003997 int res;
3998 Py_ssize_t len;
3999 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004000 if (!PyList_Check(tmp)) {
4001 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4002 goto failed;
4003 }
4004 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004005 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004006 if (body == NULL) goto failed;
4007 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004008 stmt_ty val;
4009 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004010 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004011 if (len != PyList_GET_SIZE(tmp)) {
4012 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
4013 goto failed;
4014 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004015 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004016 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004017 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004018 }
4019 if (_PyObject_LookupAttrId(obj, &PyId_docstring, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004020 return 1;
4021 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004022 if (tmp == NULL || tmp == Py_None) {
4023 Py_CLEAR(tmp);
4024 docstring = NULL;
4025 }
4026 else {
INADA Naokicb41b272017-02-23 00:31:59 +09004027 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004028 res = obj2ast_string(tmp, &docstring, arena);
4029 if (res != 0) goto failed;
4030 Py_CLEAR(tmp);
INADA Naokicb41b272017-02-23 00:31:59 +09004031 }
4032 *out = Module(body, docstring, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004033 if (*out == NULL) goto failed;
4034 return 0;
4035 }
4036 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
4037 if (isinstance == -1) {
4038 return 1;
4039 }
4040 if (isinstance) {
4041 asdl_seq* body;
4042
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004043 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4044 return 1;
4045 }
4046 if (tmp == NULL) {
4047 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4048 return 1;
4049 }
4050 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004051 int res;
4052 Py_ssize_t len;
4053 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004054 if (!PyList_Check(tmp)) {
4055 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4056 goto failed;
4057 }
4058 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004059 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004060 if (body == NULL) goto failed;
4061 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004062 stmt_ty val;
4063 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004064 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004065 if (len != PyList_GET_SIZE(tmp)) {
4066 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4067 goto failed;
4068 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004069 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004070 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004071 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004072 }
4073 *out = Interactive(body, arena);
4074 if (*out == NULL) goto failed;
4075 return 0;
4076 }
4077 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4078 if (isinstance == -1) {
4079 return 1;
4080 }
4081 if (isinstance) {
4082 expr_ty body;
4083
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004084 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4085 return 1;
4086 }
4087 if (tmp == NULL) {
4088 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4089 return 1;
4090 }
4091 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004092 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004093 res = obj2ast_expr(tmp, &body, arena);
4094 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004095 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004096 }
4097 *out = Expression(body, arena);
4098 if (*out == NULL) goto failed;
4099 return 0;
4100 }
4101 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4102 if (isinstance == -1) {
4103 return 1;
4104 }
4105 if (isinstance) {
4106 asdl_seq* body;
4107
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004108 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4109 return 1;
4110 }
4111 if (tmp == NULL) {
4112 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4113 return 1;
4114 }
4115 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004116 int res;
4117 Py_ssize_t len;
4118 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004119 if (!PyList_Check(tmp)) {
4120 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4121 goto failed;
4122 }
4123 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004124 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004125 if (body == NULL) goto failed;
4126 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004127 stmt_ty val;
4128 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004129 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004130 if (len != PyList_GET_SIZE(tmp)) {
4131 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4132 goto failed;
4133 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004134 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004135 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004136 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004137 }
4138 *out = Suite(body, arena);
4139 if (*out == NULL) goto failed;
4140 return 0;
4141 }
4142
4143 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4144 failed:
4145 Py_XDECREF(tmp);
4146 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004147}
4148
4149int
4150obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4151{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004152 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004153
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004154 PyObject *tmp = NULL;
4155 int lineno;
4156 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004157
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004158 if (obj == Py_None) {
4159 *out = NULL;
4160 return 0;
4161 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004162 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4163 return 1;
4164 }
4165 if (tmp == NULL) {
4166 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4167 return 1;
4168 }
4169 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004170 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004171 res = obj2ast_int(tmp, &lineno, arena);
4172 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004173 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004174 }
4175 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004176 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004177 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004178 if (tmp == NULL) {
4179 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4180 return 1;
4181 }
4182 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004183 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004184 res = obj2ast_int(tmp, &col_offset, arena);
4185 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004186 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004187 }
4188 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4189 if (isinstance == -1) {
4190 return 1;
4191 }
4192 if (isinstance) {
4193 identifier name;
4194 arguments_ty args;
4195 asdl_seq* body;
4196 asdl_seq* decorator_list;
4197 expr_ty returns;
INADA Naokicb41b272017-02-23 00:31:59 +09004198 string docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004199
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004200 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4201 return 1;
4202 }
4203 if (tmp == NULL) {
4204 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4205 return 1;
4206 }
4207 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004208 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004209 res = obj2ast_identifier(tmp, &name, arena);
4210 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004211 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004212 }
4213 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004214 return 1;
4215 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004216 if (tmp == NULL) {
4217 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4218 return 1;
4219 }
4220 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004221 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004222 res = obj2ast_arguments(tmp, &args, arena);
4223 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004224 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004225 }
4226 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004227 return 1;
4228 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004229 if (tmp == NULL) {
4230 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4231 return 1;
4232 }
4233 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004234 int res;
4235 Py_ssize_t len;
4236 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004237 if (!PyList_Check(tmp)) {
4238 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4239 goto failed;
4240 }
4241 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004242 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004243 if (body == NULL) goto failed;
4244 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004245 stmt_ty val;
4246 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004247 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004248 if (len != PyList_GET_SIZE(tmp)) {
4249 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4250 goto failed;
4251 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004252 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004253 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004254 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004255 }
4256 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004257 return 1;
4258 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004259 if (tmp == NULL) {
4260 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4261 return 1;
4262 }
4263 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004264 int res;
4265 Py_ssize_t len;
4266 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004267 if (!PyList_Check(tmp)) {
4268 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4269 goto failed;
4270 }
4271 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004272 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004273 if (decorator_list == NULL) goto failed;
4274 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004275 expr_ty val;
4276 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004277 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004278 if (len != PyList_GET_SIZE(tmp)) {
4279 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4280 goto failed;
4281 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004282 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004283 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004284 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004285 }
4286 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004287 return 1;
4288 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004289 if (tmp == NULL || tmp == Py_None) {
4290 Py_CLEAR(tmp);
4291 returns = NULL;
4292 }
4293 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004294 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004295 res = obj2ast_expr(tmp, &returns, arena);
4296 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004297 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004298 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004299 if (_PyObject_LookupAttrId(obj, &PyId_docstring, &tmp) < 0) {
4300 return 1;
4301 }
4302 if (tmp == NULL || tmp == Py_None) {
4303 Py_CLEAR(tmp);
4304 docstring = NULL;
4305 }
4306 else {
INADA Naokicb41b272017-02-23 00:31:59 +09004307 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004308 res = obj2ast_string(tmp, &docstring, arena);
4309 if (res != 0) goto failed;
4310 Py_CLEAR(tmp);
INADA Naokicb41b272017-02-23 00:31:59 +09004311 }
4312 *out = FunctionDef(name, args, body, decorator_list, returns,
4313 docstring, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004314 if (*out == NULL) goto failed;
4315 return 0;
4316 }
Yury Selivanov75445082015-05-11 22:57:16 -04004317 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4318 if (isinstance == -1) {
4319 return 1;
4320 }
4321 if (isinstance) {
4322 identifier name;
4323 arguments_ty args;
4324 asdl_seq* body;
4325 asdl_seq* decorator_list;
4326 expr_ty returns;
INADA Naokicb41b272017-02-23 00:31:59 +09004327 string docstring;
Yury Selivanov75445082015-05-11 22:57:16 -04004328
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004329 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4330 return 1;
4331 }
4332 if (tmp == NULL) {
4333 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4334 return 1;
4335 }
4336 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004337 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004338 res = obj2ast_identifier(tmp, &name, arena);
4339 if (res != 0) goto failed;
4340 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004341 }
4342 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004343 return 1;
4344 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004345 if (tmp == NULL) {
4346 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4347 return 1;
4348 }
4349 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004350 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004351 res = obj2ast_arguments(tmp, &args, arena);
4352 if (res != 0) goto failed;
4353 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004354 }
4355 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004356 return 1;
4357 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004358 if (tmp == NULL) {
4359 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4360 return 1;
4361 }
4362 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004363 int res;
4364 Py_ssize_t len;
4365 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004366 if (!PyList_Check(tmp)) {
4367 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4368 goto failed;
4369 }
4370 len = PyList_GET_SIZE(tmp);
4371 body = _Py_asdl_seq_new(len, arena);
4372 if (body == NULL) goto failed;
4373 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004374 stmt_ty val;
4375 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004376 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004377 if (len != PyList_GET_SIZE(tmp)) {
4378 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4379 goto failed;
4380 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004381 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004382 }
4383 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004384 }
4385 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004386 return 1;
4387 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004388 if (tmp == NULL) {
4389 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4390 return 1;
4391 }
4392 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004393 int res;
4394 Py_ssize_t len;
4395 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004396 if (!PyList_Check(tmp)) {
4397 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4398 goto failed;
4399 }
4400 len = PyList_GET_SIZE(tmp);
4401 decorator_list = _Py_asdl_seq_new(len, arena);
4402 if (decorator_list == NULL) goto failed;
4403 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004404 expr_ty val;
4405 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004406 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004407 if (len != PyList_GET_SIZE(tmp)) {
4408 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4409 goto failed;
4410 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004411 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004412 }
4413 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004414 }
4415 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004416 return 1;
4417 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004418 if (tmp == NULL || tmp == Py_None) {
4419 Py_CLEAR(tmp);
4420 returns = NULL;
4421 }
4422 else {
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);
Yury Selivanov75445082015-05-11 22:57:16 -04004427 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004428 if (_PyObject_LookupAttrId(obj, &PyId_docstring, &tmp) < 0) {
4429 return 1;
4430 }
4431 if (tmp == NULL || tmp == Py_None) {
4432 Py_CLEAR(tmp);
4433 docstring = NULL;
4434 }
4435 else {
INADA Naokicb41b272017-02-23 00:31:59 +09004436 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004437 res = obj2ast_string(tmp, &docstring, arena);
4438 if (res != 0) goto failed;
4439 Py_CLEAR(tmp);
INADA Naokicb41b272017-02-23 00:31:59 +09004440 }
Yury Selivanov75445082015-05-11 22:57:16 -04004441 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
INADA Naokicb41b272017-02-23 00:31:59 +09004442 docstring, lineno, col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004443 if (*out == NULL) goto failed;
4444 return 0;
4445 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004446 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4447 if (isinstance == -1) {
4448 return 1;
4449 }
4450 if (isinstance) {
4451 identifier name;
4452 asdl_seq* bases;
4453 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004454 asdl_seq* body;
4455 asdl_seq* decorator_list;
INADA Naokicb41b272017-02-23 00:31:59 +09004456 string docstring;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004457
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004458 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4459 return 1;
4460 }
4461 if (tmp == NULL) {
4462 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4463 return 1;
4464 }
4465 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004466 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004467 res = obj2ast_identifier(tmp, &name, arena);
4468 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004469 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004470 }
4471 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004472 return 1;
4473 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004474 if (tmp == NULL) {
4475 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4476 return 1;
4477 }
4478 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004479 int res;
4480 Py_ssize_t len;
4481 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004482 if (!PyList_Check(tmp)) {
4483 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4484 goto failed;
4485 }
4486 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004487 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004488 if (bases == NULL) goto failed;
4489 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004490 expr_ty val;
4491 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004492 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004493 if (len != PyList_GET_SIZE(tmp)) {
4494 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4495 goto failed;
4496 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004497 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004498 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004499 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004500 }
4501 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004502 return 1;
4503 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004504 if (tmp == NULL) {
4505 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4506 return 1;
4507 }
4508 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004509 int res;
4510 Py_ssize_t len;
4511 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004512 if (!PyList_Check(tmp)) {
4513 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4514 goto failed;
4515 }
4516 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004517 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004518 if (keywords == NULL) goto failed;
4519 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004520 keyword_ty val;
4521 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004522 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004523 if (len != PyList_GET_SIZE(tmp)) {
4524 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4525 goto failed;
4526 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004527 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004528 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004529 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004530 }
4531 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004532 return 1;
4533 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004534 if (tmp == NULL) {
4535 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4536 return 1;
4537 }
4538 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004539 int res;
4540 Py_ssize_t len;
4541 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004542 if (!PyList_Check(tmp)) {
4543 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4544 goto failed;
4545 }
4546 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004547 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004548 if (body == NULL) goto failed;
4549 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004550 stmt_ty val;
4551 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004552 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004553 if (len != PyList_GET_SIZE(tmp)) {
4554 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4555 goto failed;
4556 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004557 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004558 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004559 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004560 }
4561 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004562 return 1;
4563 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004564 if (tmp == NULL) {
4565 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4566 return 1;
4567 }
4568 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004569 int res;
4570 Py_ssize_t len;
4571 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004572 if (!PyList_Check(tmp)) {
4573 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4574 goto failed;
4575 }
4576 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004577 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004578 if (decorator_list == NULL) goto failed;
4579 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004580 expr_ty val;
4581 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004582 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004583 if (len != PyList_GET_SIZE(tmp)) {
4584 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4585 goto failed;
4586 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004587 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004588 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004589 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004590 }
4591 if (_PyObject_LookupAttrId(obj, &PyId_docstring, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004592 return 1;
4593 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004594 if (tmp == NULL || tmp == Py_None) {
4595 Py_CLEAR(tmp);
4596 docstring = NULL;
4597 }
4598 else {
INADA Naokicb41b272017-02-23 00:31:59 +09004599 int res;
INADA Naokicb41b272017-02-23 00:31:59 +09004600 res = obj2ast_string(tmp, &docstring, arena);
4601 if (res != 0) goto failed;
4602 Py_CLEAR(tmp);
INADA Naokicb41b272017-02-23 00:31:59 +09004603 }
4604 *out = ClassDef(name, bases, keywords, body, decorator_list, docstring,
4605 lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004606 if (*out == NULL) goto failed;
4607 return 0;
4608 }
4609 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4610 if (isinstance == -1) {
4611 return 1;
4612 }
4613 if (isinstance) {
4614 expr_ty value;
4615
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004616 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4617 return 1;
4618 }
4619 if (tmp == NULL || tmp == Py_None) {
4620 Py_CLEAR(tmp);
4621 value = NULL;
4622 }
4623 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004624 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004625 res = obj2ast_expr(tmp, &value, arena);
4626 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004627 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004628 }
4629 *out = Return(value, lineno, col_offset, arena);
4630 if (*out == NULL) goto failed;
4631 return 0;
4632 }
4633 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4634 if (isinstance == -1) {
4635 return 1;
4636 }
4637 if (isinstance) {
4638 asdl_seq* targets;
4639
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004640 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4641 return 1;
4642 }
4643 if (tmp == NULL) {
4644 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4645 return 1;
4646 }
4647 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004648 int res;
4649 Py_ssize_t len;
4650 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004651 if (!PyList_Check(tmp)) {
4652 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4653 goto failed;
4654 }
4655 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004656 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004657 if (targets == NULL) goto failed;
4658 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004659 expr_ty val;
4660 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004661 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004662 if (len != PyList_GET_SIZE(tmp)) {
4663 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4664 goto failed;
4665 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004666 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004667 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004668 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004669 }
4670 *out = Delete(targets, lineno, col_offset, arena);
4671 if (*out == NULL) goto failed;
4672 return 0;
4673 }
4674 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4675 if (isinstance == -1) {
4676 return 1;
4677 }
4678 if (isinstance) {
4679 asdl_seq* targets;
4680 expr_ty value;
4681
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004682 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4683 return 1;
4684 }
4685 if (tmp == NULL) {
4686 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4687 return 1;
4688 }
4689 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004690 int res;
4691 Py_ssize_t len;
4692 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004693 if (!PyList_Check(tmp)) {
4694 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4695 goto failed;
4696 }
4697 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004698 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004699 if (targets == NULL) goto failed;
4700 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004701 expr_ty val;
4702 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004703 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004704 if (len != PyList_GET_SIZE(tmp)) {
4705 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4706 goto failed;
4707 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004708 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004709 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004710 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004711 }
4712 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004713 return 1;
4714 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004715 if (tmp == NULL) {
4716 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4717 return 1;
4718 }
4719 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004720 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004721 res = obj2ast_expr(tmp, &value, arena);
4722 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004723 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004724 }
4725 *out = Assign(targets, value, lineno, col_offset, arena);
4726 if (*out == NULL) goto failed;
4727 return 0;
4728 }
4729 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
4730 if (isinstance == -1) {
4731 return 1;
4732 }
4733 if (isinstance) {
4734 expr_ty target;
4735 operator_ty op;
4736 expr_ty value;
4737
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004738 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4739 return 1;
4740 }
4741 if (tmp == NULL) {
4742 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
4743 return 1;
4744 }
4745 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004746 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004747 res = obj2ast_expr(tmp, &target, arena);
4748 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004749 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004750 }
4751 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004752 return 1;
4753 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004754 if (tmp == NULL) {
4755 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
4756 return 1;
4757 }
4758 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004759 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004760 res = obj2ast_operator(tmp, &op, arena);
4761 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004762 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004763 }
4764 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004765 return 1;
4766 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004767 if (tmp == NULL) {
4768 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
4769 return 1;
4770 }
4771 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004772 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 res = obj2ast_expr(tmp, &value, arena);
4774 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004775 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004776 }
4777 *out = AugAssign(target, op, value, lineno, col_offset, arena);
4778 if (*out == NULL) goto failed;
4779 return 0;
4780 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004781 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
4782 if (isinstance == -1) {
4783 return 1;
4784 }
4785 if (isinstance) {
4786 expr_ty target;
4787 expr_ty annotation;
4788 expr_ty value;
4789 int simple;
4790
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004791 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4792 return 1;
4793 }
4794 if (tmp == NULL) {
4795 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
4796 return 1;
4797 }
4798 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004799 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004800 res = obj2ast_expr(tmp, &target, arena);
4801 if (res != 0) goto failed;
4802 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004803 }
4804 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004805 return 1;
4806 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004807 if (tmp == NULL) {
4808 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
4809 return 1;
4810 }
4811 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004812 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004813 res = obj2ast_expr(tmp, &annotation, arena);
4814 if (res != 0) goto failed;
4815 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004816 }
4817 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004818 return 1;
4819 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004820 if (tmp == NULL || tmp == Py_None) {
4821 Py_CLEAR(tmp);
4822 value = NULL;
4823 }
4824 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004825 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004826 res = obj2ast_expr(tmp, &value, arena);
4827 if (res != 0) goto failed;
4828 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004829 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004830 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
4831 return 1;
4832 }
4833 if (tmp == NULL) {
4834 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
4835 return 1;
4836 }
4837 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004838 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004839 res = obj2ast_int(tmp, &simple, arena);
4840 if (res != 0) goto failed;
4841 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004842 }
4843 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
4844 arena);
4845 if (*out == NULL) goto failed;
4846 return 0;
4847 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004848 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
4849 if (isinstance == -1) {
4850 return 1;
4851 }
4852 if (isinstance) {
4853 expr_ty target;
4854 expr_ty iter;
4855 asdl_seq* body;
4856 asdl_seq* orelse;
4857
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004858 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4859 return 1;
4860 }
4861 if (tmp == NULL) {
4862 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4863 return 1;
4864 }
4865 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004866 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004867 res = obj2ast_expr(tmp, &target, arena);
4868 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004869 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004870 }
4871 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004872 return 1;
4873 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004874 if (tmp == NULL) {
4875 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4876 return 1;
4877 }
4878 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004879 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004880 res = obj2ast_expr(tmp, &iter, arena);
4881 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004882 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004883 }
4884 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004885 return 1;
4886 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004887 if (tmp == NULL) {
4888 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4889 return 1;
4890 }
4891 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004892 int res;
4893 Py_ssize_t len;
4894 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004895 if (!PyList_Check(tmp)) {
4896 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4897 goto failed;
4898 }
4899 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004900 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004901 if (body == NULL) goto failed;
4902 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004903 stmt_ty val;
4904 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004905 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004906 if (len != PyList_GET_SIZE(tmp)) {
4907 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
4908 goto failed;
4909 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004910 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004911 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004912 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004913 }
4914 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004915 return 1;
4916 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004917 if (tmp == NULL) {
4918 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4919 return 1;
4920 }
4921 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004922 int res;
4923 Py_ssize_t len;
4924 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004925 if (!PyList_Check(tmp)) {
4926 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4927 goto failed;
4928 }
4929 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004930 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004931 if (orelse == NULL) goto failed;
4932 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004933 stmt_ty val;
4934 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004935 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004936 if (len != PyList_GET_SIZE(tmp)) {
4937 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
4938 goto failed;
4939 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004940 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004941 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004942 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004943 }
4944 *out = For(target, iter, body, orelse, lineno, col_offset, arena);
4945 if (*out == NULL) goto failed;
4946 return 0;
4947 }
Yury Selivanov75445082015-05-11 22:57:16 -04004948 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
4949 if (isinstance == -1) {
4950 return 1;
4951 }
4952 if (isinstance) {
4953 expr_ty target;
4954 expr_ty iter;
4955 asdl_seq* body;
4956 asdl_seq* orelse;
4957
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004958 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4959 return 1;
4960 }
4961 if (tmp == NULL) {
4962 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
4963 return 1;
4964 }
4965 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004966 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004967 res = obj2ast_expr(tmp, &target, arena);
4968 if (res != 0) goto failed;
4969 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004970 }
4971 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004972 return 1;
4973 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004974 if (tmp == NULL) {
4975 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
4976 return 1;
4977 }
4978 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004979 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004980 res = obj2ast_expr(tmp, &iter, arena);
4981 if (res != 0) goto failed;
4982 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004983 }
4984 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004985 return 1;
4986 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004987 if (tmp == NULL) {
4988 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
4989 return 1;
4990 }
4991 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004992 int res;
4993 Py_ssize_t len;
4994 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004995 if (!PyList_Check(tmp)) {
4996 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4997 goto failed;
4998 }
4999 len = PyList_GET_SIZE(tmp);
5000 body = _Py_asdl_seq_new(len, arena);
5001 if (body == NULL) goto failed;
5002 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005003 stmt_ty val;
5004 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005005 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005006 if (len != PyList_GET_SIZE(tmp)) {
5007 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
5008 goto failed;
5009 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005010 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005011 }
5012 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005013 }
5014 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005015 return 1;
5016 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005017 if (tmp == NULL) {
5018 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
5019 return 1;
5020 }
5021 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005022 int res;
5023 Py_ssize_t len;
5024 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005025 if (!PyList_Check(tmp)) {
5026 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5027 goto failed;
5028 }
5029 len = PyList_GET_SIZE(tmp);
5030 orelse = _Py_asdl_seq_new(len, arena);
5031 if (orelse == NULL) goto failed;
5032 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005033 stmt_ty val;
5034 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005035 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005036 if (len != PyList_GET_SIZE(tmp)) {
5037 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
5038 goto failed;
5039 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005040 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005041 }
5042 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005043 }
5044 *out = AsyncFor(target, iter, body, orelse, lineno, col_offset, arena);
5045 if (*out == NULL) goto failed;
5046 return 0;
5047 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005048 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
5049 if (isinstance == -1) {
5050 return 1;
5051 }
5052 if (isinstance) {
5053 expr_ty test;
5054 asdl_seq* body;
5055 asdl_seq* orelse;
5056
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005057 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5058 return 1;
5059 }
5060 if (tmp == NULL) {
5061 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
5062 return 1;
5063 }
5064 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005065 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005066 res = obj2ast_expr(tmp, &test, arena);
5067 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005068 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005069 }
5070 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005071 return 1;
5072 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005073 if (tmp == NULL) {
5074 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
5075 return 1;
5076 }
5077 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005078 int res;
5079 Py_ssize_t len;
5080 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005081 if (!PyList_Check(tmp)) {
5082 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5083 goto failed;
5084 }
5085 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005086 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005087 if (body == NULL) goto failed;
5088 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005089 stmt_ty val;
5090 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005091 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005092 if (len != PyList_GET_SIZE(tmp)) {
5093 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5094 goto failed;
5095 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005096 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005097 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005098 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005099 }
5100 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005101 return 1;
5102 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005103 if (tmp == NULL) {
5104 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5105 return 1;
5106 }
5107 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005108 int res;
5109 Py_ssize_t len;
5110 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005111 if (!PyList_Check(tmp)) {
5112 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5113 goto failed;
5114 }
5115 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005116 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005117 if (orelse == NULL) goto failed;
5118 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005119 stmt_ty val;
5120 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005121 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005122 if (len != PyList_GET_SIZE(tmp)) {
5123 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5124 goto failed;
5125 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005126 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005127 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005128 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005129 }
5130 *out = While(test, body, orelse, lineno, col_offset, arena);
5131 if (*out == NULL) goto failed;
5132 return 0;
5133 }
5134 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5135 if (isinstance == -1) {
5136 return 1;
5137 }
5138 if (isinstance) {
5139 expr_ty test;
5140 asdl_seq* body;
5141 asdl_seq* orelse;
5142
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005143 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5144 return 1;
5145 }
5146 if (tmp == NULL) {
5147 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5148 return 1;
5149 }
5150 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005151 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005152 res = obj2ast_expr(tmp, &test, arena);
5153 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005154 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005155 }
5156 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005157 return 1;
5158 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005159 if (tmp == NULL) {
5160 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5161 return 1;
5162 }
5163 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005164 int res;
5165 Py_ssize_t len;
5166 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005167 if (!PyList_Check(tmp)) {
5168 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5169 goto failed;
5170 }
5171 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005172 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005173 if (body == NULL) goto failed;
5174 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005175 stmt_ty val;
5176 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005177 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005178 if (len != PyList_GET_SIZE(tmp)) {
5179 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5180 goto failed;
5181 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005182 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005183 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005184 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005185 }
5186 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005187 return 1;
5188 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005189 if (tmp == NULL) {
5190 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5191 return 1;
5192 }
5193 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005194 int res;
5195 Py_ssize_t len;
5196 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005197 if (!PyList_Check(tmp)) {
5198 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5199 goto failed;
5200 }
5201 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005202 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005203 if (orelse == NULL) goto failed;
5204 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005205 stmt_ty val;
5206 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005207 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005208 if (len != PyList_GET_SIZE(tmp)) {
5209 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5210 goto failed;
5211 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005212 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005213 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005214 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005215 }
5216 *out = If(test, body, orelse, lineno, col_offset, arena);
5217 if (*out == NULL) goto failed;
5218 return 0;
5219 }
5220 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5221 if (isinstance == -1) {
5222 return 1;
5223 }
5224 if (isinstance) {
5225 asdl_seq* items;
5226 asdl_seq* body;
5227
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005228 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5229 return 1;
5230 }
5231 if (tmp == NULL) {
5232 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5233 return 1;
5234 }
5235 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005236 int res;
5237 Py_ssize_t len;
5238 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005239 if (!PyList_Check(tmp)) {
5240 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5241 goto failed;
5242 }
5243 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005244 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005245 if (items == NULL) goto failed;
5246 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005247 withitem_ty val;
5248 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005249 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005250 if (len != PyList_GET_SIZE(tmp)) {
5251 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5252 goto failed;
5253 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005254 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005255 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005256 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005257 }
5258 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005259 return 1;
5260 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005261 if (tmp == NULL) {
5262 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5263 return 1;
5264 }
5265 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005266 int res;
5267 Py_ssize_t len;
5268 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005269 if (!PyList_Check(tmp)) {
5270 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5271 goto failed;
5272 }
5273 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005274 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005275 if (body == NULL) goto failed;
5276 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005277 stmt_ty val;
5278 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005279 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005280 if (len != PyList_GET_SIZE(tmp)) {
5281 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5282 goto failed;
5283 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005284 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005285 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005286 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005287 }
5288 *out = With(items, body, lineno, col_offset, arena);
5289 if (*out == NULL) goto failed;
5290 return 0;
5291 }
Yury Selivanov75445082015-05-11 22:57:16 -04005292 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5293 if (isinstance == -1) {
5294 return 1;
5295 }
5296 if (isinstance) {
5297 asdl_seq* items;
5298 asdl_seq* body;
5299
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005300 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5301 return 1;
5302 }
5303 if (tmp == NULL) {
5304 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5305 return 1;
5306 }
5307 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005308 int res;
5309 Py_ssize_t len;
5310 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005311 if (!PyList_Check(tmp)) {
5312 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5313 goto failed;
5314 }
5315 len = PyList_GET_SIZE(tmp);
5316 items = _Py_asdl_seq_new(len, arena);
5317 if (items == NULL) goto failed;
5318 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005319 withitem_ty val;
5320 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005321 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005322 if (len != PyList_GET_SIZE(tmp)) {
5323 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5324 goto failed;
5325 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005326 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005327 }
5328 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005329 }
5330 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005331 return 1;
5332 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005333 if (tmp == NULL) {
5334 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5335 return 1;
5336 }
5337 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005338 int res;
5339 Py_ssize_t len;
5340 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005341 if (!PyList_Check(tmp)) {
5342 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5343 goto failed;
5344 }
5345 len = PyList_GET_SIZE(tmp);
5346 body = _Py_asdl_seq_new(len, arena);
5347 if (body == NULL) goto failed;
5348 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005349 stmt_ty val;
5350 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005351 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005352 if (len != PyList_GET_SIZE(tmp)) {
5353 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5354 goto failed;
5355 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005356 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005357 }
5358 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005359 }
5360 *out = AsyncWith(items, body, lineno, col_offset, arena);
5361 if (*out == NULL) goto failed;
5362 return 0;
5363 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005364 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5365 if (isinstance == -1) {
5366 return 1;
5367 }
5368 if (isinstance) {
5369 expr_ty exc;
5370 expr_ty cause;
5371
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005372 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5373 return 1;
5374 }
5375 if (tmp == NULL || tmp == Py_None) {
5376 Py_CLEAR(tmp);
5377 exc = NULL;
5378 }
5379 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005380 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005381 res = obj2ast_expr(tmp, &exc, arena);
5382 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005383 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005384 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005385 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5386 return 1;
5387 }
5388 if (tmp == NULL || tmp == Py_None) {
5389 Py_CLEAR(tmp);
5390 cause = NULL;
5391 }
5392 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005393 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005394 res = obj2ast_expr(tmp, &cause, arena);
5395 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005396 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005397 }
5398 *out = Raise(exc, cause, lineno, col_offset, arena);
5399 if (*out == NULL) goto failed;
5400 return 0;
5401 }
5402 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5403 if (isinstance == -1) {
5404 return 1;
5405 }
5406 if (isinstance) {
5407 asdl_seq* body;
5408 asdl_seq* handlers;
5409 asdl_seq* orelse;
5410 asdl_seq* finalbody;
5411
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005412 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5413 return 1;
5414 }
5415 if (tmp == NULL) {
5416 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5417 return 1;
5418 }
5419 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005420 int res;
5421 Py_ssize_t len;
5422 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005423 if (!PyList_Check(tmp)) {
5424 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5425 goto failed;
5426 }
5427 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005428 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005429 if (body == NULL) goto failed;
5430 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005431 stmt_ty val;
5432 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005433 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005434 if (len != PyList_GET_SIZE(tmp)) {
5435 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5436 goto failed;
5437 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005438 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005439 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005440 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005441 }
5442 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005443 return 1;
5444 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005445 if (tmp == NULL) {
5446 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5447 return 1;
5448 }
5449 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005450 int res;
5451 Py_ssize_t len;
5452 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005453 if (!PyList_Check(tmp)) {
5454 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5455 goto failed;
5456 }
5457 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005458 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005459 if (handlers == NULL) goto failed;
5460 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005461 excepthandler_ty val;
5462 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005463 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005464 if (len != PyList_GET_SIZE(tmp)) {
5465 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5466 goto failed;
5467 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005468 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005469 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005470 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005471 }
5472 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005473 return 1;
5474 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005475 if (tmp == NULL) {
5476 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5477 return 1;
5478 }
5479 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005480 int res;
5481 Py_ssize_t len;
5482 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005483 if (!PyList_Check(tmp)) {
5484 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5485 goto failed;
5486 }
5487 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005488 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005489 if (orelse == NULL) goto failed;
5490 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005491 stmt_ty val;
5492 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005493 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005494 if (len != PyList_GET_SIZE(tmp)) {
5495 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5496 goto failed;
5497 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005498 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005499 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005500 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005501 }
5502 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005503 return 1;
5504 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005505 if (tmp == NULL) {
5506 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5507 return 1;
5508 }
5509 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005510 int res;
5511 Py_ssize_t len;
5512 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005513 if (!PyList_Check(tmp)) {
5514 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5515 goto failed;
5516 }
5517 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005518 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005519 if (finalbody == NULL) goto failed;
5520 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005521 stmt_ty val;
5522 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005523 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005524 if (len != PyList_GET_SIZE(tmp)) {
5525 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5526 goto failed;
5527 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005528 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005529 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005530 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005531 }
5532 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
5533 arena);
5534 if (*out == NULL) goto failed;
5535 return 0;
5536 }
5537 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5538 if (isinstance == -1) {
5539 return 1;
5540 }
5541 if (isinstance) {
5542 expr_ty test;
5543 expr_ty msg;
5544
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005545 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5546 return 1;
5547 }
5548 if (tmp == NULL) {
5549 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5550 return 1;
5551 }
5552 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005553 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005554 res = obj2ast_expr(tmp, &test, arena);
5555 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005556 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005557 }
5558 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005559 return 1;
5560 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005561 if (tmp == NULL || tmp == Py_None) {
5562 Py_CLEAR(tmp);
5563 msg = NULL;
5564 }
5565 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005566 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005567 res = obj2ast_expr(tmp, &msg, arena);
5568 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005569 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005570 }
5571 *out = Assert(test, msg, lineno, col_offset, arena);
5572 if (*out == NULL) goto failed;
5573 return 0;
5574 }
5575 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5576 if (isinstance == -1) {
5577 return 1;
5578 }
5579 if (isinstance) {
5580 asdl_seq* names;
5581
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005582 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5583 return 1;
5584 }
5585 if (tmp == NULL) {
5586 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5587 return 1;
5588 }
5589 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005590 int res;
5591 Py_ssize_t len;
5592 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005593 if (!PyList_Check(tmp)) {
5594 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5595 goto failed;
5596 }
5597 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005598 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005599 if (names == NULL) goto failed;
5600 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005601 alias_ty val;
5602 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005603 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005604 if (len != PyList_GET_SIZE(tmp)) {
5605 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5606 goto failed;
5607 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005608 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005609 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005610 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005611 }
5612 *out = Import(names, lineno, col_offset, arena);
5613 if (*out == NULL) goto failed;
5614 return 0;
5615 }
5616 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5617 if (isinstance == -1) {
5618 return 1;
5619 }
5620 if (isinstance) {
5621 identifier module;
5622 asdl_seq* names;
5623 int level;
5624
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005625 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5626 return 1;
5627 }
5628 if (tmp == NULL || tmp == Py_None) {
5629 Py_CLEAR(tmp);
5630 module = NULL;
5631 }
5632 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005633 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005634 res = obj2ast_identifier(tmp, &module, arena);
5635 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005636 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005637 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005638 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5639 return 1;
5640 }
5641 if (tmp == NULL) {
5642 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
5643 return 1;
5644 }
5645 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005646 int res;
5647 Py_ssize_t len;
5648 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005649 if (!PyList_Check(tmp)) {
5650 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5651 goto failed;
5652 }
5653 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005654 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005655 if (names == NULL) goto failed;
5656 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005657 alias_ty val;
5658 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005659 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005660 if (len != PyList_GET_SIZE(tmp)) {
5661 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
5662 goto failed;
5663 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005664 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005665 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005666 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005667 }
5668 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005669 return 1;
5670 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005671 if (tmp == NULL || tmp == Py_None) {
5672 Py_CLEAR(tmp);
5673 level = 0;
5674 }
5675 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005676 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005677 res = obj2ast_int(tmp, &level, arena);
5678 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005679 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005680 }
5681 *out = ImportFrom(module, names, level, lineno, col_offset, arena);
5682 if (*out == NULL) goto failed;
5683 return 0;
5684 }
5685 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
5686 if (isinstance == -1) {
5687 return 1;
5688 }
5689 if (isinstance) {
5690 asdl_seq* names;
5691
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005692 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5693 return 1;
5694 }
5695 if (tmp == NULL) {
5696 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
5697 return 1;
5698 }
5699 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005700 int res;
5701 Py_ssize_t len;
5702 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005703 if (!PyList_Check(tmp)) {
5704 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5705 goto failed;
5706 }
5707 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005708 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005709 if (names == NULL) goto failed;
5710 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005711 identifier val;
5712 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005713 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005714 if (len != PyList_GET_SIZE(tmp)) {
5715 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
5716 goto failed;
5717 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005718 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005719 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005720 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005721 }
5722 *out = Global(names, lineno, col_offset, arena);
5723 if (*out == NULL) goto failed;
5724 return 0;
5725 }
5726 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
5727 if (isinstance == -1) {
5728 return 1;
5729 }
5730 if (isinstance) {
5731 asdl_seq* names;
5732
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005733 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5734 return 1;
5735 }
5736 if (tmp == NULL) {
5737 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
5738 return 1;
5739 }
5740 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005741 int res;
5742 Py_ssize_t len;
5743 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005744 if (!PyList_Check(tmp)) {
5745 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5746 goto failed;
5747 }
5748 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005749 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005750 if (names == NULL) goto failed;
5751 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005752 identifier val;
5753 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005754 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005755 if (len != PyList_GET_SIZE(tmp)) {
5756 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
5757 goto failed;
5758 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005759 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005760 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005761 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005762 }
5763 *out = Nonlocal(names, lineno, col_offset, arena);
5764 if (*out == NULL) goto failed;
5765 return 0;
5766 }
5767 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
5768 if (isinstance == -1) {
5769 return 1;
5770 }
5771 if (isinstance) {
5772 expr_ty value;
5773
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005774 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
5775 return 1;
5776 }
5777 if (tmp == NULL) {
5778 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
5779 return 1;
5780 }
5781 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005782 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005783 res = obj2ast_expr(tmp, &value, arena);
5784 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005785 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005786 }
5787 *out = Expr(value, lineno, col_offset, arena);
5788 if (*out == NULL) goto failed;
5789 return 0;
5790 }
5791 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
5792 if (isinstance == -1) {
5793 return 1;
5794 }
5795 if (isinstance) {
5796
5797 *out = Pass(lineno, col_offset, arena);
5798 if (*out == NULL) goto failed;
5799 return 0;
5800 }
5801 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
5802 if (isinstance == -1) {
5803 return 1;
5804 }
5805 if (isinstance) {
5806
5807 *out = Break(lineno, col_offset, arena);
5808 if (*out == NULL) goto failed;
5809 return 0;
5810 }
5811 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
5812 if (isinstance == -1) {
5813 return 1;
5814 }
5815 if (isinstance) {
5816
5817 *out = Continue(lineno, col_offset, arena);
5818 if (*out == NULL) goto failed;
5819 return 0;
5820 }
5821
5822 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
5823 failed:
5824 Py_XDECREF(tmp);
5825 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005826}
5827
5828int
5829obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
5830{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005831 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005832
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005833 PyObject *tmp = NULL;
5834 int lineno;
5835 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005836
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005837 if (obj == Py_None) {
5838 *out = NULL;
5839 return 0;
5840 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005841 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
5842 return 1;
5843 }
5844 if (tmp == NULL) {
5845 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
5846 return 1;
5847 }
5848 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005849 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005850 res = obj2ast_int(tmp, &lineno, arena);
5851 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005852 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005853 }
5854 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005855 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005856 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005857 if (tmp == NULL) {
5858 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
5859 return 1;
5860 }
5861 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005862 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005863 res = obj2ast_int(tmp, &col_offset, arena);
5864 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005865 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005866 }
5867 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
5868 if (isinstance == -1) {
5869 return 1;
5870 }
5871 if (isinstance) {
5872 boolop_ty op;
5873 asdl_seq* values;
5874
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005875 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5876 return 1;
5877 }
5878 if (tmp == NULL) {
5879 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
5880 return 1;
5881 }
5882 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005883 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005884 res = obj2ast_boolop(tmp, &op, arena);
5885 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005886 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005887 }
5888 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005889 return 1;
5890 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005891 if (tmp == NULL) {
5892 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
5893 return 1;
5894 }
5895 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005896 int res;
5897 Py_ssize_t len;
5898 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005899 if (!PyList_Check(tmp)) {
5900 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5901 goto failed;
5902 }
5903 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005904 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005905 if (values == NULL) goto failed;
5906 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005907 expr_ty val;
5908 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005909 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005910 if (len != PyList_GET_SIZE(tmp)) {
5911 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
5912 goto failed;
5913 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005914 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005915 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005916 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005917 }
5918 *out = BoolOp(op, values, lineno, col_offset, arena);
5919 if (*out == NULL) goto failed;
5920 return 0;
5921 }
5922 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
5923 if (isinstance == -1) {
5924 return 1;
5925 }
5926 if (isinstance) {
5927 expr_ty left;
5928 operator_ty op;
5929 expr_ty right;
5930
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005931 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
5932 return 1;
5933 }
5934 if (tmp == NULL) {
5935 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
5936 return 1;
5937 }
5938 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005939 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005940 res = obj2ast_expr(tmp, &left, arena);
5941 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005942 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005943 }
5944 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005945 return 1;
5946 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005947 if (tmp == NULL) {
5948 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
5949 return 1;
5950 }
5951 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005952 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005953 res = obj2ast_operator(tmp, &op, arena);
5954 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005955 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005956 }
5957 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005958 return 1;
5959 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005960 if (tmp == NULL) {
5961 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
5962 return 1;
5963 }
5964 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005965 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005966 res = obj2ast_expr(tmp, &right, arena);
5967 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005968 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005969 }
5970 *out = BinOp(left, op, right, lineno, col_offset, arena);
5971 if (*out == NULL) goto failed;
5972 return 0;
5973 }
5974 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
5975 if (isinstance == -1) {
5976 return 1;
5977 }
5978 if (isinstance) {
5979 unaryop_ty op;
5980 expr_ty operand;
5981
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005982 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5983 return 1;
5984 }
5985 if (tmp == NULL) {
5986 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
5987 return 1;
5988 }
5989 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005990 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005991 res = obj2ast_unaryop(tmp, &op, arena);
5992 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005993 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005994 }
5995 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005996 return 1;
5997 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005998 if (tmp == NULL) {
5999 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
6000 return 1;
6001 }
6002 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006003 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006004 res = obj2ast_expr(tmp, &operand, arena);
6005 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006006 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006007 }
6008 *out = UnaryOp(op, operand, lineno, col_offset, arena);
6009 if (*out == NULL) goto failed;
6010 return 0;
6011 }
6012 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
6013 if (isinstance == -1) {
6014 return 1;
6015 }
6016 if (isinstance) {
6017 arguments_ty args;
6018 expr_ty body;
6019
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006020 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
6021 return 1;
6022 }
6023 if (tmp == NULL) {
6024 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
6025 return 1;
6026 }
6027 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006028 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006029 res = obj2ast_arguments(tmp, &args, arena);
6030 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006031 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006032 }
6033 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006034 return 1;
6035 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006036 if (tmp == NULL) {
6037 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
6038 return 1;
6039 }
6040 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006041 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006042 res = obj2ast_expr(tmp, &body, arena);
6043 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006044 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006045 }
6046 *out = Lambda(args, body, lineno, col_offset, arena);
6047 if (*out == NULL) goto failed;
6048 return 0;
6049 }
6050 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
6051 if (isinstance == -1) {
6052 return 1;
6053 }
6054 if (isinstance) {
6055 expr_ty test;
6056 expr_ty body;
6057 expr_ty orelse;
6058
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006059 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
6060 return 1;
6061 }
6062 if (tmp == NULL) {
6063 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
6064 return 1;
6065 }
6066 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006067 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006068 res = obj2ast_expr(tmp, &test, arena);
6069 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006070 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006071 }
6072 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006073 return 1;
6074 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006075 if (tmp == NULL) {
6076 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
6077 return 1;
6078 }
6079 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006080 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006081 res = obj2ast_expr(tmp, &body, arena);
6082 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006083 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006084 }
6085 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006086 return 1;
6087 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006088 if (tmp == NULL) {
6089 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6090 return 1;
6091 }
6092 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006093 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006094 res = obj2ast_expr(tmp, &orelse, arena);
6095 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006096 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006097 }
6098 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
6099 if (*out == NULL) goto failed;
6100 return 0;
6101 }
6102 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6103 if (isinstance == -1) {
6104 return 1;
6105 }
6106 if (isinstance) {
6107 asdl_seq* keys;
6108 asdl_seq* values;
6109
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006110 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6111 return 1;
6112 }
6113 if (tmp == NULL) {
6114 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6115 return 1;
6116 }
6117 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006118 int res;
6119 Py_ssize_t len;
6120 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006121 if (!PyList_Check(tmp)) {
6122 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6123 goto failed;
6124 }
6125 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006126 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006127 if (keys == NULL) goto failed;
6128 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006129 expr_ty val;
6130 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006131 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006132 if (len != PyList_GET_SIZE(tmp)) {
6133 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6134 goto failed;
6135 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006136 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006137 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006138 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006139 }
6140 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006141 return 1;
6142 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006143 if (tmp == NULL) {
6144 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6145 return 1;
6146 }
6147 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006148 int res;
6149 Py_ssize_t len;
6150 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006151 if (!PyList_Check(tmp)) {
6152 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6153 goto failed;
6154 }
6155 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006156 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006157 if (values == NULL) goto failed;
6158 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006159 expr_ty val;
6160 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006161 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006162 if (len != PyList_GET_SIZE(tmp)) {
6163 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6164 goto failed;
6165 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006166 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006167 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006168 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006169 }
6170 *out = Dict(keys, values, lineno, col_offset, arena);
6171 if (*out == NULL) goto failed;
6172 return 0;
6173 }
6174 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6175 if (isinstance == -1) {
6176 return 1;
6177 }
6178 if (isinstance) {
6179 asdl_seq* elts;
6180
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006181 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6182 return 1;
6183 }
6184 if (tmp == NULL) {
6185 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6186 return 1;
6187 }
6188 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006189 int res;
6190 Py_ssize_t len;
6191 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006192 if (!PyList_Check(tmp)) {
6193 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6194 goto failed;
6195 }
6196 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006197 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006198 if (elts == NULL) goto failed;
6199 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006200 expr_ty val;
6201 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006202 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006203 if (len != PyList_GET_SIZE(tmp)) {
6204 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6205 goto failed;
6206 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006207 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006208 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006209 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006210 }
6211 *out = Set(elts, lineno, col_offset, arena);
6212 if (*out == NULL) goto failed;
6213 return 0;
6214 }
6215 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6216 if (isinstance == -1) {
6217 return 1;
6218 }
6219 if (isinstance) {
6220 expr_ty elt;
6221 asdl_seq* generators;
6222
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006223 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6224 return 1;
6225 }
6226 if (tmp == NULL) {
6227 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6228 return 1;
6229 }
6230 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006231 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006232 res = obj2ast_expr(tmp, &elt, arena);
6233 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006234 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006235 }
6236 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006237 return 1;
6238 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006239 if (tmp == NULL) {
6240 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6241 return 1;
6242 }
6243 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006244 int res;
6245 Py_ssize_t len;
6246 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006247 if (!PyList_Check(tmp)) {
6248 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6249 goto failed;
6250 }
6251 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006252 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006253 if (generators == NULL) goto failed;
6254 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006255 comprehension_ty val;
6256 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006257 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006258 if (len != PyList_GET_SIZE(tmp)) {
6259 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6260 goto failed;
6261 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006262 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006263 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006264 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006265 }
6266 *out = ListComp(elt, generators, lineno, col_offset, arena);
6267 if (*out == NULL) goto failed;
6268 return 0;
6269 }
6270 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6271 if (isinstance == -1) {
6272 return 1;
6273 }
6274 if (isinstance) {
6275 expr_ty elt;
6276 asdl_seq* generators;
6277
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006278 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6279 return 1;
6280 }
6281 if (tmp == NULL) {
6282 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6283 return 1;
6284 }
6285 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006286 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006287 res = obj2ast_expr(tmp, &elt, arena);
6288 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006289 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006290 }
6291 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006292 return 1;
6293 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006294 if (tmp == NULL) {
6295 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6296 return 1;
6297 }
6298 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006299 int res;
6300 Py_ssize_t len;
6301 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006302 if (!PyList_Check(tmp)) {
6303 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6304 goto failed;
6305 }
6306 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006307 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006308 if (generators == NULL) goto failed;
6309 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006310 comprehension_ty val;
6311 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006312 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006313 if (len != PyList_GET_SIZE(tmp)) {
6314 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6315 goto failed;
6316 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006317 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006318 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006319 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006320 }
6321 *out = SetComp(elt, generators, lineno, col_offset, arena);
6322 if (*out == NULL) goto failed;
6323 return 0;
6324 }
6325 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6326 if (isinstance == -1) {
6327 return 1;
6328 }
6329 if (isinstance) {
6330 expr_ty key;
6331 expr_ty value;
6332 asdl_seq* generators;
6333
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006334 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6335 return 1;
6336 }
6337 if (tmp == NULL) {
6338 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6339 return 1;
6340 }
6341 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006342 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006343 res = obj2ast_expr(tmp, &key, arena);
6344 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006345 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006346 }
6347 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006348 return 1;
6349 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006350 if (tmp == NULL) {
6351 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6352 return 1;
6353 }
6354 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006355 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006356 res = obj2ast_expr(tmp, &value, arena);
6357 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006358 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006359 }
6360 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006361 return 1;
6362 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006363 if (tmp == NULL) {
6364 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6365 return 1;
6366 }
6367 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006368 int res;
6369 Py_ssize_t len;
6370 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006371 if (!PyList_Check(tmp)) {
6372 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6373 goto failed;
6374 }
6375 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006376 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006377 if (generators == NULL) goto failed;
6378 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006379 comprehension_ty val;
6380 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006381 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006382 if (len != PyList_GET_SIZE(tmp)) {
6383 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6384 goto failed;
6385 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006386 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006387 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006388 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006389 }
6390 *out = DictComp(key, value, generators, lineno, col_offset, arena);
6391 if (*out == NULL) goto failed;
6392 return 0;
6393 }
6394 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6395 if (isinstance == -1) {
6396 return 1;
6397 }
6398 if (isinstance) {
6399 expr_ty elt;
6400 asdl_seq* generators;
6401
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006402 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6403 return 1;
6404 }
6405 if (tmp == NULL) {
6406 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6407 return 1;
6408 }
6409 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006410 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006411 res = obj2ast_expr(tmp, &elt, arena);
6412 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006413 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006414 }
6415 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006416 return 1;
6417 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006418 if (tmp == NULL) {
6419 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6420 return 1;
6421 }
6422 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006423 int res;
6424 Py_ssize_t len;
6425 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006426 if (!PyList_Check(tmp)) {
6427 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6428 goto failed;
6429 }
6430 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006431 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006432 if (generators == NULL) goto failed;
6433 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006434 comprehension_ty val;
6435 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006436 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006437 if (len != PyList_GET_SIZE(tmp)) {
6438 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6439 goto failed;
6440 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006441 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006442 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006443 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006444 }
6445 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
6446 if (*out == NULL) goto failed;
6447 return 0;
6448 }
Yury Selivanov75445082015-05-11 22:57:16 -04006449 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6450 if (isinstance == -1) {
6451 return 1;
6452 }
6453 if (isinstance) {
6454 expr_ty value;
6455
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006456 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6457 return 1;
6458 }
6459 if (tmp == NULL) {
6460 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6461 return 1;
6462 }
6463 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006464 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006465 res = obj2ast_expr(tmp, &value, arena);
6466 if (res != 0) goto failed;
6467 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006468 }
6469 *out = Await(value, lineno, col_offset, arena);
6470 if (*out == NULL) goto failed;
6471 return 0;
6472 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006473 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6474 if (isinstance == -1) {
6475 return 1;
6476 }
6477 if (isinstance) {
6478 expr_ty value;
6479
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006480 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6481 return 1;
6482 }
6483 if (tmp == NULL || tmp == Py_None) {
6484 Py_CLEAR(tmp);
6485 value = NULL;
6486 }
6487 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006488 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006489 res = obj2ast_expr(tmp, &value, arena);
6490 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006491 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006492 }
6493 *out = Yield(value, lineno, col_offset, arena);
6494 if (*out == NULL) goto failed;
6495 return 0;
6496 }
6497 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6498 if (isinstance == -1) {
6499 return 1;
6500 }
6501 if (isinstance) {
6502 expr_ty value;
6503
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006504 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6505 return 1;
6506 }
6507 if (tmp == NULL) {
6508 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6509 return 1;
6510 }
6511 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006512 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006513 res = obj2ast_expr(tmp, &value, arena);
6514 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006515 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006516 }
6517 *out = YieldFrom(value, lineno, col_offset, arena);
6518 if (*out == NULL) goto failed;
6519 return 0;
6520 }
6521 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6522 if (isinstance == -1) {
6523 return 1;
6524 }
6525 if (isinstance) {
6526 expr_ty left;
6527 asdl_int_seq* ops;
6528 asdl_seq* comparators;
6529
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006530 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6531 return 1;
6532 }
6533 if (tmp == NULL) {
6534 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6535 return 1;
6536 }
6537 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006538 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006539 res = obj2ast_expr(tmp, &left, arena);
6540 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006541 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006542 }
6543 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006544 return 1;
6545 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006546 if (tmp == NULL) {
6547 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6548 return 1;
6549 }
6550 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006551 int res;
6552 Py_ssize_t len;
6553 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006554 if (!PyList_Check(tmp)) {
6555 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6556 goto failed;
6557 }
6558 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006559 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006560 if (ops == NULL) goto failed;
6561 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006562 cmpop_ty val;
6563 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006564 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006565 if (len != PyList_GET_SIZE(tmp)) {
6566 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
6567 goto failed;
6568 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006569 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006570 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006571 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006572 }
6573 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006574 return 1;
6575 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006576 if (tmp == NULL) {
6577 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
6578 return 1;
6579 }
6580 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006581 int res;
6582 Py_ssize_t len;
6583 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006584 if (!PyList_Check(tmp)) {
6585 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6586 goto failed;
6587 }
6588 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006589 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006590 if (comparators == NULL) goto failed;
6591 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006592 expr_ty val;
6593 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006594 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006595 if (len != PyList_GET_SIZE(tmp)) {
6596 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
6597 goto failed;
6598 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006599 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006600 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006601 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006602 }
6603 *out = Compare(left, ops, comparators, lineno, col_offset, arena);
6604 if (*out == NULL) goto failed;
6605 return 0;
6606 }
6607 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
6608 if (isinstance == -1) {
6609 return 1;
6610 }
6611 if (isinstance) {
6612 expr_ty func;
6613 asdl_seq* args;
6614 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006615
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006616 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
6617 return 1;
6618 }
6619 if (tmp == NULL) {
6620 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
6621 return 1;
6622 }
6623 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006624 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006625 res = obj2ast_expr(tmp, &func, arena);
6626 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006627 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006628 }
6629 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006630 return 1;
6631 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006632 if (tmp == NULL) {
6633 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
6634 return 1;
6635 }
6636 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006637 int res;
6638 Py_ssize_t len;
6639 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006640 if (!PyList_Check(tmp)) {
6641 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6642 goto failed;
6643 }
6644 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006645 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006646 if (args == NULL) goto failed;
6647 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006648 expr_ty val;
6649 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006650 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006651 if (len != PyList_GET_SIZE(tmp)) {
6652 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
6653 goto failed;
6654 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006655 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006656 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006657 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006658 }
6659 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006660 return 1;
6661 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006662 if (tmp == NULL) {
6663 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
6664 return 1;
6665 }
6666 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006667 int res;
6668 Py_ssize_t len;
6669 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006670 if (!PyList_Check(tmp)) {
6671 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6672 goto failed;
6673 }
6674 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006675 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006676 if (keywords == NULL) goto failed;
6677 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006678 keyword_ty val;
6679 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006680 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006681 if (len != PyList_GET_SIZE(tmp)) {
6682 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
6683 goto failed;
6684 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006685 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006686 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006687 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006688 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04006689 *out = Call(func, args, keywords, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006690 if (*out == NULL) goto failed;
6691 return 0;
6692 }
6693 isinstance = PyObject_IsInstance(obj, (PyObject*)Num_type);
6694 if (isinstance == -1) {
6695 return 1;
6696 }
6697 if (isinstance) {
6698 object n;
6699
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006700 if (_PyObject_LookupAttrId(obj, &PyId_n, &tmp) < 0) {
6701 return 1;
6702 }
6703 if (tmp == NULL) {
6704 PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
6705 return 1;
6706 }
6707 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006708 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006709 res = obj2ast_object(tmp, &n, arena);
6710 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006711 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006712 }
6713 *out = Num(n, lineno, col_offset, arena);
6714 if (*out == NULL) goto failed;
6715 return 0;
6716 }
6717 isinstance = PyObject_IsInstance(obj, (PyObject*)Str_type);
6718 if (isinstance == -1) {
6719 return 1;
6720 }
6721 if (isinstance) {
6722 string s;
6723
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006724 if (_PyObject_LookupAttrId(obj, &PyId_s, &tmp) < 0) {
6725 return 1;
6726 }
6727 if (tmp == NULL) {
6728 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
6729 return 1;
6730 }
6731 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006732 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006733 res = obj2ast_string(tmp, &s, arena);
6734 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006735 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006736 }
6737 *out = Str(s, lineno, col_offset, arena);
6738 if (*out == NULL) goto failed;
6739 return 0;
6740 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006741 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
6742 if (isinstance == -1) {
6743 return 1;
6744 }
6745 if (isinstance) {
6746 expr_ty value;
6747 int conversion;
6748 expr_ty format_spec;
6749
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006750 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6751 return 1;
6752 }
6753 if (tmp == NULL) {
6754 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
6755 return 1;
6756 }
6757 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006758 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006759 res = obj2ast_expr(tmp, &value, arena);
6760 if (res != 0) goto failed;
6761 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006762 }
6763 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006764 return 1;
6765 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006766 if (tmp == NULL || tmp == Py_None) {
6767 Py_CLEAR(tmp);
6768 conversion = 0;
6769 }
6770 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006771 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006772 res = obj2ast_int(tmp, &conversion, arena);
6773 if (res != 0) goto failed;
6774 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006775 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006776 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
6777 return 1;
6778 }
6779 if (tmp == NULL || tmp == Py_None) {
6780 Py_CLEAR(tmp);
6781 format_spec = NULL;
6782 }
6783 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006784 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006785 res = obj2ast_expr(tmp, &format_spec, arena);
6786 if (res != 0) goto failed;
6787 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006788 }
6789 *out = FormattedValue(value, conversion, format_spec, lineno,
6790 col_offset, arena);
6791 if (*out == NULL) goto failed;
6792 return 0;
6793 }
6794 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
6795 if (isinstance == -1) {
6796 return 1;
6797 }
6798 if (isinstance) {
6799 asdl_seq* values;
6800
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006801 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
6802 return 1;
6803 }
6804 if (tmp == NULL) {
6805 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
6806 return 1;
6807 }
6808 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006809 int res;
6810 Py_ssize_t len;
6811 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006812 if (!PyList_Check(tmp)) {
6813 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6814 goto failed;
6815 }
6816 len = PyList_GET_SIZE(tmp);
6817 values = _Py_asdl_seq_new(len, arena);
6818 if (values == NULL) goto failed;
6819 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006820 expr_ty val;
6821 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006822 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03006823 if (len != PyList_GET_SIZE(tmp)) {
6824 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
6825 goto failed;
6826 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006827 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006828 }
6829 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006830 }
6831 *out = JoinedStr(values, lineno, col_offset, arena);
6832 if (*out == NULL) goto failed;
6833 return 0;
6834 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006835 isinstance = PyObject_IsInstance(obj, (PyObject*)Bytes_type);
6836 if (isinstance == -1) {
6837 return 1;
6838 }
6839 if (isinstance) {
6840 bytes s;
6841
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006842 if (_PyObject_LookupAttrId(obj, &PyId_s, &tmp) < 0) {
6843 return 1;
6844 }
6845 if (tmp == NULL) {
6846 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Bytes");
6847 return 1;
6848 }
6849 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006850 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006851 res = obj2ast_bytes(tmp, &s, arena);
6852 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006853 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006854 }
6855 *out = Bytes(s, lineno, col_offset, arena);
6856 if (*out == NULL) goto failed;
6857 return 0;
6858 }
Victor Stinneree4b59c2013-07-27 00:01:35 +02006859 isinstance = PyObject_IsInstance(obj, (PyObject*)NameConstant_type);
6860 if (isinstance == -1) {
6861 return 1;
6862 }
6863 if (isinstance) {
6864 singleton value;
6865
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006866 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6867 return 1;
6868 }
6869 if (tmp == NULL) {
6870 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NameConstant");
6871 return 1;
6872 }
6873 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02006874 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02006875 res = obj2ast_singleton(tmp, &value, arena);
6876 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02006877 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02006878 }
6879 *out = NameConstant(value, lineno, col_offset, arena);
6880 if (*out == NULL) goto failed;
6881 return 0;
6882 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006883 isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type);
6884 if (isinstance == -1) {
6885 return 1;
6886 }
6887 if (isinstance) {
6888
6889 *out = Ellipsis(lineno, col_offset, arena);
6890 if (*out == NULL) goto failed;
6891 return 0;
6892 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006893 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
6894 if (isinstance == -1) {
6895 return 1;
6896 }
6897 if (isinstance) {
6898 constant value;
6899
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006900 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6901 return 1;
6902 }
6903 if (tmp == NULL) {
6904 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
6905 return 1;
6906 }
6907 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006908 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006909 res = obj2ast_constant(tmp, &value, arena);
6910 if (res != 0) goto failed;
6911 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006912 }
6913 *out = Constant(value, lineno, col_offset, arena);
6914 if (*out == NULL) goto failed;
6915 return 0;
6916 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006917 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
6918 if (isinstance == -1) {
6919 return 1;
6920 }
6921 if (isinstance) {
6922 expr_ty value;
6923 identifier attr;
6924 expr_context_ty ctx;
6925
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006926 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6927 return 1;
6928 }
6929 if (tmp == NULL) {
6930 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
6931 return 1;
6932 }
6933 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006934 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006935 res = obj2ast_expr(tmp, &value, arena);
6936 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006937 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006938 }
6939 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006940 return 1;
6941 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006942 if (tmp == NULL) {
6943 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
6944 return 1;
6945 }
6946 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006947 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006948 res = obj2ast_identifier(tmp, &attr, arena);
6949 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006950 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006951 }
6952 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006953 return 1;
6954 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006955 if (tmp == NULL) {
6956 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
6957 return 1;
6958 }
6959 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006960 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006961 res = obj2ast_expr_context(tmp, &ctx, arena);
6962 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006963 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006964 }
6965 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
6966 if (*out == NULL) goto failed;
6967 return 0;
6968 }
6969 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
6970 if (isinstance == -1) {
6971 return 1;
6972 }
6973 if (isinstance) {
6974 expr_ty value;
6975 slice_ty slice;
6976 expr_context_ty ctx;
6977
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006978 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6979 return 1;
6980 }
6981 if (tmp == NULL) {
6982 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
6983 return 1;
6984 }
6985 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006986 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006987 res = obj2ast_expr(tmp, &value, arena);
6988 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006989 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006990 }
6991 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006992 return 1;
6993 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006994 if (tmp == NULL) {
6995 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
6996 return 1;
6997 }
6998 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006999 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007000 res = obj2ast_slice(tmp, &slice, arena);
7001 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007002 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007003 }
7004 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007005 return 1;
7006 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007007 if (tmp == NULL) {
7008 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
7009 return 1;
7010 }
7011 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007012 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007013 res = obj2ast_expr_context(tmp, &ctx, arena);
7014 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007015 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007016 }
7017 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
7018 if (*out == NULL) goto failed;
7019 return 0;
7020 }
7021 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
7022 if (isinstance == -1) {
7023 return 1;
7024 }
7025 if (isinstance) {
7026 expr_ty value;
7027 expr_context_ty ctx;
7028
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007029 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7030 return 1;
7031 }
7032 if (tmp == NULL) {
7033 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
7034 return 1;
7035 }
7036 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007037 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007038 res = obj2ast_expr(tmp, &value, arena);
7039 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007040 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007041 }
7042 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007043 return 1;
7044 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007045 if (tmp == NULL) {
7046 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
7047 return 1;
7048 }
7049 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007050 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007051 res = obj2ast_expr_context(tmp, &ctx, arena);
7052 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007053 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007054 }
7055 *out = Starred(value, ctx, lineno, col_offset, arena);
7056 if (*out == NULL) goto failed;
7057 return 0;
7058 }
7059 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
7060 if (isinstance == -1) {
7061 return 1;
7062 }
7063 if (isinstance) {
7064 identifier id;
7065 expr_context_ty ctx;
7066
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007067 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
7068 return 1;
7069 }
7070 if (tmp == NULL) {
7071 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
7072 return 1;
7073 }
7074 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007075 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007076 res = obj2ast_identifier(tmp, &id, arena);
7077 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007078 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007079 }
7080 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007081 return 1;
7082 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007083 if (tmp == NULL) {
7084 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
7085 return 1;
7086 }
7087 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007088 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007089 res = obj2ast_expr_context(tmp, &ctx, arena);
7090 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007091 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007092 }
7093 *out = Name(id, ctx, lineno, col_offset, arena);
7094 if (*out == NULL) goto failed;
7095 return 0;
7096 }
7097 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7098 if (isinstance == -1) {
7099 return 1;
7100 }
7101 if (isinstance) {
7102 asdl_seq* elts;
7103 expr_context_ty ctx;
7104
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007105 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7106 return 1;
7107 }
7108 if (tmp == NULL) {
7109 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7110 return 1;
7111 }
7112 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007113 int res;
7114 Py_ssize_t len;
7115 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007116 if (!PyList_Check(tmp)) {
7117 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7118 goto failed;
7119 }
7120 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007121 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007122 if (elts == NULL) goto failed;
7123 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007124 expr_ty val;
7125 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007126 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007127 if (len != PyList_GET_SIZE(tmp)) {
7128 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7129 goto failed;
7130 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007131 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007132 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007133 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007134 }
7135 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007136 return 1;
7137 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007138 if (tmp == NULL) {
7139 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7140 return 1;
7141 }
7142 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007143 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007144 res = obj2ast_expr_context(tmp, &ctx, arena);
7145 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007146 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007147 }
7148 *out = List(elts, ctx, lineno, col_offset, arena);
7149 if (*out == NULL) goto failed;
7150 return 0;
7151 }
7152 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7153 if (isinstance == -1) {
7154 return 1;
7155 }
7156 if (isinstance) {
7157 asdl_seq* elts;
7158 expr_context_ty ctx;
7159
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007160 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7161 return 1;
7162 }
7163 if (tmp == NULL) {
7164 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7165 return 1;
7166 }
7167 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007168 int res;
7169 Py_ssize_t len;
7170 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007171 if (!PyList_Check(tmp)) {
7172 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7173 goto failed;
7174 }
7175 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007176 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007177 if (elts == NULL) goto failed;
7178 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007179 expr_ty val;
7180 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007181 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007182 if (len != PyList_GET_SIZE(tmp)) {
7183 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7184 goto failed;
7185 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007186 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007187 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007188 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007189 }
7190 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007191 return 1;
7192 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007193 if (tmp == NULL) {
7194 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7195 return 1;
7196 }
7197 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007198 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007199 res = obj2ast_expr_context(tmp, &ctx, arena);
7200 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007201 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007202 }
7203 *out = Tuple(elts, ctx, lineno, col_offset, arena);
7204 if (*out == NULL) goto failed;
7205 return 0;
7206 }
7207
7208 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7209 failed:
7210 Py_XDECREF(tmp);
7211 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007212}
7213
7214int
7215obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7216{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007217 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007218
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007219 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7220 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007221 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007222 }
7223 if (isinstance) {
7224 *out = Load;
7225 return 0;
7226 }
7227 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7228 if (isinstance == -1) {
7229 return 1;
7230 }
7231 if (isinstance) {
7232 *out = Store;
7233 return 0;
7234 }
7235 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7236 if (isinstance == -1) {
7237 return 1;
7238 }
7239 if (isinstance) {
7240 *out = Del;
7241 return 0;
7242 }
7243 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7244 if (isinstance == -1) {
7245 return 1;
7246 }
7247 if (isinstance) {
7248 *out = AugLoad;
7249 return 0;
7250 }
7251 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7252 if (isinstance == -1) {
7253 return 1;
7254 }
7255 if (isinstance) {
7256 *out = AugStore;
7257 return 0;
7258 }
7259 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7260 if (isinstance == -1) {
7261 return 1;
7262 }
7263 if (isinstance) {
7264 *out = Param;
7265 return 0;
7266 }
7267
7268 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7269 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007270}
7271
7272int
7273obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7274{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007275 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007276
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007277 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007278
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007279 if (obj == Py_None) {
7280 *out = NULL;
7281 return 0;
7282 }
7283 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7284 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007285 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007286 }
7287 if (isinstance) {
7288 expr_ty lower;
7289 expr_ty upper;
7290 expr_ty step;
7291
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007292 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7293 return 1;
7294 }
7295 if (tmp == NULL || tmp == Py_None) {
7296 Py_CLEAR(tmp);
7297 lower = NULL;
7298 }
7299 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007300 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007301 res = obj2ast_expr(tmp, &lower, arena);
7302 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007303 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007304 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007305 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7306 return 1;
7307 }
7308 if (tmp == NULL || tmp == Py_None) {
7309 Py_CLEAR(tmp);
7310 upper = NULL;
7311 }
7312 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007313 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007314 res = obj2ast_expr(tmp, &upper, arena);
7315 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007316 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007317 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007318 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
7319 return 1;
7320 }
7321 if (tmp == NULL || tmp == Py_None) {
7322 Py_CLEAR(tmp);
7323 step = NULL;
7324 }
7325 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007326 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007327 res = obj2ast_expr(tmp, &step, arena);
7328 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007329 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007330 }
7331 *out = Slice(lower, upper, step, arena);
7332 if (*out == NULL) goto failed;
7333 return 0;
7334 }
7335 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7336 if (isinstance == -1) {
7337 return 1;
7338 }
7339 if (isinstance) {
7340 asdl_seq* dims;
7341
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007342 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7343 return 1;
7344 }
7345 if (tmp == NULL) {
7346 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7347 return 1;
7348 }
7349 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007350 int res;
7351 Py_ssize_t len;
7352 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007353 if (!PyList_Check(tmp)) {
7354 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7355 goto failed;
7356 }
7357 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007358 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007359 if (dims == NULL) goto failed;
7360 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007361 slice_ty val;
7362 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007363 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007364 if (len != PyList_GET_SIZE(tmp)) {
7365 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7366 goto failed;
7367 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007368 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007369 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007370 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007371 }
7372 *out = ExtSlice(dims, arena);
7373 if (*out == NULL) goto failed;
7374 return 0;
7375 }
7376 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7377 if (isinstance == -1) {
7378 return 1;
7379 }
7380 if (isinstance) {
7381 expr_ty value;
7382
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007383 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7384 return 1;
7385 }
7386 if (tmp == NULL) {
7387 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7388 return 1;
7389 }
7390 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007391 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007392 res = obj2ast_expr(tmp, &value, arena);
7393 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007394 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007395 }
7396 *out = Index(value, arena);
7397 if (*out == NULL) goto failed;
7398 return 0;
7399 }
7400
7401 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7402 failed:
7403 Py_XDECREF(tmp);
7404 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007405}
7406
7407int
7408obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7409{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007410 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007411
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007412 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7413 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007414 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007415 }
7416 if (isinstance) {
7417 *out = And;
7418 return 0;
7419 }
7420 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7421 if (isinstance == -1) {
7422 return 1;
7423 }
7424 if (isinstance) {
7425 *out = Or;
7426 return 0;
7427 }
7428
7429 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7430 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007431}
7432
7433int
7434obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7435{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007436 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007437
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007438 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7439 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007440 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007441 }
7442 if (isinstance) {
7443 *out = Add;
7444 return 0;
7445 }
7446 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7447 if (isinstance == -1) {
7448 return 1;
7449 }
7450 if (isinstance) {
7451 *out = Sub;
7452 return 0;
7453 }
7454 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7455 if (isinstance == -1) {
7456 return 1;
7457 }
7458 if (isinstance) {
7459 *out = Mult;
7460 return 0;
7461 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007462 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7463 if (isinstance == -1) {
7464 return 1;
7465 }
7466 if (isinstance) {
7467 *out = MatMult;
7468 return 0;
7469 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007470 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7471 if (isinstance == -1) {
7472 return 1;
7473 }
7474 if (isinstance) {
7475 *out = Div;
7476 return 0;
7477 }
7478 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7479 if (isinstance == -1) {
7480 return 1;
7481 }
7482 if (isinstance) {
7483 *out = Mod;
7484 return 0;
7485 }
7486 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7487 if (isinstance == -1) {
7488 return 1;
7489 }
7490 if (isinstance) {
7491 *out = Pow;
7492 return 0;
7493 }
7494 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7495 if (isinstance == -1) {
7496 return 1;
7497 }
7498 if (isinstance) {
7499 *out = LShift;
7500 return 0;
7501 }
7502 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7503 if (isinstance == -1) {
7504 return 1;
7505 }
7506 if (isinstance) {
7507 *out = RShift;
7508 return 0;
7509 }
7510 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7511 if (isinstance == -1) {
7512 return 1;
7513 }
7514 if (isinstance) {
7515 *out = BitOr;
7516 return 0;
7517 }
7518 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7519 if (isinstance == -1) {
7520 return 1;
7521 }
7522 if (isinstance) {
7523 *out = BitXor;
7524 return 0;
7525 }
7526 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7527 if (isinstance == -1) {
7528 return 1;
7529 }
7530 if (isinstance) {
7531 *out = BitAnd;
7532 return 0;
7533 }
7534 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7535 if (isinstance == -1) {
7536 return 1;
7537 }
7538 if (isinstance) {
7539 *out = FloorDiv;
7540 return 0;
7541 }
7542
7543 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7544 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007545}
7546
7547int
7548obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7549{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007550 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007551
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007552 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7553 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007554 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007555 }
7556 if (isinstance) {
7557 *out = Invert;
7558 return 0;
7559 }
7560 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7561 if (isinstance == -1) {
7562 return 1;
7563 }
7564 if (isinstance) {
7565 *out = Not;
7566 return 0;
7567 }
7568 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7569 if (isinstance == -1) {
7570 return 1;
7571 }
7572 if (isinstance) {
7573 *out = UAdd;
7574 return 0;
7575 }
7576 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7577 if (isinstance == -1) {
7578 return 1;
7579 }
7580 if (isinstance) {
7581 *out = USub;
7582 return 0;
7583 }
7584
7585 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7586 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007587}
7588
7589int
7590obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7591{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007592 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007593
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007594 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7595 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007596 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007597 }
7598 if (isinstance) {
7599 *out = Eq;
7600 return 0;
7601 }
7602 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7603 if (isinstance == -1) {
7604 return 1;
7605 }
7606 if (isinstance) {
7607 *out = NotEq;
7608 return 0;
7609 }
7610 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7611 if (isinstance == -1) {
7612 return 1;
7613 }
7614 if (isinstance) {
7615 *out = Lt;
7616 return 0;
7617 }
7618 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7619 if (isinstance == -1) {
7620 return 1;
7621 }
7622 if (isinstance) {
7623 *out = LtE;
7624 return 0;
7625 }
7626 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7627 if (isinstance == -1) {
7628 return 1;
7629 }
7630 if (isinstance) {
7631 *out = Gt;
7632 return 0;
7633 }
7634 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
7635 if (isinstance == -1) {
7636 return 1;
7637 }
7638 if (isinstance) {
7639 *out = GtE;
7640 return 0;
7641 }
7642 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
7643 if (isinstance == -1) {
7644 return 1;
7645 }
7646 if (isinstance) {
7647 *out = Is;
7648 return 0;
7649 }
7650 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
7651 if (isinstance == -1) {
7652 return 1;
7653 }
7654 if (isinstance) {
7655 *out = IsNot;
7656 return 0;
7657 }
7658 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
7659 if (isinstance == -1) {
7660 return 1;
7661 }
7662 if (isinstance) {
7663 *out = In;
7664 return 0;
7665 }
7666 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
7667 if (isinstance == -1) {
7668 return 1;
7669 }
7670 if (isinstance) {
7671 *out = NotIn;
7672 return 0;
7673 }
7674
7675 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
7676 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007677}
7678
7679int
7680obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
7681{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007682 PyObject* tmp = NULL;
7683 expr_ty target;
7684 expr_ty iter;
7685 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007686 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007687
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007688 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
7689 return 1;
7690 }
7691 if (tmp == NULL) {
7692 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
7693 return 1;
7694 }
7695 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007696 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007697 res = obj2ast_expr(tmp, &target, arena);
7698 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007699 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007700 }
7701 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007702 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007703 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007704 if (tmp == NULL) {
7705 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
7706 return 1;
7707 }
7708 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007709 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007710 res = obj2ast_expr(tmp, &iter, arena);
7711 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007712 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007713 }
7714 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007715 return 1;
7716 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007717 if (tmp == NULL) {
7718 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
7719 return 1;
7720 }
7721 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007722 int res;
7723 Py_ssize_t len;
7724 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007725 if (!PyList_Check(tmp)) {
7726 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7727 goto failed;
7728 }
7729 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007730 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007731 if (ifs == NULL) goto failed;
7732 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007733 expr_ty val;
7734 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007735 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007736 if (len != PyList_GET_SIZE(tmp)) {
7737 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
7738 goto failed;
7739 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007740 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007741 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007742 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007743 }
7744 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007745 return 1;
7746 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007747 if (tmp == NULL) {
7748 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
7749 return 1;
7750 }
7751 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007752 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007753 res = obj2ast_int(tmp, &is_async, arena);
7754 if (res != 0) goto failed;
7755 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007756 }
7757 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007758 return 0;
7759failed:
7760 Py_XDECREF(tmp);
7761 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007762}
7763
7764int
7765obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
7766{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007767 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00007768
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007769 PyObject *tmp = NULL;
7770 int lineno;
7771 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007772
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007773 if (obj == Py_None) {
7774 *out = NULL;
7775 return 0;
7776 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007777 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7778 return 1;
7779 }
7780 if (tmp == NULL) {
7781 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
7782 return 1;
7783 }
7784 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007785 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007786 res = obj2ast_int(tmp, &lineno, arena);
7787 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007788 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007789 }
7790 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007791 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007792 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007793 if (tmp == NULL) {
7794 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
7795 return 1;
7796 }
7797 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007798 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007799 res = obj2ast_int(tmp, &col_offset, arena);
7800 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007801 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007802 }
7803 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
7804 if (isinstance == -1) {
7805 return 1;
7806 }
7807 if (isinstance) {
7808 expr_ty type;
7809 identifier name;
7810 asdl_seq* body;
7811
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007812 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
7813 return 1;
7814 }
7815 if (tmp == NULL || tmp == Py_None) {
7816 Py_CLEAR(tmp);
7817 type = NULL;
7818 }
7819 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007820 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007821 res = obj2ast_expr(tmp, &type, arena);
7822 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007823 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007824 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007825 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
7826 return 1;
7827 }
7828 if (tmp == NULL || tmp == Py_None) {
7829 Py_CLEAR(tmp);
7830 name = NULL;
7831 }
7832 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007833 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007834 res = obj2ast_identifier(tmp, &name, arena);
7835 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007836 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007837 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007838 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
7839 return 1;
7840 }
7841 if (tmp == NULL) {
7842 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
7843 return 1;
7844 }
7845 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007846 int res;
7847 Py_ssize_t len;
7848 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007849 if (!PyList_Check(tmp)) {
7850 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7851 goto failed;
7852 }
7853 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007854 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007855 if (body == NULL) goto failed;
7856 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007857 stmt_ty val;
7858 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007859 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007860 if (len != PyList_GET_SIZE(tmp)) {
7861 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
7862 goto failed;
7863 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007864 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007865 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007866 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007867 }
7868 *out = ExceptHandler(type, name, body, lineno, col_offset, arena);
7869 if (*out == NULL) goto failed;
7870 return 0;
7871 }
7872
7873 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
7874 failed:
7875 Py_XDECREF(tmp);
7876 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007877}
7878
7879int
7880obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
7881{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007882 PyObject* tmp = NULL;
7883 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007884 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007885 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007886 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007887 arg_ty kwarg;
7888 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007889
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007890 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
7891 return 1;
7892 }
7893 if (tmp == NULL) {
7894 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
7895 return 1;
7896 }
7897 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007898 int res;
7899 Py_ssize_t len;
7900 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007901 if (!PyList_Check(tmp)) {
7902 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7903 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007904 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007905 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007906 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007907 if (args == NULL) goto failed;
7908 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007909 arg_ty val;
7910 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007911 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007912 if (len != PyList_GET_SIZE(tmp)) {
7913 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
7914 goto failed;
7915 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007916 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007917 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007918 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007919 }
7920 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007921 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007922 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007923 if (tmp == NULL || tmp == Py_None) {
7924 Py_CLEAR(tmp);
7925 vararg = NULL;
7926 }
7927 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007928 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007929 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007930 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007931 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007932 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007933 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
7934 return 1;
7935 }
7936 if (tmp == NULL) {
7937 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
7938 return 1;
7939 }
7940 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007941 int res;
7942 Py_ssize_t len;
7943 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007944 if (!PyList_Check(tmp)) {
7945 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7946 goto failed;
7947 }
7948 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007949 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007950 if (kwonlyargs == NULL) goto failed;
7951 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007952 arg_ty val;
7953 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007954 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007955 if (len != PyList_GET_SIZE(tmp)) {
7956 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
7957 goto failed;
7958 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007959 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007960 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007961 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007962 }
7963 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007964 return 1;
7965 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007966 if (tmp == NULL) {
7967 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
7968 return 1;
7969 }
7970 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007971 int res;
7972 Py_ssize_t len;
7973 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007974 if (!PyList_Check(tmp)) {
7975 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7976 goto failed;
7977 }
7978 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007979 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007980 if (kw_defaults == NULL) goto failed;
7981 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007982 expr_ty val;
7983 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007984 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007985 if (len != PyList_GET_SIZE(tmp)) {
7986 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
7987 goto failed;
7988 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007989 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007990 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007991 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007992 }
7993 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007994 return 1;
7995 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007996 if (tmp == NULL || tmp == Py_None) {
7997 Py_CLEAR(tmp);
7998 kwarg = NULL;
7999 }
8000 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008001 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008002 res = obj2ast_arg(tmp, &kwarg, arena);
8003 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02008004 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008005 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008006 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
8007 return 1;
8008 }
8009 if (tmp == NULL) {
8010 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
8011 return 1;
8012 }
8013 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008014 int res;
8015 Py_ssize_t len;
8016 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008017 if (!PyList_Check(tmp)) {
8018 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8019 goto failed;
8020 }
8021 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008022 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008023 if (defaults == NULL) goto failed;
8024 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008025 expr_ty val;
8026 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008027 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008028 if (len != PyList_GET_SIZE(tmp)) {
8029 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
8030 goto failed;
8031 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008032 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008033 }
Victor Stinnerb3189902013-07-27 00:04:42 +02008034 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008035 }
8036 *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults,
8037 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008038 return 0;
8039failed:
8040 Py_XDECREF(tmp);
8041 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008042}
8043
8044int
8045obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
8046{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008047 PyObject* tmp = NULL;
8048 identifier arg;
8049 expr_ty annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01008050 int lineno;
8051 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008052
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008053 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8054 return 1;
8055 }
8056 if (tmp == NULL) {
8057 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
8058 return 1;
8059 }
8060 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008061 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008062 res = obj2ast_identifier(tmp, &arg, arena);
8063 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008064 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008065 }
8066 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008067 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008068 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008069 if (tmp == NULL || tmp == Py_None) {
8070 Py_CLEAR(tmp);
8071 annotation = NULL;
8072 }
8073 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008074 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008075 res = obj2ast_expr(tmp, &annotation, arena);
8076 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008077 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008078 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008079 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8080 return 1;
8081 }
8082 if (tmp == NULL) {
8083 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
8084 return 1;
8085 }
8086 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008087 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008088 res = obj2ast_int(tmp, &lineno, arena);
8089 if (res != 0) goto failed;
8090 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008091 }
8092 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008093 return 1;
8094 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008095 if (tmp == NULL) {
8096 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
8097 return 1;
8098 }
8099 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008100 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008101 res = obj2ast_int(tmp, &col_offset, arena);
8102 if (res != 0) goto failed;
8103 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008104 }
8105 *out = arg(arg, annotation, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008106 return 0;
8107failed:
8108 Py_XDECREF(tmp);
8109 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008110}
8111
8112int
8113obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8114{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008115 PyObject* tmp = NULL;
8116 identifier arg;
8117 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008118
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008119 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8120 return 1;
8121 }
8122 if (tmp == NULL || tmp == Py_None) {
8123 Py_CLEAR(tmp);
8124 arg = NULL;
8125 }
8126 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008127 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008128 res = obj2ast_identifier(tmp, &arg, arena);
8129 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008130 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008131 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008132 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8133 return 1;
8134 }
8135 if (tmp == NULL) {
8136 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8137 return 1;
8138 }
8139 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008140 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008141 res = obj2ast_expr(tmp, &value, arena);
8142 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008143 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008144 }
8145 *out = keyword(arg, value, arena);
8146 return 0;
8147failed:
8148 Py_XDECREF(tmp);
8149 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008150}
8151
8152int
8153obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8154{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008155 PyObject* tmp = NULL;
8156 identifier name;
8157 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008158
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008159 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8160 return 1;
8161 }
8162 if (tmp == NULL) {
8163 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8164 return 1;
8165 }
8166 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008167 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008168 res = obj2ast_identifier(tmp, &name, arena);
8169 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008170 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008171 }
8172 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008173 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008174 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008175 if (tmp == NULL || tmp == Py_None) {
8176 Py_CLEAR(tmp);
8177 asname = NULL;
8178 }
8179 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008180 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008181 res = obj2ast_identifier(tmp, &asname, arena);
8182 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008183 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008184 }
8185 *out = alias(name, asname, arena);
8186 return 0;
8187failed:
8188 Py_XDECREF(tmp);
8189 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008190}
8191
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008192int
8193obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8194{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008195 PyObject* tmp = NULL;
8196 expr_ty context_expr;
8197 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008198
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008199 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8200 return 1;
8201 }
8202 if (tmp == NULL) {
8203 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8204 return 1;
8205 }
8206 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008207 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008208 res = obj2ast_expr(tmp, &context_expr, arena);
8209 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008210 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008211 }
8212 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008213 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008214 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008215 if (tmp == NULL || tmp == Py_None) {
8216 Py_CLEAR(tmp);
8217 optional_vars = NULL;
8218 }
8219 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008220 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008221 res = obj2ast_expr(tmp, &optional_vars, arena);
8222 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008223 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008224 }
8225 *out = withitem(context_expr, optional_vars, arena);
8226 return 0;
8227failed:
8228 Py_XDECREF(tmp);
8229 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008230}
8231
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008232
Martin v. Löwis1a214512008-06-11 05:26:20 +00008233static struct PyModuleDef _astmodule = {
8234 PyModuleDef_HEAD_INIT, "_ast"
8235};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008236PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008237PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008238{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008239 PyObject *m, *d;
8240 if (!init_types()) return NULL;
8241 m = PyModule_Create(&_astmodule);
8242 if (!m) return NULL;
8243 d = PyModule_GetDict(m);
8244 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008245 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008246 return NULL;
8247 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8248 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8249 NULL;
8250 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8251 0) return NULL;
8252 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8253 return NULL;
8254 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8255 NULL;
8256 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8257 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8258 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008259 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8260 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008261 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8262 return NULL;
8263 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8264 NULL;
8265 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8266 NULL;
8267 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8268 NULL;
8269 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8270 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008271 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8272 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008273 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008274 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8275 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008276 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8277 NULL;
8278 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8279 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008280 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8281 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008282 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8283 NULL;
8284 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8285 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8286 NULL;
8287 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8288 NULL;
8289 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8290 return NULL;
8291 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8292 NULL;
8293 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8294 return NULL;
8295 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8296 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8297 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8298 NULL;
8299 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8300 return NULL;
8301 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8302 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8303 NULL;
8304 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8305 NULL;
8306 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8307 NULL;
8308 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8309 NULL;
8310 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8311 NULL;
8312 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8313 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8314 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8315 return NULL;
8316 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8317 NULL;
8318 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8319 return NULL;
8320 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8321 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008322 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8323 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008324 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8325 NULL;
8326 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8327 return NULL;
8328 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8329 NULL;
8330 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
8331 if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return NULL;
8332 if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008333 if (PyDict_SetItemString(d, "FormattedValue",
8334 (PyObject*)FormattedValue_type) < 0) return NULL;
8335 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8336 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008337 if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return
8338 NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008339 if (PyDict_SetItemString(d, "NameConstant", (PyObject*)NameConstant_type) <
8340 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008341 if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
8342 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008343 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8344 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008345 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8346 return NULL;
8347 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8348 return NULL;
8349 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8350 NULL;
8351 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8352 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8353 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8354 NULL;
8355 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8356 0) return NULL;
8357 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8358 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8359 NULL;
8360 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8361 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8362 NULL;
8363 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8364 return NULL;
8365 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8366 NULL;
8367 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8368 NULL;
8369 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8370 NULL;
8371 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8372 return NULL;
8373 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8374 NULL;
8375 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8376 NULL;
8377 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8378 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8379 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8380 return NULL;
8381 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8382 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8383 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008384 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8385 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008386 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8387 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8388 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8389 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8390 NULL;
8391 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8392 NULL;
8393 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8394 NULL;
8395 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8396 NULL;
8397 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8398 NULL;
8399 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8400 return NULL;
8401 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8402 NULL;
8403 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8404 NULL;
8405 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8406 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8407 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8408 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8409 NULL;
8410 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8411 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8412 NULL;
8413 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8414 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8415 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8416 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8417 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8418 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8419 NULL;
8420 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8421 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8422 NULL;
8423 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8424 < 0) return NULL;
8425 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8426 < 0) return NULL;
8427 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8428 < 0) return NULL;
8429 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8430 return NULL;
8431 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8432 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8433 NULL;
8434 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8435 NULL;
8436 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8437 return NULL;
8438 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008439}
8440
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008441
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008442PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008443{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008444 if (!init_types())
8445 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008446 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008447}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008448
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008449/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8450mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008451{
8452 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008453 PyObject *req_type[3];
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008454 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008455 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008456
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008457 req_type[0] = (PyObject*)Module_type;
8458 req_type[1] = (PyObject*)Expression_type;
8459 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008460
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008461 assert(0 <= mode && mode <= 2);
8462
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008463 if (!init_types())
8464 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008465
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008466 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8467 if (isinstance == -1)
8468 return NULL;
8469 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008470 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8471 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008472 return NULL;
8473 }
8474 if (obj2ast_mod(ast, &res, arena) != 0)
8475 return NULL;
8476 else
8477 return res;
8478}
8479
8480int PyAST_Check(PyObject* obj)
8481{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008482 if (!init_types())
8483 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00008484 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008485}
8486
Martin v. Löwis5b222132007-06-10 09:51:05 +00008487