blob: d0416eb639c233127023ee920b8c4802b5e6427e [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);
Guido van Rossumdcfcd142019-01-31 03:40:27 -080013_Py_IDENTIFIER(type_ignores);
Neal Norwitz53d960c2006-02-28 22:47:29 +000014static char *Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020015 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -080016 "type_ignores",
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};
Guido van Rossumdcfcd142019-01-31 03:40:27 -080026static PyTypeObject *FunctionType_type;
27_Py_IDENTIFIER(argtypes);
28_Py_IDENTIFIER(returns);
29static char *FunctionType_fields[]={
30 "argtypes",
31 "returns",
32};
Neal Norwitz53d960c2006-02-28 22:47:29 +000033static PyTypeObject *Suite_type;
34static char *Suite_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020035 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000036};
Neal Norwitz53d960c2006-02-28 22:47:29 +000037static PyTypeObject *stmt_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020038_Py_IDENTIFIER(lineno);
39_Py_IDENTIFIER(col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +000040_Py_IDENTIFIER(end_lineno);
41_Py_IDENTIFIER(end_col_offset);
Neal Norwitz53d960c2006-02-28 22:47:29 +000042static char *stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +020043 "lineno",
44 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +000045 "end_lineno",
46 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +000047};
Martin v. Löwisbd260da2006-02-26 19:42:26 +000048static PyObject* ast2obj_stmt(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000049static PyTypeObject *FunctionDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020050_Py_IDENTIFIER(name);
51_Py_IDENTIFIER(args);
52_Py_IDENTIFIER(decorator_list);
Guido van Rossumdcfcd142019-01-31 03:40:27 -080053_Py_IDENTIFIER(type_comment);
Neal Norwitz53d960c2006-02-28 22:47:29 +000054static char *FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020055 "name",
56 "args",
57 "body",
58 "decorator_list",
59 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -080060 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000061};
Yury Selivanov75445082015-05-11 22:57:16 -040062static PyTypeObject *AsyncFunctionDef_type;
63static char *AsyncFunctionDef_fields[]={
64 "name",
65 "args",
66 "body",
67 "decorator_list",
68 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -080069 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -040070};
Neal Norwitz53d960c2006-02-28 22:47:29 +000071static PyTypeObject *ClassDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020072_Py_IDENTIFIER(bases);
73_Py_IDENTIFIER(keywords);
Neal Norwitz53d960c2006-02-28 22:47:29 +000074static char *ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020075 "name",
76 "bases",
77 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +020078 "body",
79 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000080};
Neal Norwitz53d960c2006-02-28 22:47:29 +000081static PyTypeObject *Return_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020082_Py_IDENTIFIER(value);
Neal Norwitz53d960c2006-02-28 22:47:29 +000083static char *Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020084 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000085};
Neal Norwitz53d960c2006-02-28 22:47:29 +000086static PyTypeObject *Delete_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020087_Py_IDENTIFIER(targets);
Neal Norwitz53d960c2006-02-28 22:47:29 +000088static char *Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020089 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000090};
Neal Norwitz53d960c2006-02-28 22:47:29 +000091static PyTypeObject *Assign_type;
92static char *Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020093 "targets",
94 "value",
Guido van Rossumdcfcd142019-01-31 03:40:27 -080095 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000096};
Neal Norwitz53d960c2006-02-28 22:47:29 +000097static PyTypeObject *AugAssign_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020098_Py_IDENTIFIER(target);
99_Py_IDENTIFIER(op);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000100static char *AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200101 "target",
102 "op",
103 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000104};
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700105static PyTypeObject *AnnAssign_type;
106_Py_IDENTIFIER(annotation);
107_Py_IDENTIFIER(simple);
108static char *AnnAssign_fields[]={
109 "target",
110 "annotation",
111 "value",
112 "simple",
113};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000114static PyTypeObject *For_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200115_Py_IDENTIFIER(iter);
116_Py_IDENTIFIER(orelse);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000117static char *For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200118 "target",
119 "iter",
120 "body",
121 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800122 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000123};
Yury Selivanov75445082015-05-11 22:57:16 -0400124static PyTypeObject *AsyncFor_type;
125static char *AsyncFor_fields[]={
126 "target",
127 "iter",
128 "body",
129 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800130 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400131};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000132static PyTypeObject *While_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200133_Py_IDENTIFIER(test);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000134static char *While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200135 "test",
136 "body",
137 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000138};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000139static PyTypeObject *If_type;
140static char *If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200141 "test",
142 "body",
143 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000144};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000145static PyTypeObject *With_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200146_Py_IDENTIFIER(items);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000147static char *With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200148 "items",
149 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800150 "type_comment",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000151};
Yury Selivanov75445082015-05-11 22:57:16 -0400152static PyTypeObject *AsyncWith_type;
153static char *AsyncWith_fields[]={
154 "items",
155 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800156 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400157};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000158static PyTypeObject *Raise_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200159_Py_IDENTIFIER(exc);
160_Py_IDENTIFIER(cause);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000161static char *Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200162 "exc",
163 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000164};
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500165static PyTypeObject *Try_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200166_Py_IDENTIFIER(handlers);
167_Py_IDENTIFIER(finalbody);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500168static char *Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200169 "body",
170 "handlers",
171 "orelse",
172 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000173};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000174static PyTypeObject *Assert_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200175_Py_IDENTIFIER(msg);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000176static char *Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200177 "test",
178 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000179};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000180static PyTypeObject *Import_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200181_Py_IDENTIFIER(names);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000182static char *Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200183 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000184};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000185static PyTypeObject *ImportFrom_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200186_Py_IDENTIFIER(module);
187_Py_IDENTIFIER(level);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000188static char *ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200189 "module",
190 "names",
191 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000192};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000193static PyTypeObject *Global_type;
194static char *Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200195 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000196};
Jeremy Hylton81e95022007-02-27 06:50:52 +0000197static PyTypeObject *Nonlocal_type;
198static char *Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200199 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000200};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000201static PyTypeObject *Expr_type;
202static char *Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200203 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000204};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000205static PyTypeObject *Pass_type;
206static PyTypeObject *Break_type;
207static PyTypeObject *Continue_type;
208static PyTypeObject *expr_type;
209static char *expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200210 "lineno",
211 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000212 "end_lineno",
213 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000214};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000215static PyObject* ast2obj_expr(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000216static PyTypeObject *BoolOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200217_Py_IDENTIFIER(values);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000218static char *BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200219 "op",
220 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000221};
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700222static PyTypeObject *NamedExpr_type;
223static char *NamedExpr_fields[]={
224 "target",
225 "value",
226};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000227static PyTypeObject *BinOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200228_Py_IDENTIFIER(left);
229_Py_IDENTIFIER(right);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000230static char *BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200231 "left",
232 "op",
233 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000234};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000235static PyTypeObject *UnaryOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200236_Py_IDENTIFIER(operand);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000237static char *UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200238 "op",
239 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000240};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000241static PyTypeObject *Lambda_type;
242static char *Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200243 "args",
244 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000245};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000246static PyTypeObject *IfExp_type;
247static char *IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200248 "test",
249 "body",
250 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000251};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000252static PyTypeObject *Dict_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200253_Py_IDENTIFIER(keys);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000254static char *Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200255 "keys",
256 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000257};
Guido van Rossum86e58e22006-08-28 15:27:34 +0000258static PyTypeObject *Set_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200259_Py_IDENTIFIER(elts);
Guido van Rossum86e58e22006-08-28 15:27:34 +0000260static char *Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200261 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000262};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000263static PyTypeObject *ListComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200264_Py_IDENTIFIER(elt);
265_Py_IDENTIFIER(generators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000266static char *ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200267 "elt",
268 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000269};
Nick Coghlan650f0d02007-04-15 12:05:43 +0000270static PyTypeObject *SetComp_type;
271static char *SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200272 "elt",
273 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000274};
Guido van Rossum992d4a32007-07-11 13:09:30 +0000275static PyTypeObject *DictComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200276_Py_IDENTIFIER(key);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000277static char *DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200278 "key",
279 "value",
280 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000281};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000282static PyTypeObject *GeneratorExp_type;
283static char *GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200284 "elt",
285 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000286};
Yury Selivanov75445082015-05-11 22:57:16 -0400287static PyTypeObject *Await_type;
288static char *Await_fields[]={
289 "value",
290};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000291static PyTypeObject *Yield_type;
292static char *Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200293 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500294};
295static PyTypeObject *YieldFrom_type;
296static char *YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200297 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000298};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000299static PyTypeObject *Compare_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200300_Py_IDENTIFIER(ops);
301_Py_IDENTIFIER(comparators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000302static char *Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200303 "left",
304 "ops",
305 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000306};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000307static PyTypeObject *Call_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200308_Py_IDENTIFIER(func);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000309static char *Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200310 "func",
311 "args",
312 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000313};
Eric V. Smith235a6f02015-09-19 14:51:32 -0400314static PyTypeObject *FormattedValue_type;
315_Py_IDENTIFIER(conversion);
316_Py_IDENTIFIER(format_spec);
317static char *FormattedValue_fields[]={
318 "value",
319 "conversion",
320 "format_spec",
321};
322static PyTypeObject *JoinedStr_type;
323static char *JoinedStr_fields[]={
324 "values",
325};
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100326static PyTypeObject *Constant_type;
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700327_Py_IDENTIFIER(kind);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100328static char *Constant_fields[]={
329 "value",
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700330 "kind",
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100331};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000332static PyTypeObject *Attribute_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200333_Py_IDENTIFIER(attr);
334_Py_IDENTIFIER(ctx);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000335static char *Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200336 "value",
337 "attr",
338 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000339};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000340static PyTypeObject *Subscript_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200341_Py_IDENTIFIER(slice);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000342static char *Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200343 "value",
344 "slice",
345 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000346};
Guido van Rossum0368b722007-05-11 16:50:42 +0000347static PyTypeObject *Starred_type;
348static char *Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200349 "value",
350 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000351};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000352static PyTypeObject *Name_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200353_Py_IDENTIFIER(id);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000354static char *Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200355 "id",
356 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000357};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000358static PyTypeObject *List_type;
359static char *List_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 *Tuple_type;
364static char *Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200365 "elts",
366 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000367};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000368static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000369static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
Serhiy Storchakad8b3a982019-03-05 20:42:06 +0200370*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000371static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000372static PyTypeObject *Load_type;
373static PyTypeObject *Store_type;
374static PyTypeObject *Del_type;
375static PyTypeObject *AugLoad_type;
376static PyTypeObject *AugStore_type;
377static PyTypeObject *Param_type;
378static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000379static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000380static PyTypeObject *Slice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200381_Py_IDENTIFIER(lower);
382_Py_IDENTIFIER(upper);
383_Py_IDENTIFIER(step);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000384static char *Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200385 "lower",
386 "upper",
387 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000388};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000389static PyTypeObject *ExtSlice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200390_Py_IDENTIFIER(dims);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000391static char *ExtSlice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200392 "dims",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000393};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000394static PyTypeObject *Index_type;
395static char *Index_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200396 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000397};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000398static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000399static PyObject *And_singleton, *Or_singleton;
400static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000401static PyTypeObject *And_type;
402static PyTypeObject *Or_type;
403static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000404static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
Benjamin Petersond51374e2014-04-09 23:55:56 -0400405*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton,
406*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton,
407*BitAnd_singleton, *FloorDiv_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000408static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000409static PyTypeObject *Add_type;
410static PyTypeObject *Sub_type;
411static PyTypeObject *Mult_type;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400412static PyTypeObject *MatMult_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000413static PyTypeObject *Div_type;
414static PyTypeObject *Mod_type;
415static PyTypeObject *Pow_type;
416static PyTypeObject *LShift_type;
417static PyTypeObject *RShift_type;
418static PyTypeObject *BitOr_type;
419static PyTypeObject *BitXor_type;
420static PyTypeObject *BitAnd_type;
421static PyTypeObject *FloorDiv_type;
422static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000423static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
424*USub_singleton;
425static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000426static PyTypeObject *Invert_type;
427static PyTypeObject *Not_type;
428static PyTypeObject *UAdd_type;
429static PyTypeObject *USub_type;
430static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000431static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
432*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
433*NotIn_singleton;
434static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000435static PyTypeObject *Eq_type;
436static PyTypeObject *NotEq_type;
437static PyTypeObject *Lt_type;
438static PyTypeObject *LtE_type;
439static PyTypeObject *Gt_type;
440static PyTypeObject *GtE_type;
441static PyTypeObject *Is_type;
442static PyTypeObject *IsNot_type;
443static PyTypeObject *In_type;
444static PyTypeObject *NotIn_type;
445static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000446static PyObject* ast2obj_comprehension(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200447_Py_IDENTIFIER(ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700448_Py_IDENTIFIER(is_async);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000449static char *comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200450 "target",
451 "iter",
452 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700453 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000454};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000455static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000456static char *excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200457 "lineno",
458 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000459 "end_lineno",
460 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000461};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000462static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000463static PyTypeObject *ExceptHandler_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200464_Py_IDENTIFIER(type);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000465static char *ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200466 "type",
467 "name",
468 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000469};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000470static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000471static PyObject* ast2obj_arguments(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200472_Py_IDENTIFIER(vararg);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200473_Py_IDENTIFIER(kwonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200474_Py_IDENTIFIER(kw_defaults);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700475_Py_IDENTIFIER(kwarg);
476_Py_IDENTIFIER(defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000477static char *arguments_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200478 "args",
479 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200480 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200481 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200482 "kwarg",
483 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000484};
Neal Norwitzc1505362006-12-28 06:47:50 +0000485static PyTypeObject *arg_type;
486static PyObject* ast2obj_arg(void*);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700487static char *arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200488 "lineno",
489 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000490 "end_lineno",
491 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700492};
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200493_Py_IDENTIFIER(arg);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000494static char *arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200495 "arg",
496 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800497 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +0000498};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000499static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000500static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000501static char *keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200502 "arg",
503 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000504};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000505static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000506static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200507_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000508static char *alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200509 "name",
510 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000511};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500512static PyTypeObject *withitem_type;
513static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200514_Py_IDENTIFIER(context_expr);
515_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500516static char *withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200517 "context_expr",
518 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500519};
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800520static PyTypeObject *type_ignore_type;
521static PyObject* ast2obj_type_ignore(void*);
522static PyTypeObject *TypeIgnore_type;
523static char *TypeIgnore_fields[]={
524 "lineno",
525};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000526
527
INADA Naokifc489082017-01-25 22:33:43 +0900528_Py_IDENTIFIER(_fields);
529_Py_IDENTIFIER(_attributes);
530
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700531typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100532 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700533 PyObject *dict;
534} AST_object;
535
Benjamin Peterson1767e022012-03-14 21:50:29 -0500536static void
537ast_dealloc(AST_object *self)
538{
INADA Naokia6296d32017-08-24 14:55:17 +0900539 /* bpo-31095: UnTrack is needed before calling any callbacks */
540 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500541 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200542 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500543}
544
Neal Norwitz207c9f32008-03-31 04:42:11 +0000545static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700546ast_traverse(AST_object *self, visitproc visit, void *arg)
547{
548 Py_VISIT(self->dict);
549 return 0;
550}
551
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300552static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700553ast_clear(AST_object *self)
554{
555 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300556 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700557}
558
559static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000560ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
561{
562 Py_ssize_t i, numfields = 0;
563 int res = -1;
564 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200565 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
566 goto cleanup;
567 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000568 if (fields) {
569 numfields = PySequence_Size(fields);
570 if (numfields == -1)
571 goto cleanup;
572 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900573
Neal Norwitz207c9f32008-03-31 04:42:11 +0000574 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900575 if (numfields < PyTuple_GET_SIZE(args)) {
576 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
577 "%zd positional argument%s",
578 Py_TYPE(self)->tp_name,
579 numfields, numfields == 1 ? "" : "s");
580 res = -1;
581 goto cleanup;
582 }
583 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
584 /* cannot be reached when fields is NULL */
585 PyObject *name = PySequence_GetItem(fields, i);
586 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000587 res = -1;
588 goto cleanup;
589 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900590 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
591 Py_DECREF(name);
592 if (res < 0)
593 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000594 }
595 if (kw) {
596 i = 0; /* needed by PyDict_Next */
597 while (PyDict_Next(kw, &i, &key, &value)) {
598 res = PyObject_SetAttr(self, key, value);
599 if (res < 0)
600 goto cleanup;
601 }
602 }
603 cleanup:
604 Py_XDECREF(fields);
605 return res;
606}
607
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000608/* Pickling support */
609static PyObject *
610ast_type_reduce(PyObject *self, PyObject *unused)
611{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200612 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200613 PyObject *dict;
614 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
615 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000616 }
617 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200618 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000619 }
620 return Py_BuildValue("O()", Py_TYPE(self));
621}
622
623static PyMethodDef ast_type_methods[] = {
624 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
625 {NULL}
626};
627
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700628static PyGetSetDef ast_type_getsets[] = {
629 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
630 {NULL}
631};
632
Neal Norwitz207c9f32008-03-31 04:42:11 +0000633static PyTypeObject AST_type = {
634 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000635 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700636 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000637 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500638 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000639 0, /* tp_print */
640 0, /* tp_getattr */
641 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000642 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000643 0, /* tp_repr */
644 0, /* tp_as_number */
645 0, /* tp_as_sequence */
646 0, /* tp_as_mapping */
647 0, /* tp_hash */
648 0, /* tp_call */
649 0, /* tp_str */
650 PyObject_GenericGetAttr, /* tp_getattro */
651 PyObject_GenericSetAttr, /* tp_setattro */
652 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700653 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000654 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700655 (traverseproc)ast_traverse, /* tp_traverse */
656 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000657 0, /* tp_richcompare */
658 0, /* tp_weaklistoffset */
659 0, /* tp_iter */
660 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000661 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000662 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700663 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000664 0, /* tp_base */
665 0, /* tp_dict */
666 0, /* tp_descr_get */
667 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700668 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000669 (initproc)ast_type_init, /* tp_init */
670 PyType_GenericAlloc, /* tp_alloc */
671 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700672 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000673};
674
675
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000676static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
677{
INADA Naokifc489082017-01-25 22:33:43 +0900678 _Py_IDENTIFIER(__module__);
679 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000680 PyObject *fnames, *result;
681 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000682 fnames = PyTuple_New(num_fields);
683 if (!fnames) return NULL;
684 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000685 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000686 if (!field) {
687 Py_DECREF(fnames);
688 return NULL;
689 }
690 PyTuple_SET_ITEM(fnames, i, field);
691 }
INADA Naokifc489082017-01-25 22:33:43 +0900692 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
693 type, base,
694 _PyUnicode_FromId(&PyId__fields), fnames,
695 _PyUnicode_FromId(&PyId___module__),
696 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000697 Py_DECREF(fnames);
698 return (PyTypeObject*)result;
699}
700
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000701static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
702{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000703 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000704 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000705 if (!l)
706 return 0;
707 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000708 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000709 if (!s) {
710 Py_DECREF(l);
711 return 0;
712 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000713 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000714 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200715 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000716 Py_DECREF(l);
717 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000718}
719
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000720/* Conversion AST -> Python */
721
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000722static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
723{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700724 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000725 PyObject *result = PyList_New(n);
726 PyObject *value;
727 if (!result)
728 return NULL;
729 for (i = 0; i < n; i++) {
730 value = func(asdl_seq_GET(seq, i));
731 if (!value) {
732 Py_DECREF(result);
733 return NULL;
734 }
735 PyList_SET_ITEM(result, i, value);
736 }
737 return result;
738}
739
740static PyObject* ast2obj_object(void *o)
741{
742 if (!o)
743 o = Py_None;
744 Py_INCREF((PyObject*)o);
745 return (PyObject*)o;
746}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500747#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100748#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000749#define ast2obj_identifier ast2obj_object
750#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500751#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000752
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000753static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000754{
Christian Heimes217cfd12007-12-02 14:31:20 +0000755 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000756}
757
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000758/* Conversion Python -> AST */
759
760static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
761{
762 if (obj == Py_None)
763 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200764 if (obj) {
765 if (PyArena_AddPyObject(arena, obj) < 0) {
766 *out = NULL;
767 return -1;
768 }
769 Py_INCREF(obj);
770 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000771 *out = obj;
772 return 0;
773}
774
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100775static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
776{
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300777 if (PyArena_AddPyObject(arena, obj) < 0) {
778 *out = NULL;
779 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100780 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300781 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100782 *out = obj;
783 return 0;
784}
785
Benjamin Peterson180e6352011-07-22 11:09:07 -0500786static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500787{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500788 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
789 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500790 return 1;
791 }
792 return obj2ast_object(obj, out, arena);
793}
794
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800795static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
796{
797 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
798 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
799 return 1;
800 }
801 return obj2ast_object(obj, out, arena);
802}
803
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000804static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
805{
806 int i;
807 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100808 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000809 return 1;
810 }
811
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300812 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000813 if (i == -1 && PyErr_Occurred())
814 return 1;
815 *out = i;
816 return 0;
817}
818
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000819static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000820{
821 PyObject *empty_tuple, *d;
822 if (PyType_Ready(&AST_type) < 0)
823 return -1;
824 d = AST_type.tp_dict;
825 empty_tuple = PyTuple_New(0);
826 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900827 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
828 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000829 Py_XDECREF(empty_tuple);
830 return -1;
831 }
832 Py_DECREF(empty_tuple);
833 return 0;
834}
835
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000836
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000837static int init_types(void)
838{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200839 static int initialized;
840 if (initialized) return 1;
841 if (add_ast_fields() < 0) return 0;
842 mod_type = make_type("mod", &AST_type, NULL, 0);
843 if (!mod_type) return 0;
844 if (!add_attributes(mod_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800845 Module_type = make_type("Module", mod_type, Module_fields, 2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200846 if (!Module_type) return 0;
847 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
848 1);
849 if (!Interactive_type) return 0;
850 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
851 if (!Expression_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800852 FunctionType_type = make_type("FunctionType", mod_type,
853 FunctionType_fields, 2);
854 if (!FunctionType_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200855 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
856 if (!Suite_type) return 0;
857 stmt_type = make_type("stmt", &AST_type, NULL, 0);
858 if (!stmt_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000859 if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200860 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800861 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200862 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400863 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800864 AsyncFunctionDef_fields, 6);
Yury Selivanov75445082015-05-11 22:57:16 -0400865 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300866 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200867 if (!ClassDef_type) return 0;
868 Return_type = make_type("Return", stmt_type, Return_fields, 1);
869 if (!Return_type) return 0;
870 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
871 if (!Delete_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800872 Assign_type = make_type("Assign", stmt_type, Assign_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200873 if (!Assign_type) return 0;
874 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
875 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700876 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
877 if (!AnnAssign_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800878 For_type = make_type("For", stmt_type, For_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200879 if (!For_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800880 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400881 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200882 While_type = make_type("While", stmt_type, While_fields, 3);
883 if (!While_type) return 0;
884 If_type = make_type("If", stmt_type, If_fields, 3);
885 if (!If_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800886 With_type = make_type("With", stmt_type, With_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200887 if (!With_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800888 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 3);
Yury Selivanov75445082015-05-11 22:57:16 -0400889 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200890 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
891 if (!Raise_type) return 0;
892 Try_type = make_type("Try", stmt_type, Try_fields, 4);
893 if (!Try_type) return 0;
894 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
895 if (!Assert_type) return 0;
896 Import_type = make_type("Import", stmt_type, Import_fields, 1);
897 if (!Import_type) return 0;
898 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
899 if (!ImportFrom_type) return 0;
900 Global_type = make_type("Global", stmt_type, Global_fields, 1);
901 if (!Global_type) return 0;
902 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
903 if (!Nonlocal_type) return 0;
904 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
905 if (!Expr_type) return 0;
906 Pass_type = make_type("Pass", stmt_type, NULL, 0);
907 if (!Pass_type) return 0;
908 Break_type = make_type("Break", stmt_type, NULL, 0);
909 if (!Break_type) return 0;
910 Continue_type = make_type("Continue", stmt_type, NULL, 0);
911 if (!Continue_type) return 0;
912 expr_type = make_type("expr", &AST_type, NULL, 0);
913 if (!expr_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000914 if (!add_attributes(expr_type, expr_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200915 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
916 if (!BoolOp_type) return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700917 NamedExpr_type = make_type("NamedExpr", expr_type, NamedExpr_fields, 2);
918 if (!NamedExpr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200919 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;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400950 FormattedValue_type = make_type("FormattedValue", expr_type,
951 FormattedValue_fields, 3);
952 if (!FormattedValue_type) return 0;
953 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
954 if (!JoinedStr_type) return 0;
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700955 Constant_type = make_type("Constant", expr_type, Constant_fields, 2);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100956 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200957 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
958 if (!Attribute_type) return 0;
959 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
960 if (!Subscript_type) return 0;
961 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
962 if (!Starred_type) return 0;
963 Name_type = make_type("Name", expr_type, Name_fields, 2);
964 if (!Name_type) return 0;
965 List_type = make_type("List", expr_type, List_fields, 2);
966 if (!List_type) return 0;
967 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
968 if (!Tuple_type) return 0;
969 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
970 if (!expr_context_type) return 0;
971 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
972 Load_type = make_type("Load", expr_context_type, NULL, 0);
973 if (!Load_type) return 0;
974 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
975 if (!Load_singleton) return 0;
976 Store_type = make_type("Store", expr_context_type, NULL, 0);
977 if (!Store_type) return 0;
978 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
979 if (!Store_singleton) return 0;
980 Del_type = make_type("Del", expr_context_type, NULL, 0);
981 if (!Del_type) return 0;
982 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
983 if (!Del_singleton) return 0;
984 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
985 if (!AugLoad_type) return 0;
986 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
987 if (!AugLoad_singleton) return 0;
988 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
989 if (!AugStore_type) return 0;
990 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
991 if (!AugStore_singleton) return 0;
992 Param_type = make_type("Param", expr_context_type, NULL, 0);
993 if (!Param_type) return 0;
994 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
995 if (!Param_singleton) return 0;
996 slice_type = make_type("slice", &AST_type, NULL, 0);
997 if (!slice_type) return 0;
998 if (!add_attributes(slice_type, NULL, 0)) return 0;
999 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1000 if (!Slice_type) return 0;
1001 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1002 if (!ExtSlice_type) return 0;
1003 Index_type = make_type("Index", slice_type, Index_fields, 1);
1004 if (!Index_type) return 0;
1005 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1006 if (!boolop_type) return 0;
1007 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1008 And_type = make_type("And", boolop_type, NULL, 0);
1009 if (!And_type) return 0;
1010 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1011 if (!And_singleton) return 0;
1012 Or_type = make_type("Or", boolop_type, NULL, 0);
1013 if (!Or_type) return 0;
1014 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1015 if (!Or_singleton) return 0;
1016 operator_type = make_type("operator", &AST_type, NULL, 0);
1017 if (!operator_type) return 0;
1018 if (!add_attributes(operator_type, NULL, 0)) return 0;
1019 Add_type = make_type("Add", operator_type, NULL, 0);
1020 if (!Add_type) return 0;
1021 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1022 if (!Add_singleton) return 0;
1023 Sub_type = make_type("Sub", operator_type, NULL, 0);
1024 if (!Sub_type) return 0;
1025 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1026 if (!Sub_singleton) return 0;
1027 Mult_type = make_type("Mult", operator_type, NULL, 0);
1028 if (!Mult_type) return 0;
1029 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1030 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001031 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1032 if (!MatMult_type) return 0;
1033 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1034 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001035 Div_type = make_type("Div", operator_type, NULL, 0);
1036 if (!Div_type) return 0;
1037 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1038 if (!Div_singleton) return 0;
1039 Mod_type = make_type("Mod", operator_type, NULL, 0);
1040 if (!Mod_type) return 0;
1041 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1042 if (!Mod_singleton) return 0;
1043 Pow_type = make_type("Pow", operator_type, NULL, 0);
1044 if (!Pow_type) return 0;
1045 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1046 if (!Pow_singleton) return 0;
1047 LShift_type = make_type("LShift", operator_type, NULL, 0);
1048 if (!LShift_type) return 0;
1049 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1050 if (!LShift_singleton) return 0;
1051 RShift_type = make_type("RShift", operator_type, NULL, 0);
1052 if (!RShift_type) return 0;
1053 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1054 if (!RShift_singleton) return 0;
1055 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1056 if (!BitOr_type) return 0;
1057 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1058 if (!BitOr_singleton) return 0;
1059 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1060 if (!BitXor_type) return 0;
1061 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1062 if (!BitXor_singleton) return 0;
1063 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1064 if (!BitAnd_type) return 0;
1065 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1066 if (!BitAnd_singleton) return 0;
1067 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1068 if (!FloorDiv_type) return 0;
1069 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1070 if (!FloorDiv_singleton) return 0;
1071 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1072 if (!unaryop_type) return 0;
1073 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1074 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1075 if (!Invert_type) return 0;
1076 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1077 if (!Invert_singleton) return 0;
1078 Not_type = make_type("Not", unaryop_type, NULL, 0);
1079 if (!Not_type) return 0;
1080 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1081 if (!Not_singleton) return 0;
1082 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1083 if (!UAdd_type) return 0;
1084 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1085 if (!UAdd_singleton) return 0;
1086 USub_type = make_type("USub", unaryop_type, NULL, 0);
1087 if (!USub_type) return 0;
1088 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1089 if (!USub_singleton) return 0;
1090 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1091 if (!cmpop_type) return 0;
1092 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1093 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1094 if (!Eq_type) return 0;
1095 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1096 if (!Eq_singleton) return 0;
1097 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1098 if (!NotEq_type) return 0;
1099 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1100 if (!NotEq_singleton) return 0;
1101 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1102 if (!Lt_type) return 0;
1103 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1104 if (!Lt_singleton) return 0;
1105 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1106 if (!LtE_type) return 0;
1107 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1108 if (!LtE_singleton) return 0;
1109 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1110 if (!Gt_type) return 0;
1111 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1112 if (!Gt_singleton) return 0;
1113 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1114 if (!GtE_type) return 0;
1115 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1116 if (!GtE_singleton) return 0;
1117 Is_type = make_type("Is", cmpop_type, NULL, 0);
1118 if (!Is_type) return 0;
1119 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1120 if (!Is_singleton) return 0;
1121 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1122 if (!IsNot_type) return 0;
1123 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1124 if (!IsNot_singleton) return 0;
1125 In_type = make_type("In", cmpop_type, NULL, 0);
1126 if (!In_type) return 0;
1127 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1128 if (!In_singleton) return 0;
1129 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1130 if (!NotIn_type) return 0;
1131 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1132 if (!NotIn_singleton) return 0;
1133 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001134 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001135 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001136 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001137 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1138 if (!excepthandler_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001139 if (!add_attributes(excepthandler_type, excepthandler_attributes, 4))
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001140 return 0;
1141 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1142 ExceptHandler_fields, 3);
1143 if (!ExceptHandler_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001144 arguments_type = make_type("arguments", &AST_type, arguments_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001145 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001146 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001147 arg_type = make_type("arg", &AST_type, arg_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001148 if (!arg_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001149 if (!add_attributes(arg_type, arg_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001150 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1151 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001152 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001153 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1154 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001155 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001156 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1157 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001158 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001159 type_ignore_type = make_type("type_ignore", &AST_type, NULL, 0);
1160 if (!type_ignore_type) return 0;
1161 if (!add_attributes(type_ignore_type, NULL, 0)) return 0;
1162 TypeIgnore_type = make_type("TypeIgnore", type_ignore_type,
1163 TypeIgnore_fields, 1);
1164 if (!TypeIgnore_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001165 initialized = 1;
1166 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001167}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001168
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001169static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1170static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1171static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1172static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1173 arena);
1174static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1175static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1176static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1177static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1178static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1179static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1180 arena);
1181static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1182 arena);
1183static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1184static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1185static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1186static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001187static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001188static int obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena*
1189 arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001190
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001192Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001194 mod_ty p;
1195 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1196 if (!p)
1197 return NULL;
1198 p->kind = Module_kind;
1199 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001200 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001201 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202}
1203
1204mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001207 mod_ty p;
1208 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1209 if (!p)
1210 return NULL;
1211 p->kind = Interactive_kind;
1212 p->v.Interactive.body = body;
1213 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214}
1215
1216mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001219 mod_ty p;
1220 if (!body) {
1221 PyErr_SetString(PyExc_ValueError,
1222 "field body is required for Expression");
1223 return NULL;
1224 }
1225 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1226 if (!p)
1227 return NULL;
1228 p->kind = Expression_kind;
1229 p->v.Expression.body = body;
1230 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231}
1232
1233mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001234FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena)
1235{
1236 mod_ty p;
1237 if (!returns) {
1238 PyErr_SetString(PyExc_ValueError,
1239 "field returns is required for FunctionType");
1240 return NULL;
1241 }
1242 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1243 if (!p)
1244 return NULL;
1245 p->kind = FunctionType_kind;
1246 p->v.FunctionType.argtypes = argtypes;
1247 p->v.FunctionType.returns = returns;
1248 return p;
1249}
1250
1251mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001252Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001254 mod_ty p;
1255 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1256 if (!p)
1257 return NULL;
1258 p->kind = Suite_kind;
1259 p->v.Suite.body = body;
1260 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261}
1262
1263stmt_ty
1264FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001265 decorator_list, expr_ty returns, string type_comment, int lineno,
1266 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001268 stmt_ty p;
1269 if (!name) {
1270 PyErr_SetString(PyExc_ValueError,
1271 "field name is required for FunctionDef");
1272 return NULL;
1273 }
1274 if (!args) {
1275 PyErr_SetString(PyExc_ValueError,
1276 "field args is required for FunctionDef");
1277 return NULL;
1278 }
1279 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1280 if (!p)
1281 return NULL;
1282 p->kind = FunctionDef_kind;
1283 p->v.FunctionDef.name = name;
1284 p->v.FunctionDef.args = args;
1285 p->v.FunctionDef.body = body;
1286 p->v.FunctionDef.decorator_list = decorator_list;
1287 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001288 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001289 p->lineno = lineno;
1290 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001291 p->end_lineno = end_lineno;
1292 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001293 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001294}
1295
1296stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001297AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001298 * decorator_list, expr_ty returns, string type_comment, int
1299 lineno, int col_offset, int end_lineno, int end_col_offset,
1300 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001301{
1302 stmt_ty p;
1303 if (!name) {
1304 PyErr_SetString(PyExc_ValueError,
1305 "field name is required for AsyncFunctionDef");
1306 return NULL;
1307 }
1308 if (!args) {
1309 PyErr_SetString(PyExc_ValueError,
1310 "field args is required for AsyncFunctionDef");
1311 return NULL;
1312 }
1313 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1314 if (!p)
1315 return NULL;
1316 p->kind = AsyncFunctionDef_kind;
1317 p->v.AsyncFunctionDef.name = name;
1318 p->v.AsyncFunctionDef.args = args;
1319 p->v.AsyncFunctionDef.body = body;
1320 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1321 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001322 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001323 p->lineno = lineno;
1324 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001325 p->end_lineno = end_lineno;
1326 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001327 return p;
1328}
1329
1330stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001331ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001332 body, asdl_seq * decorator_list, int lineno, int col_offset, int
1333 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001335 stmt_ty p;
1336 if (!name) {
1337 PyErr_SetString(PyExc_ValueError,
1338 "field name is required for ClassDef");
1339 return NULL;
1340 }
1341 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1342 if (!p)
1343 return NULL;
1344 p->kind = ClassDef_kind;
1345 p->v.ClassDef.name = name;
1346 p->v.ClassDef.bases = bases;
1347 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001348 p->v.ClassDef.body = body;
1349 p->v.ClassDef.decorator_list = decorator_list;
1350 p->lineno = lineno;
1351 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001352 p->end_lineno = end_lineno;
1353 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001354 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355}
1356
1357stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001358Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
1359 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001361 stmt_ty p;
1362 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1363 if (!p)
1364 return NULL;
1365 p->kind = Return_kind;
1366 p->v.Return.value = value;
1367 p->lineno = lineno;
1368 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001369 p->end_lineno = end_lineno;
1370 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001371 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372}
1373
1374stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001375Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int
1376 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001378 stmt_ty p;
1379 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1380 if (!p)
1381 return NULL;
1382 p->kind = Delete_kind;
1383 p->v.Delete.targets = targets;
1384 p->lineno = lineno;
1385 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001386 p->end_lineno = end_lineno;
1387 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001388 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389}
1390
1391stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001392Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int
1393 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001395 stmt_ty p;
1396 if (!value) {
1397 PyErr_SetString(PyExc_ValueError,
1398 "field value is required for Assign");
1399 return NULL;
1400 }
1401 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1402 if (!p)
1403 return NULL;
1404 p->kind = Assign_kind;
1405 p->v.Assign.targets = targets;
1406 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001407 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001408 p->lineno = lineno;
1409 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001410 p->end_lineno = end_lineno;
1411 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001412 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413}
1414
1415stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001416AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001417 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001419 stmt_ty p;
1420 if (!target) {
1421 PyErr_SetString(PyExc_ValueError,
1422 "field target is required for AugAssign");
1423 return NULL;
1424 }
1425 if (!op) {
1426 PyErr_SetString(PyExc_ValueError,
1427 "field op is required for AugAssign");
1428 return NULL;
1429 }
1430 if (!value) {
1431 PyErr_SetString(PyExc_ValueError,
1432 "field value is required for AugAssign");
1433 return NULL;
1434 }
1435 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1436 if (!p)
1437 return NULL;
1438 p->kind = AugAssign_kind;
1439 p->v.AugAssign.target = target;
1440 p->v.AugAssign.op = op;
1441 p->v.AugAssign.value = value;
1442 p->lineno = lineno;
1443 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001444 p->end_lineno = end_lineno;
1445 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001446 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447}
1448
1449stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001450AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001451 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1452 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001453{
1454 stmt_ty p;
1455 if (!target) {
1456 PyErr_SetString(PyExc_ValueError,
1457 "field target is required for AnnAssign");
1458 return NULL;
1459 }
1460 if (!annotation) {
1461 PyErr_SetString(PyExc_ValueError,
1462 "field annotation is required for AnnAssign");
1463 return NULL;
1464 }
1465 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1466 if (!p)
1467 return NULL;
1468 p->kind = AnnAssign_kind;
1469 p->v.AnnAssign.target = target;
1470 p->v.AnnAssign.annotation = annotation;
1471 p->v.AnnAssign.value = value;
1472 p->v.AnnAssign.simple = simple;
1473 p->lineno = lineno;
1474 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001475 p->end_lineno = end_lineno;
1476 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001477 return p;
1478}
1479
1480stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001481For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string
1482 type_comment, int lineno, int col_offset, int end_lineno, int
1483 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001485 stmt_ty p;
1486 if (!target) {
1487 PyErr_SetString(PyExc_ValueError,
1488 "field target is required for For");
1489 return NULL;
1490 }
1491 if (!iter) {
1492 PyErr_SetString(PyExc_ValueError,
1493 "field iter is required for For");
1494 return NULL;
1495 }
1496 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1497 if (!p)
1498 return NULL;
1499 p->kind = For_kind;
1500 p->v.For.target = target;
1501 p->v.For.iter = iter;
1502 p->v.For.body = body;
1503 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001504 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001505 p->lineno = lineno;
1506 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001507 p->end_lineno = end_lineno;
1508 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001509 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510}
1511
1512stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001513AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse,
1514 string type_comment, int lineno, int col_offset, int end_lineno, int
1515 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001516{
1517 stmt_ty p;
1518 if (!target) {
1519 PyErr_SetString(PyExc_ValueError,
1520 "field target is required for AsyncFor");
1521 return NULL;
1522 }
1523 if (!iter) {
1524 PyErr_SetString(PyExc_ValueError,
1525 "field iter is required for AsyncFor");
1526 return NULL;
1527 }
1528 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1529 if (!p)
1530 return NULL;
1531 p->kind = AsyncFor_kind;
1532 p->v.AsyncFor.target = target;
1533 p->v.AsyncFor.iter = iter;
1534 p->v.AsyncFor.body = body;
1535 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001536 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001537 p->lineno = lineno;
1538 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001539 p->end_lineno = end_lineno;
1540 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001541 return p;
1542}
1543
1544stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001545While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001546 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001548 stmt_ty p;
1549 if (!test) {
1550 PyErr_SetString(PyExc_ValueError,
1551 "field test is required for While");
1552 return NULL;
1553 }
1554 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1555 if (!p)
1556 return NULL;
1557 p->kind = While_kind;
1558 p->v.While.test = test;
1559 p->v.While.body = body;
1560 p->v.While.orelse = orelse;
1561 p->lineno = lineno;
1562 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001563 p->end_lineno = end_lineno;
1564 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001565 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566}
1567
1568stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001569If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001570 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001572 stmt_ty p;
1573 if (!test) {
1574 PyErr_SetString(PyExc_ValueError,
1575 "field test is required for If");
1576 return NULL;
1577 }
1578 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1579 if (!p)
1580 return NULL;
1581 p->kind = If_kind;
1582 p->v.If.test = test;
1583 p->v.If.body = body;
1584 p->v.If.orelse = orelse;
1585 p->lineno = lineno;
1586 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001587 p->end_lineno = end_lineno;
1588 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001589 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590}
1591
1592stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001593With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int
1594 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +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 = With_kind;
1601 p->v.With.items = items;
1602 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001603 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001604 p->lineno = lineno;
1605 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001606 p->end_lineno = end_lineno;
1607 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001608 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001609}
1610
1611stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001612AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno,
1613 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001614{
1615 stmt_ty p;
1616 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1617 if (!p)
1618 return NULL;
1619 p->kind = AsyncWith_kind;
1620 p->v.AsyncWith.items = items;
1621 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001622 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001623 p->lineno = lineno;
1624 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001625 p->end_lineno = end_lineno;
1626 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001627 return p;
1628}
1629
1630stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001631Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
1632 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001633{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001634 stmt_ty p;
1635 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1636 if (!p)
1637 return NULL;
1638 p->kind = Raise_kind;
1639 p->v.Raise.exc = exc;
1640 p->v.Raise.cause = cause;
1641 p->lineno = lineno;
1642 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001643 p->end_lineno = end_lineno;
1644 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001645 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646}
1647
1648stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001649Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001650 finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset,
1651 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001652{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001653 stmt_ty p;
1654 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1655 if (!p)
1656 return NULL;
1657 p->kind = Try_kind;
1658 p->v.Try.body = body;
1659 p->v.Try.handlers = handlers;
1660 p->v.Try.orelse = orelse;
1661 p->v.Try.finalbody = finalbody;
1662 p->lineno = lineno;
1663 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001664 p->end_lineno = end_lineno;
1665 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001666 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667}
1668
1669stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001670Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
1671 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001673 stmt_ty p;
1674 if (!test) {
1675 PyErr_SetString(PyExc_ValueError,
1676 "field test is required for Assert");
1677 return NULL;
1678 }
1679 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1680 if (!p)
1681 return NULL;
1682 p->kind = Assert_kind;
1683 p->v.Assert.test = test;
1684 p->v.Assert.msg = msg;
1685 p->lineno = lineno;
1686 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001687 p->end_lineno = end_lineno;
1688 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001689 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690}
1691
1692stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001693Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1694 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001696 stmt_ty p;
1697 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1698 if (!p)
1699 return NULL;
1700 p->kind = Import_kind;
1701 p->v.Import.names = names;
1702 p->lineno = lineno;
1703 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001704 p->end_lineno = end_lineno;
1705 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001706 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001707}
1708
1709stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001710ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001711 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001713 stmt_ty p;
1714 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1715 if (!p)
1716 return NULL;
1717 p->kind = ImportFrom_kind;
1718 p->v.ImportFrom.module = module;
1719 p->v.ImportFrom.names = names;
1720 p->v.ImportFrom.level = level;
1721 p->lineno = lineno;
1722 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001723 p->end_lineno = end_lineno;
1724 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001725 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726}
1727
1728stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001729Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1730 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001732 stmt_ty p;
1733 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1734 if (!p)
1735 return NULL;
1736 p->kind = Global_kind;
1737 p->v.Global.names = names;
1738 p->lineno = lineno;
1739 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001740 p->end_lineno = end_lineno;
1741 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001742 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743}
1744
1745stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001746Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1747 end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00001748{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001749 stmt_ty p;
1750 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1751 if (!p)
1752 return NULL;
1753 p->kind = Nonlocal_kind;
1754 p->v.Nonlocal.names = names;
1755 p->lineno = lineno;
1756 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001757 p->end_lineno = end_lineno;
1758 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001759 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001760}
1761
1762stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001763Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
1764 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001765{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001766 stmt_ty p;
1767 if (!value) {
1768 PyErr_SetString(PyExc_ValueError,
1769 "field value is required for Expr");
1770 return NULL;
1771 }
1772 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1773 if (!p)
1774 return NULL;
1775 p->kind = Expr_kind;
1776 p->v.Expr.value = value;
1777 p->lineno = lineno;
1778 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001779 p->end_lineno = end_lineno;
1780 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001781 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782}
1783
1784stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001785Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1786 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001788 stmt_ty p;
1789 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1790 if (!p)
1791 return NULL;
1792 p->kind = Pass_kind;
1793 p->lineno = lineno;
1794 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001795 p->end_lineno = end_lineno;
1796 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001797 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798}
1799
1800stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001801Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1802 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001804 stmt_ty p;
1805 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1806 if (!p)
1807 return NULL;
1808 p->kind = Break_kind;
1809 p->lineno = lineno;
1810 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001811 p->end_lineno = end_lineno;
1812 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001813 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814}
1815
1816stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001817Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
1818 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001820 stmt_ty p;
1821 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1822 if (!p)
1823 return NULL;
1824 p->kind = Continue_kind;
1825 p->lineno = lineno;
1826 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001827 p->end_lineno = end_lineno;
1828 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001829 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830}
1831
1832expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001833BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int
1834 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001836 expr_ty p;
1837 if (!op) {
1838 PyErr_SetString(PyExc_ValueError,
1839 "field op is required for BoolOp");
1840 return NULL;
1841 }
1842 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1843 if (!p)
1844 return NULL;
1845 p->kind = BoolOp_kind;
1846 p->v.BoolOp.op = op;
1847 p->v.BoolOp.values = values;
1848 p->lineno = lineno;
1849 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001850 p->end_lineno = end_lineno;
1851 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001852 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853}
1854
1855expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001856NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
1857 end_lineno, int end_col_offset, PyArena *arena)
1858{
1859 expr_ty p;
1860 if (!target) {
1861 PyErr_SetString(PyExc_ValueError,
1862 "field target is required for NamedExpr");
1863 return NULL;
1864 }
1865 if (!value) {
1866 PyErr_SetString(PyExc_ValueError,
1867 "field value is required for NamedExpr");
1868 return NULL;
1869 }
1870 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1871 if (!p)
1872 return NULL;
1873 p->kind = NamedExpr_kind;
1874 p->v.NamedExpr.target = target;
1875 p->v.NamedExpr.value = value;
1876 p->lineno = lineno;
1877 p->col_offset = col_offset;
1878 p->end_lineno = end_lineno;
1879 p->end_col_offset = end_col_offset;
1880 return p;
1881}
1882
1883expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001884BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001885 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001887 expr_ty p;
1888 if (!left) {
1889 PyErr_SetString(PyExc_ValueError,
1890 "field left is required for BinOp");
1891 return NULL;
1892 }
1893 if (!op) {
1894 PyErr_SetString(PyExc_ValueError,
1895 "field op is required for BinOp");
1896 return NULL;
1897 }
1898 if (!right) {
1899 PyErr_SetString(PyExc_ValueError,
1900 "field right is required for BinOp");
1901 return NULL;
1902 }
1903 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1904 if (!p)
1905 return NULL;
1906 p->kind = BinOp_kind;
1907 p->v.BinOp.left = left;
1908 p->v.BinOp.op = op;
1909 p->v.BinOp.right = right;
1910 p->lineno = lineno;
1911 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001912 p->end_lineno = end_lineno;
1913 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001914 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915}
1916
1917expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001918UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
1919 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001920{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001921 expr_ty p;
1922 if (!op) {
1923 PyErr_SetString(PyExc_ValueError,
1924 "field op is required for UnaryOp");
1925 return NULL;
1926 }
1927 if (!operand) {
1928 PyErr_SetString(PyExc_ValueError,
1929 "field operand is required for UnaryOp");
1930 return NULL;
1931 }
1932 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1933 if (!p)
1934 return NULL;
1935 p->kind = UnaryOp_kind;
1936 p->v.UnaryOp.op = op;
1937 p->v.UnaryOp.operand = operand;
1938 p->lineno = lineno;
1939 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001940 p->end_lineno = end_lineno;
1941 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001942 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943}
1944
1945expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001946Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
1947 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001949 expr_ty p;
1950 if (!args) {
1951 PyErr_SetString(PyExc_ValueError,
1952 "field args is required for Lambda");
1953 return NULL;
1954 }
1955 if (!body) {
1956 PyErr_SetString(PyExc_ValueError,
1957 "field body is required for Lambda");
1958 return NULL;
1959 }
1960 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1961 if (!p)
1962 return NULL;
1963 p->kind = Lambda_kind;
1964 p->v.Lambda.args = args;
1965 p->v.Lambda.body = body;
1966 p->lineno = lineno;
1967 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001968 p->end_lineno = end_lineno;
1969 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001970 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971}
1972
1973expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001974IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001975 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001976{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001977 expr_ty p;
1978 if (!test) {
1979 PyErr_SetString(PyExc_ValueError,
1980 "field test is required for IfExp");
1981 return NULL;
1982 }
1983 if (!body) {
1984 PyErr_SetString(PyExc_ValueError,
1985 "field body is required for IfExp");
1986 return NULL;
1987 }
1988 if (!orelse) {
1989 PyErr_SetString(PyExc_ValueError,
1990 "field orelse is required for IfExp");
1991 return NULL;
1992 }
1993 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1994 if (!p)
1995 return NULL;
1996 p->kind = IfExp_kind;
1997 p->v.IfExp.test = test;
1998 p->v.IfExp.body = body;
1999 p->v.IfExp.orelse = orelse;
2000 p->lineno = lineno;
2001 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002002 p->end_lineno = end_lineno;
2003 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002004 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002005}
2006
2007expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002008Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int
2009 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002011 expr_ty p;
2012 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2013 if (!p)
2014 return NULL;
2015 p->kind = Dict_kind;
2016 p->v.Dict.keys = keys;
2017 p->v.Dict.values = values;
2018 p->lineno = lineno;
2019 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002020 p->end_lineno = end_lineno;
2021 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002022 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023}
2024
2025expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002026Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int
2027 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002028{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002029 expr_ty p;
2030 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2031 if (!p)
2032 return NULL;
2033 p->kind = Set_kind;
2034 p->v.Set.elts = elts;
2035 p->lineno = lineno;
2036 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002037 p->end_lineno = end_lineno;
2038 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002039 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002040}
2041
2042expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002043ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2044 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002046 expr_ty p;
2047 if (!elt) {
2048 PyErr_SetString(PyExc_ValueError,
2049 "field elt is required for ListComp");
2050 return NULL;
2051 }
2052 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2053 if (!p)
2054 return NULL;
2055 p->kind = ListComp_kind;
2056 p->v.ListComp.elt = elt;
2057 p->v.ListComp.generators = generators;
2058 p->lineno = lineno;
2059 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002060 p->end_lineno = end_lineno;
2061 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002062 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063}
2064
2065expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002066SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2067 end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002068{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002069 expr_ty p;
2070 if (!elt) {
2071 PyErr_SetString(PyExc_ValueError,
2072 "field elt is required for SetComp");
2073 return NULL;
2074 }
2075 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2076 if (!p)
2077 return NULL;
2078 p->kind = SetComp_kind;
2079 p->v.SetComp.elt = elt;
2080 p->v.SetComp.generators = generators;
2081 p->lineno = lineno;
2082 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002083 p->end_lineno = end_lineno;
2084 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002085 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002086}
2087
2088expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00002089DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002090 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002091{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002092 expr_ty p;
2093 if (!key) {
2094 PyErr_SetString(PyExc_ValueError,
2095 "field key is required for DictComp");
2096 return NULL;
2097 }
2098 if (!value) {
2099 PyErr_SetString(PyExc_ValueError,
2100 "field value is required for DictComp");
2101 return NULL;
2102 }
2103 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2104 if (!p)
2105 return NULL;
2106 p->kind = DictComp_kind;
2107 p->v.DictComp.key = key;
2108 p->v.DictComp.value = value;
2109 p->v.DictComp.generators = generators;
2110 p->lineno = lineno;
2111 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002112 p->end_lineno = end_lineno;
2113 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002114 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002115}
2116
2117expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002118GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002119 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002121 expr_ty p;
2122 if (!elt) {
2123 PyErr_SetString(PyExc_ValueError,
2124 "field elt is required for GeneratorExp");
2125 return NULL;
2126 }
2127 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2128 if (!p)
2129 return NULL;
2130 p->kind = GeneratorExp_kind;
2131 p->v.GeneratorExp.elt = elt;
2132 p->v.GeneratorExp.generators = generators;
2133 p->lineno = lineno;
2134 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002135 p->end_lineno = end_lineno;
2136 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002137 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138}
2139
2140expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002141Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2142 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002143{
2144 expr_ty p;
2145 if (!value) {
2146 PyErr_SetString(PyExc_ValueError,
2147 "field value is required for Await");
2148 return NULL;
2149 }
2150 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2151 if (!p)
2152 return NULL;
2153 p->kind = Await_kind;
2154 p->v.Await.value = value;
2155 p->lineno = lineno;
2156 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002157 p->end_lineno = end_lineno;
2158 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002159 return p;
2160}
2161
2162expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002163Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
2164 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002166 expr_ty p;
2167 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2168 if (!p)
2169 return NULL;
2170 p->kind = Yield_kind;
2171 p->v.Yield.value = value;
2172 p->lineno = lineno;
2173 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002174 p->end_lineno = end_lineno;
2175 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002176 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177}
2178
2179expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002180YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
2181 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05002182{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002183 expr_ty p;
2184 if (!value) {
2185 PyErr_SetString(PyExc_ValueError,
2186 "field value is required for YieldFrom");
2187 return NULL;
2188 }
2189 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2190 if (!p)
2191 return NULL;
2192 p->kind = YieldFrom_kind;
2193 p->v.YieldFrom.value = value;
2194 p->lineno = lineno;
2195 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002196 p->end_lineno = end_lineno;
2197 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002198 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002199}
2200
2201expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002202Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002203 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002205 expr_ty p;
2206 if (!left) {
2207 PyErr_SetString(PyExc_ValueError,
2208 "field left is required for Compare");
2209 return NULL;
2210 }
2211 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2212 if (!p)
2213 return NULL;
2214 p->kind = Compare_kind;
2215 p->v.Compare.left = left;
2216 p->v.Compare.ops = ops;
2217 p->v.Compare.comparators = comparators;
2218 p->lineno = lineno;
2219 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002220 p->end_lineno = end_lineno;
2221 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002222 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002223}
2224
2225expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002226Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002227 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002229 expr_ty p;
2230 if (!func) {
2231 PyErr_SetString(PyExc_ValueError,
2232 "field func is required for Call");
2233 return NULL;
2234 }
2235 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2236 if (!p)
2237 return NULL;
2238 p->kind = Call_kind;
2239 p->v.Call.func = func;
2240 p->v.Call.args = args;
2241 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002242 p->lineno = lineno;
2243 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002244 p->end_lineno = end_lineno;
2245 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002246 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247}
2248
2249expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002250FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002251 int col_offset, int end_lineno, int end_col_offset, PyArena
2252 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002253{
2254 expr_ty p;
2255 if (!value) {
2256 PyErr_SetString(PyExc_ValueError,
2257 "field value is required for FormattedValue");
2258 return NULL;
2259 }
2260 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2261 if (!p)
2262 return NULL;
2263 p->kind = FormattedValue_kind;
2264 p->v.FormattedValue.value = value;
2265 p->v.FormattedValue.conversion = conversion;
2266 p->v.FormattedValue.format_spec = format_spec;
2267 p->lineno = lineno;
2268 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002269 p->end_lineno = end_lineno;
2270 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002271 return p;
2272}
2273
2274expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002275JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int
2276 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002277{
2278 expr_ty p;
2279 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2280 if (!p)
2281 return NULL;
2282 p->kind = JoinedStr_kind;
2283 p->v.JoinedStr.values = values;
2284 p->lineno = lineno;
2285 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002286 p->end_lineno = end_lineno;
2287 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002288 return p;
2289}
2290
2291expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002292Constant(constant value, string kind, int lineno, int col_offset, int
2293 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002294{
2295 expr_ty p;
2296 if (!value) {
2297 PyErr_SetString(PyExc_ValueError,
2298 "field value is required for Constant");
2299 return NULL;
2300 }
2301 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2302 if (!p)
2303 return NULL;
2304 p->kind = Constant_kind;
2305 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002306 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002307 p->lineno = lineno;
2308 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002309 p->end_lineno = end_lineno;
2310 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002311 return p;
2312}
2313
2314expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002315Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002316 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002318 expr_ty p;
2319 if (!value) {
2320 PyErr_SetString(PyExc_ValueError,
2321 "field value is required for Attribute");
2322 return NULL;
2323 }
2324 if (!attr) {
2325 PyErr_SetString(PyExc_ValueError,
2326 "field attr is required for Attribute");
2327 return NULL;
2328 }
2329 if (!ctx) {
2330 PyErr_SetString(PyExc_ValueError,
2331 "field ctx is required for Attribute");
2332 return NULL;
2333 }
2334 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2335 if (!p)
2336 return NULL;
2337 p->kind = Attribute_kind;
2338 p->v.Attribute.value = value;
2339 p->v.Attribute.attr = attr;
2340 p->v.Attribute.ctx = ctx;
2341 p->lineno = lineno;
2342 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002343 p->end_lineno = end_lineno;
2344 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002345 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346}
2347
2348expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002349Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002350 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002352 expr_ty p;
2353 if (!value) {
2354 PyErr_SetString(PyExc_ValueError,
2355 "field value is required for Subscript");
2356 return NULL;
2357 }
2358 if (!slice) {
2359 PyErr_SetString(PyExc_ValueError,
2360 "field slice is required for Subscript");
2361 return NULL;
2362 }
2363 if (!ctx) {
2364 PyErr_SetString(PyExc_ValueError,
2365 "field ctx is required for Subscript");
2366 return NULL;
2367 }
2368 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2369 if (!p)
2370 return NULL;
2371 p->kind = Subscript_kind;
2372 p->v.Subscript.value = value;
2373 p->v.Subscript.slice = slice;
2374 p->v.Subscript.ctx = ctx;
2375 p->lineno = lineno;
2376 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002377 p->end_lineno = end_lineno;
2378 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002379 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380}
2381
2382expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002383Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
2384 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00002385{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002386 expr_ty p;
2387 if (!value) {
2388 PyErr_SetString(PyExc_ValueError,
2389 "field value is required for Starred");
2390 return NULL;
2391 }
2392 if (!ctx) {
2393 PyErr_SetString(PyExc_ValueError,
2394 "field ctx is required for Starred");
2395 return NULL;
2396 }
2397 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2398 if (!p)
2399 return NULL;
2400 p->kind = Starred_kind;
2401 p->v.Starred.value = value;
2402 p->v.Starred.ctx = ctx;
2403 p->lineno = lineno;
2404 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002405 p->end_lineno = end_lineno;
2406 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002407 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002408}
2409
2410expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002411Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
2412 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002414 expr_ty p;
2415 if (!id) {
2416 PyErr_SetString(PyExc_ValueError,
2417 "field id is required for Name");
2418 return NULL;
2419 }
2420 if (!ctx) {
2421 PyErr_SetString(PyExc_ValueError,
2422 "field ctx is required for Name");
2423 return NULL;
2424 }
2425 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2426 if (!p)
2427 return NULL;
2428 p->kind = Name_kind;
2429 p->v.Name.id = id;
2430 p->v.Name.ctx = ctx;
2431 p->lineno = lineno;
2432 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002433 p->end_lineno = end_lineno;
2434 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002435 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436}
2437
2438expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002439List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2440 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002442 expr_ty p;
2443 if (!ctx) {
2444 PyErr_SetString(PyExc_ValueError,
2445 "field ctx is required for List");
2446 return NULL;
2447 }
2448 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2449 if (!p)
2450 return NULL;
2451 p->kind = List_kind;
2452 p->v.List.elts = elts;
2453 p->v.List.ctx = ctx;
2454 p->lineno = lineno;
2455 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002456 p->end_lineno = end_lineno;
2457 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002458 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459}
2460
2461expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002462Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2463 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002465 expr_ty p;
2466 if (!ctx) {
2467 PyErr_SetString(PyExc_ValueError,
2468 "field ctx is required for Tuple");
2469 return NULL;
2470 }
2471 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2472 if (!p)
2473 return NULL;
2474 p->kind = Tuple_kind;
2475 p->v.Tuple.elts = elts;
2476 p->v.Tuple.ctx = ctx;
2477 p->lineno = lineno;
2478 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002479 p->end_lineno = end_lineno;
2480 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002481 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482}
2483
2484slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002485Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002487 slice_ty p;
2488 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2489 if (!p)
2490 return NULL;
2491 p->kind = Slice_kind;
2492 p->v.Slice.lower = lower;
2493 p->v.Slice.upper = upper;
2494 p->v.Slice.step = step;
2495 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496}
2497
2498slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002499ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002501 slice_ty p;
2502 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2503 if (!p)
2504 return NULL;
2505 p->kind = ExtSlice_kind;
2506 p->v.ExtSlice.dims = dims;
2507 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508}
2509
2510slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002513 slice_ty p;
2514 if (!value) {
2515 PyErr_SetString(PyExc_ValueError,
2516 "field value is required for Index");
2517 return NULL;
2518 }
2519 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2520 if (!p)
2521 return NULL;
2522 p->kind = Index_kind;
2523 p->v.Index.value = value;
2524 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525}
2526
2527comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002528comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2529 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002531 comprehension_ty p;
2532 if (!target) {
2533 PyErr_SetString(PyExc_ValueError,
2534 "field target is required for comprehension");
2535 return NULL;
2536 }
2537 if (!iter) {
2538 PyErr_SetString(PyExc_ValueError,
2539 "field iter is required for comprehension");
2540 return NULL;
2541 }
2542 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2543 if (!p)
2544 return NULL;
2545 p->target = target;
2546 p->iter = iter;
2547 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002548 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002549 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550}
2551
2552excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002553ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002554 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002556 excepthandler_ty p;
2557 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2558 if (!p)
2559 return NULL;
2560 p->kind = ExceptHandler_kind;
2561 p->v.ExceptHandler.type = type;
2562 p->v.ExceptHandler.name = name;
2563 p->v.ExceptHandler.body = body;
2564 p->lineno = lineno;
2565 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002566 p->end_lineno = end_lineno;
2567 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002568 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569}
2570
2571arguments_ty
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002572arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
2573 kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002575 arguments_ty p;
2576 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2577 if (!p)
2578 return NULL;
2579 p->args = args;
2580 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002581 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002582 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002583 p->kwarg = kwarg;
2584 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002585 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586}
2587
Neal Norwitzc1505362006-12-28 06:47:50 +00002588arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002589arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
2590 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002591{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002592 arg_ty p;
2593 if (!arg) {
2594 PyErr_SetString(PyExc_ValueError,
2595 "field arg is required for arg");
2596 return NULL;
2597 }
2598 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2599 if (!p)
2600 return NULL;
2601 p->arg = arg;
2602 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002603 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01002604 p->lineno = lineno;
2605 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002606 p->end_lineno = end_lineno;
2607 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002608 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002609}
2610
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002612keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002614 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002615 if (!value) {
2616 PyErr_SetString(PyExc_ValueError,
2617 "field value is required for keyword");
2618 return NULL;
2619 }
2620 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2621 if (!p)
2622 return NULL;
2623 p->arg = arg;
2624 p->value = value;
2625 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626}
2627
2628alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002629alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002631 alias_ty p;
2632 if (!name) {
2633 PyErr_SetString(PyExc_ValueError,
2634 "field name is required for alias");
2635 return NULL;
2636 }
2637 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2638 if (!p)
2639 return NULL;
2640 p->name = name;
2641 p->asname = asname;
2642 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643}
2644
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002645withitem_ty
2646withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2647{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002648 withitem_ty p;
2649 if (!context_expr) {
2650 PyErr_SetString(PyExc_ValueError,
2651 "field context_expr is required for withitem");
2652 return NULL;
2653 }
2654 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2655 if (!p)
2656 return NULL;
2657 p->context_expr = context_expr;
2658 p->optional_vars = optional_vars;
2659 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002660}
2661
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002662type_ignore_ty
2663TypeIgnore(int lineno, PyArena *arena)
2664{
2665 type_ignore_ty p;
2666 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
2667 if (!p)
2668 return NULL;
2669 p->kind = TypeIgnore_kind;
2670 p->v.TypeIgnore.lineno = lineno;
2671 return p;
2672}
2673
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002674
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002675PyObject*
2676ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002677{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002678 mod_ty o = (mod_ty)_o;
2679 PyObject *result = NULL, *value = NULL;
2680 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002681 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002682 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002683
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002684 switch (o->kind) {
2685 case Module_kind:
2686 result = PyType_GenericNew(Module_type, NULL, NULL);
2687 if (!result) goto failed;
2688 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2689 if (!value) goto failed;
2690 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2691 goto failed;
2692 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002693 value = ast2obj_list(o->v.Module.type_ignores, ast2obj_type_ignore);
2694 if (!value) goto failed;
2695 if (_PyObject_SetAttrId(result, &PyId_type_ignores, value) == -1)
2696 goto failed;
2697 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002698 break;
2699 case Interactive_kind:
2700 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2701 if (!result) goto failed;
2702 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2703 if (!value) goto failed;
2704 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2705 goto failed;
2706 Py_DECREF(value);
2707 break;
2708 case Expression_kind:
2709 result = PyType_GenericNew(Expression_type, NULL, NULL);
2710 if (!result) goto failed;
2711 value = ast2obj_expr(o->v.Expression.body);
2712 if (!value) goto failed;
2713 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2714 goto failed;
2715 Py_DECREF(value);
2716 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002717 case FunctionType_kind:
2718 result = PyType_GenericNew(FunctionType_type, NULL, NULL);
2719 if (!result) goto failed;
2720 value = ast2obj_list(o->v.FunctionType.argtypes, ast2obj_expr);
2721 if (!value) goto failed;
2722 if (_PyObject_SetAttrId(result, &PyId_argtypes, value) == -1)
2723 goto failed;
2724 Py_DECREF(value);
2725 value = ast2obj_expr(o->v.FunctionType.returns);
2726 if (!value) goto failed;
2727 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2728 goto failed;
2729 Py_DECREF(value);
2730 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002731 case Suite_kind:
2732 result = PyType_GenericNew(Suite_type, NULL, NULL);
2733 if (!result) goto failed;
2734 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2735 if (!value) goto failed;
2736 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2737 goto failed;
2738 Py_DECREF(value);
2739 break;
2740 }
2741 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002742failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002743 Py_XDECREF(value);
2744 Py_XDECREF(result);
2745 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746}
2747
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002748PyObject*
2749ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002751 stmt_ty o = (stmt_ty)_o;
2752 PyObject *result = NULL, *value = NULL;
2753 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002754 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002755 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002756
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002757 switch (o->kind) {
2758 case FunctionDef_kind:
2759 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2760 if (!result) goto failed;
2761 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002762 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002763 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2764 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002765 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002766 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002767 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002768 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2769 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002770 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002771 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2772 if (!value) goto failed;
2773 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2774 goto failed;
2775 Py_DECREF(value);
2776 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2777 if (!value) goto failed;
2778 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2779 goto failed;
2780 Py_DECREF(value);
2781 value = ast2obj_expr(o->v.FunctionDef.returns);
2782 if (!value) goto failed;
2783 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2784 goto failed;
2785 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002786 value = ast2obj_string(o->v.FunctionDef.type_comment);
2787 if (!value) goto failed;
2788 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2789 goto failed;
2790 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002791 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002792 case AsyncFunctionDef_kind:
2793 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2794 if (!result) goto failed;
2795 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2796 if (!value) goto failed;
2797 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2798 goto failed;
2799 Py_DECREF(value);
2800 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2801 if (!value) goto failed;
2802 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2803 goto failed;
2804 Py_DECREF(value);
2805 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2806 if (!value) goto failed;
2807 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2808 goto failed;
2809 Py_DECREF(value);
2810 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2811 ast2obj_expr);
2812 if (!value) goto failed;
2813 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2814 goto failed;
2815 Py_DECREF(value);
2816 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2817 if (!value) goto failed;
2818 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2819 goto failed;
2820 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002821 value = ast2obj_string(o->v.AsyncFunctionDef.type_comment);
2822 if (!value) goto failed;
2823 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2824 goto failed;
2825 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002826 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002827 case ClassDef_kind:
2828 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2829 if (!result) goto failed;
2830 value = ast2obj_identifier(o->v.ClassDef.name);
2831 if (!value) goto failed;
2832 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2833 goto failed;
2834 Py_DECREF(value);
2835 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2836 if (!value) goto failed;
2837 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2838 goto failed;
2839 Py_DECREF(value);
2840 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2841 if (!value) goto failed;
2842 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2843 goto failed;
2844 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002845 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2846 if (!value) goto failed;
2847 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2848 goto failed;
2849 Py_DECREF(value);
2850 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2851 if (!value) goto failed;
2852 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2853 goto failed;
2854 Py_DECREF(value);
2855 break;
2856 case Return_kind:
2857 result = PyType_GenericNew(Return_type, NULL, NULL);
2858 if (!result) goto failed;
2859 value = ast2obj_expr(o->v.Return.value);
2860 if (!value) goto failed;
2861 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2862 goto failed;
2863 Py_DECREF(value);
2864 break;
2865 case Delete_kind:
2866 result = PyType_GenericNew(Delete_type, NULL, NULL);
2867 if (!result) goto failed;
2868 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2869 if (!value) goto failed;
2870 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2871 goto failed;
2872 Py_DECREF(value);
2873 break;
2874 case Assign_kind:
2875 result = PyType_GenericNew(Assign_type, NULL, NULL);
2876 if (!result) goto failed;
2877 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2878 if (!value) goto failed;
2879 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2880 goto failed;
2881 Py_DECREF(value);
2882 value = ast2obj_expr(o->v.Assign.value);
2883 if (!value) goto failed;
2884 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2885 goto failed;
2886 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002887 value = ast2obj_string(o->v.Assign.type_comment);
2888 if (!value) goto failed;
2889 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2890 goto failed;
2891 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002892 break;
2893 case AugAssign_kind:
2894 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2895 if (!result) goto failed;
2896 value = ast2obj_expr(o->v.AugAssign.target);
2897 if (!value) goto failed;
2898 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2899 goto failed;
2900 Py_DECREF(value);
2901 value = ast2obj_operator(o->v.AugAssign.op);
2902 if (!value) goto failed;
2903 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2904 goto failed;
2905 Py_DECREF(value);
2906 value = ast2obj_expr(o->v.AugAssign.value);
2907 if (!value) goto failed;
2908 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2909 goto failed;
2910 Py_DECREF(value);
2911 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002912 case AnnAssign_kind:
2913 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2914 if (!result) goto failed;
2915 value = ast2obj_expr(o->v.AnnAssign.target);
2916 if (!value) goto failed;
2917 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2918 goto failed;
2919 Py_DECREF(value);
2920 value = ast2obj_expr(o->v.AnnAssign.annotation);
2921 if (!value) goto failed;
2922 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2923 goto failed;
2924 Py_DECREF(value);
2925 value = ast2obj_expr(o->v.AnnAssign.value);
2926 if (!value) goto failed;
2927 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2928 goto failed;
2929 Py_DECREF(value);
2930 value = ast2obj_int(o->v.AnnAssign.simple);
2931 if (!value) goto failed;
2932 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2933 goto failed;
2934 Py_DECREF(value);
2935 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002936 case For_kind:
2937 result = PyType_GenericNew(For_type, NULL, NULL);
2938 if (!result) goto failed;
2939 value = ast2obj_expr(o->v.For.target);
2940 if (!value) goto failed;
2941 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2942 goto failed;
2943 Py_DECREF(value);
2944 value = ast2obj_expr(o->v.For.iter);
2945 if (!value) goto failed;
2946 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2947 goto failed;
2948 Py_DECREF(value);
2949 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2950 if (!value) goto failed;
2951 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2952 goto failed;
2953 Py_DECREF(value);
2954 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2955 if (!value) goto failed;
2956 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2957 goto failed;
2958 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002959 value = ast2obj_string(o->v.For.type_comment);
2960 if (!value) goto failed;
2961 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2962 goto failed;
2963 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002964 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002965 case AsyncFor_kind:
2966 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2967 if (!result) goto failed;
2968 value = ast2obj_expr(o->v.AsyncFor.target);
2969 if (!value) goto failed;
2970 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2971 goto failed;
2972 Py_DECREF(value);
2973 value = ast2obj_expr(o->v.AsyncFor.iter);
2974 if (!value) goto failed;
2975 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2976 goto failed;
2977 Py_DECREF(value);
2978 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2979 if (!value) goto failed;
2980 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2981 goto failed;
2982 Py_DECREF(value);
2983 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2984 if (!value) goto failed;
2985 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2986 goto failed;
2987 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002988 value = ast2obj_string(o->v.AsyncFor.type_comment);
2989 if (!value) goto failed;
2990 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2991 goto failed;
2992 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002993 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002994 case While_kind:
2995 result = PyType_GenericNew(While_type, NULL, NULL);
2996 if (!result) goto failed;
2997 value = ast2obj_expr(o->v.While.test);
2998 if (!value) goto failed;
2999 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3000 goto failed;
3001 Py_DECREF(value);
3002 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
3003 if (!value) goto failed;
3004 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3005 goto failed;
3006 Py_DECREF(value);
3007 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
3008 if (!value) goto failed;
3009 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3010 goto failed;
3011 Py_DECREF(value);
3012 break;
3013 case If_kind:
3014 result = PyType_GenericNew(If_type, NULL, NULL);
3015 if (!result) goto failed;
3016 value = ast2obj_expr(o->v.If.test);
3017 if (!value) goto failed;
3018 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3019 goto failed;
3020 Py_DECREF(value);
3021 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
3022 if (!value) goto failed;
3023 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3024 goto failed;
3025 Py_DECREF(value);
3026 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
3027 if (!value) goto failed;
3028 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3029 goto failed;
3030 Py_DECREF(value);
3031 break;
3032 case With_kind:
3033 result = PyType_GenericNew(With_type, NULL, NULL);
3034 if (!result) goto failed;
3035 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
3036 if (!value) goto failed;
3037 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3038 goto failed;
3039 Py_DECREF(value);
3040 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
3041 if (!value) goto failed;
3042 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3043 goto failed;
3044 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003045 value = ast2obj_string(o->v.With.type_comment);
3046 if (!value) goto failed;
3047 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3048 goto failed;
3049 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003050 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003051 case AsyncWith_kind:
3052 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
3053 if (!result) goto failed;
3054 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
3055 if (!value) goto failed;
3056 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3057 goto failed;
3058 Py_DECREF(value);
3059 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
3060 if (!value) goto failed;
3061 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3062 goto failed;
3063 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003064 value = ast2obj_string(o->v.AsyncWith.type_comment);
3065 if (!value) goto failed;
3066 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3067 goto failed;
3068 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003069 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003070 case Raise_kind:
3071 result = PyType_GenericNew(Raise_type, NULL, NULL);
3072 if (!result) goto failed;
3073 value = ast2obj_expr(o->v.Raise.exc);
3074 if (!value) goto failed;
3075 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
3076 goto failed;
3077 Py_DECREF(value);
3078 value = ast2obj_expr(o->v.Raise.cause);
3079 if (!value) goto failed;
3080 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
3081 goto failed;
3082 Py_DECREF(value);
3083 break;
3084 case Try_kind:
3085 result = PyType_GenericNew(Try_type, NULL, NULL);
3086 if (!result) goto failed;
3087 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
3088 if (!value) goto failed;
3089 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3090 goto failed;
3091 Py_DECREF(value);
3092 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
3093 if (!value) goto failed;
3094 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
3095 goto failed;
3096 Py_DECREF(value);
3097 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
3098 if (!value) goto failed;
3099 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3100 goto failed;
3101 Py_DECREF(value);
3102 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
3103 if (!value) goto failed;
3104 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
3105 goto failed;
3106 Py_DECREF(value);
3107 break;
3108 case Assert_kind:
3109 result = PyType_GenericNew(Assert_type, NULL, NULL);
3110 if (!result) goto failed;
3111 value = ast2obj_expr(o->v.Assert.test);
3112 if (!value) goto failed;
3113 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3114 goto failed;
3115 Py_DECREF(value);
3116 value = ast2obj_expr(o->v.Assert.msg);
3117 if (!value) goto failed;
3118 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
3119 goto failed;
3120 Py_DECREF(value);
3121 break;
3122 case Import_kind:
3123 result = PyType_GenericNew(Import_type, NULL, NULL);
3124 if (!result) goto failed;
3125 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
3126 if (!value) goto failed;
3127 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3128 goto failed;
3129 Py_DECREF(value);
3130 break;
3131 case ImportFrom_kind:
3132 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
3133 if (!result) goto failed;
3134 value = ast2obj_identifier(o->v.ImportFrom.module);
3135 if (!value) goto failed;
3136 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
3137 goto failed;
3138 Py_DECREF(value);
3139 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
3140 if (!value) goto failed;
3141 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3142 goto failed;
3143 Py_DECREF(value);
3144 value = ast2obj_int(o->v.ImportFrom.level);
3145 if (!value) goto failed;
3146 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
3147 goto failed;
3148 Py_DECREF(value);
3149 break;
3150 case Global_kind:
3151 result = PyType_GenericNew(Global_type, NULL, NULL);
3152 if (!result) goto failed;
3153 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
3154 if (!value) goto failed;
3155 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3156 goto failed;
3157 Py_DECREF(value);
3158 break;
3159 case Nonlocal_kind:
3160 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3161 if (!result) goto failed;
3162 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3163 if (!value) goto failed;
3164 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3165 goto failed;
3166 Py_DECREF(value);
3167 break;
3168 case Expr_kind:
3169 result = PyType_GenericNew(Expr_type, NULL, NULL);
3170 if (!result) goto failed;
3171 value = ast2obj_expr(o->v.Expr.value);
3172 if (!value) goto failed;
3173 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3174 goto failed;
3175 Py_DECREF(value);
3176 break;
3177 case Pass_kind:
3178 result = PyType_GenericNew(Pass_type, NULL, NULL);
3179 if (!result) goto failed;
3180 break;
3181 case Break_kind:
3182 result = PyType_GenericNew(Break_type, NULL, NULL);
3183 if (!result) goto failed;
3184 break;
3185 case Continue_kind:
3186 result = PyType_GenericNew(Continue_type, NULL, NULL);
3187 if (!result) goto failed;
3188 break;
3189 }
3190 value = ast2obj_int(o->lineno);
3191 if (!value) goto failed;
3192 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3193 goto failed;
3194 Py_DECREF(value);
3195 value = ast2obj_int(o->col_offset);
3196 if (!value) goto failed;
3197 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3198 goto failed;
3199 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003200 value = ast2obj_int(o->end_lineno);
3201 if (!value) goto failed;
3202 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3203 goto failed;
3204 Py_DECREF(value);
3205 value = ast2obj_int(o->end_col_offset);
3206 if (!value) goto failed;
3207 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3208 goto failed;
3209 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003210 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003211failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003212 Py_XDECREF(value);
3213 Py_XDECREF(result);
3214 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215}
3216
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003217PyObject*
3218ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003220 expr_ty o = (expr_ty)_o;
3221 PyObject *result = NULL, *value = NULL;
3222 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003223 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003224 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003225
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003226 switch (o->kind) {
3227 case BoolOp_kind:
3228 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3229 if (!result) goto failed;
3230 value = ast2obj_boolop(o->v.BoolOp.op);
3231 if (!value) goto failed;
3232 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3233 goto failed;
3234 Py_DECREF(value);
3235 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3236 if (!value) goto failed;
3237 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3238 goto failed;
3239 Py_DECREF(value);
3240 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003241 case NamedExpr_kind:
3242 result = PyType_GenericNew(NamedExpr_type, NULL, NULL);
3243 if (!result) goto failed;
3244 value = ast2obj_expr(o->v.NamedExpr.target);
3245 if (!value) goto failed;
3246 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3247 goto failed;
3248 Py_DECREF(value);
3249 value = ast2obj_expr(o->v.NamedExpr.value);
3250 if (!value) goto failed;
3251 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3252 goto failed;
3253 Py_DECREF(value);
3254 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003255 case BinOp_kind:
3256 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3257 if (!result) goto failed;
3258 value = ast2obj_expr(o->v.BinOp.left);
3259 if (!value) goto failed;
3260 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3261 goto failed;
3262 Py_DECREF(value);
3263 value = ast2obj_operator(o->v.BinOp.op);
3264 if (!value) goto failed;
3265 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3266 goto failed;
3267 Py_DECREF(value);
3268 value = ast2obj_expr(o->v.BinOp.right);
3269 if (!value) goto failed;
3270 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3271 goto failed;
3272 Py_DECREF(value);
3273 break;
3274 case UnaryOp_kind:
3275 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3276 if (!result) goto failed;
3277 value = ast2obj_unaryop(o->v.UnaryOp.op);
3278 if (!value) goto failed;
3279 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3280 goto failed;
3281 Py_DECREF(value);
3282 value = ast2obj_expr(o->v.UnaryOp.operand);
3283 if (!value) goto failed;
3284 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3285 goto failed;
3286 Py_DECREF(value);
3287 break;
3288 case Lambda_kind:
3289 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3290 if (!result) goto failed;
3291 value = ast2obj_arguments(o->v.Lambda.args);
3292 if (!value) goto failed;
3293 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3294 goto failed;
3295 Py_DECREF(value);
3296 value = ast2obj_expr(o->v.Lambda.body);
3297 if (!value) goto failed;
3298 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3299 goto failed;
3300 Py_DECREF(value);
3301 break;
3302 case IfExp_kind:
3303 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3304 if (!result) goto failed;
3305 value = ast2obj_expr(o->v.IfExp.test);
3306 if (!value) goto failed;
3307 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3308 goto failed;
3309 Py_DECREF(value);
3310 value = ast2obj_expr(o->v.IfExp.body);
3311 if (!value) goto failed;
3312 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3313 goto failed;
3314 Py_DECREF(value);
3315 value = ast2obj_expr(o->v.IfExp.orelse);
3316 if (!value) goto failed;
3317 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3318 goto failed;
3319 Py_DECREF(value);
3320 break;
3321 case Dict_kind:
3322 result = PyType_GenericNew(Dict_type, NULL, NULL);
3323 if (!result) goto failed;
3324 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3325 if (!value) goto failed;
3326 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3327 goto failed;
3328 Py_DECREF(value);
3329 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3330 if (!value) goto failed;
3331 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3332 goto failed;
3333 Py_DECREF(value);
3334 break;
3335 case Set_kind:
3336 result = PyType_GenericNew(Set_type, NULL, NULL);
3337 if (!result) goto failed;
3338 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3339 if (!value) goto failed;
3340 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3341 goto failed;
3342 Py_DECREF(value);
3343 break;
3344 case ListComp_kind:
3345 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3346 if (!result) goto failed;
3347 value = ast2obj_expr(o->v.ListComp.elt);
3348 if (!value) goto failed;
3349 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3350 goto failed;
3351 Py_DECREF(value);
3352 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3353 if (!value) goto failed;
3354 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3355 goto failed;
3356 Py_DECREF(value);
3357 break;
3358 case SetComp_kind:
3359 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3360 if (!result) goto failed;
3361 value = ast2obj_expr(o->v.SetComp.elt);
3362 if (!value) goto failed;
3363 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3364 goto failed;
3365 Py_DECREF(value);
3366 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3367 if (!value) goto failed;
3368 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3369 goto failed;
3370 Py_DECREF(value);
3371 break;
3372 case DictComp_kind:
3373 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3374 if (!result) goto failed;
3375 value = ast2obj_expr(o->v.DictComp.key);
3376 if (!value) goto failed;
3377 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3378 goto failed;
3379 Py_DECREF(value);
3380 value = ast2obj_expr(o->v.DictComp.value);
3381 if (!value) goto failed;
3382 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3383 goto failed;
3384 Py_DECREF(value);
3385 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3386 if (!value) goto failed;
3387 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3388 goto failed;
3389 Py_DECREF(value);
3390 break;
3391 case GeneratorExp_kind:
3392 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3393 if (!result) goto failed;
3394 value = ast2obj_expr(o->v.GeneratorExp.elt);
3395 if (!value) goto failed;
3396 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3397 goto failed;
3398 Py_DECREF(value);
3399 value = ast2obj_list(o->v.GeneratorExp.generators,
3400 ast2obj_comprehension);
3401 if (!value) goto failed;
3402 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3403 goto failed;
3404 Py_DECREF(value);
3405 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003406 case Await_kind:
3407 result = PyType_GenericNew(Await_type, NULL, NULL);
3408 if (!result) goto failed;
3409 value = ast2obj_expr(o->v.Await.value);
3410 if (!value) goto failed;
3411 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3412 goto failed;
3413 Py_DECREF(value);
3414 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003415 case Yield_kind:
3416 result = PyType_GenericNew(Yield_type, NULL, NULL);
3417 if (!result) goto failed;
3418 value = ast2obj_expr(o->v.Yield.value);
3419 if (!value) goto failed;
3420 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3421 goto failed;
3422 Py_DECREF(value);
3423 break;
3424 case YieldFrom_kind:
3425 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3426 if (!result) goto failed;
3427 value = ast2obj_expr(o->v.YieldFrom.value);
3428 if (!value) goto failed;
3429 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3430 goto failed;
3431 Py_DECREF(value);
3432 break;
3433 case Compare_kind:
3434 result = PyType_GenericNew(Compare_type, NULL, NULL);
3435 if (!result) goto failed;
3436 value = ast2obj_expr(o->v.Compare.left);
3437 if (!value) goto failed;
3438 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3439 goto failed;
3440 Py_DECREF(value);
3441 {
3442 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3443 value = PyList_New(n);
3444 if (!value) goto failed;
3445 for(i = 0; i < n; i++)
3446 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003448 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003449 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3450 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003451 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003452 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003453 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003454 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3455 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003456 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003457 break;
3458 case Call_kind:
3459 result = PyType_GenericNew(Call_type, NULL, NULL);
3460 if (!result) goto failed;
3461 value = ast2obj_expr(o->v.Call.func);
3462 if (!value) goto failed;
3463 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3464 goto failed;
3465 Py_DECREF(value);
3466 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3467 if (!value) goto failed;
3468 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3469 goto failed;
3470 Py_DECREF(value);
3471 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3472 if (!value) goto failed;
3473 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3474 goto failed;
3475 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003476 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003477 case FormattedValue_kind:
3478 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3479 if (!result) goto failed;
3480 value = ast2obj_expr(o->v.FormattedValue.value);
3481 if (!value) goto failed;
3482 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3483 goto failed;
3484 Py_DECREF(value);
3485 value = ast2obj_int(o->v.FormattedValue.conversion);
3486 if (!value) goto failed;
3487 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3488 goto failed;
3489 Py_DECREF(value);
3490 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3491 if (!value) goto failed;
3492 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3493 goto failed;
3494 Py_DECREF(value);
3495 break;
3496 case JoinedStr_kind:
3497 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3498 if (!result) goto failed;
3499 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3500 if (!value) goto failed;
3501 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3502 goto failed;
3503 Py_DECREF(value);
3504 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003505 case Constant_kind:
3506 result = PyType_GenericNew(Constant_type, NULL, NULL);
3507 if (!result) goto failed;
3508 value = ast2obj_constant(o->v.Constant.value);
3509 if (!value) goto failed;
3510 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3511 goto failed;
3512 Py_DECREF(value);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003513 value = ast2obj_string(o->v.Constant.kind);
3514 if (!value) goto failed;
3515 if (_PyObject_SetAttrId(result, &PyId_kind, value) == -1)
3516 goto failed;
3517 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003518 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003519 case Attribute_kind:
3520 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3521 if (!result) goto failed;
3522 value = ast2obj_expr(o->v.Attribute.value);
3523 if (!value) goto failed;
3524 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3525 goto failed;
3526 Py_DECREF(value);
3527 value = ast2obj_identifier(o->v.Attribute.attr);
3528 if (!value) goto failed;
3529 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3530 goto failed;
3531 Py_DECREF(value);
3532 value = ast2obj_expr_context(o->v.Attribute.ctx);
3533 if (!value) goto failed;
3534 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3535 goto failed;
3536 Py_DECREF(value);
3537 break;
3538 case Subscript_kind:
3539 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3540 if (!result) goto failed;
3541 value = ast2obj_expr(o->v.Subscript.value);
3542 if (!value) goto failed;
3543 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3544 goto failed;
3545 Py_DECREF(value);
3546 value = ast2obj_slice(o->v.Subscript.slice);
3547 if (!value) goto failed;
3548 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3549 goto failed;
3550 Py_DECREF(value);
3551 value = ast2obj_expr_context(o->v.Subscript.ctx);
3552 if (!value) goto failed;
3553 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3554 goto failed;
3555 Py_DECREF(value);
3556 break;
3557 case Starred_kind:
3558 result = PyType_GenericNew(Starred_type, NULL, NULL);
3559 if (!result) goto failed;
3560 value = ast2obj_expr(o->v.Starred.value);
3561 if (!value) goto failed;
3562 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3563 goto failed;
3564 Py_DECREF(value);
3565 value = ast2obj_expr_context(o->v.Starred.ctx);
3566 if (!value) goto failed;
3567 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3568 goto failed;
3569 Py_DECREF(value);
3570 break;
3571 case Name_kind:
3572 result = PyType_GenericNew(Name_type, NULL, NULL);
3573 if (!result) goto failed;
3574 value = ast2obj_identifier(o->v.Name.id);
3575 if (!value) goto failed;
3576 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3577 goto failed;
3578 Py_DECREF(value);
3579 value = ast2obj_expr_context(o->v.Name.ctx);
3580 if (!value) goto failed;
3581 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3582 goto failed;
3583 Py_DECREF(value);
3584 break;
3585 case List_kind:
3586 result = PyType_GenericNew(List_type, NULL, NULL);
3587 if (!result) goto failed;
3588 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3589 if (!value) goto failed;
3590 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3591 goto failed;
3592 Py_DECREF(value);
3593 value = ast2obj_expr_context(o->v.List.ctx);
3594 if (!value) goto failed;
3595 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3596 goto failed;
3597 Py_DECREF(value);
3598 break;
3599 case Tuple_kind:
3600 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3601 if (!result) goto failed;
3602 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3603 if (!value) goto failed;
3604 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3605 goto failed;
3606 Py_DECREF(value);
3607 value = ast2obj_expr_context(o->v.Tuple.ctx);
3608 if (!value) goto failed;
3609 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3610 goto failed;
3611 Py_DECREF(value);
3612 break;
3613 }
3614 value = ast2obj_int(o->lineno);
3615 if (!value) goto failed;
3616 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3617 goto failed;
3618 Py_DECREF(value);
3619 value = ast2obj_int(o->col_offset);
3620 if (!value) goto failed;
3621 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3622 goto failed;
3623 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003624 value = ast2obj_int(o->end_lineno);
3625 if (!value) goto failed;
3626 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3627 goto failed;
3628 Py_DECREF(value);
3629 value = ast2obj_int(o->end_col_offset);
3630 if (!value) goto failed;
3631 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3632 goto failed;
3633 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003634 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003635failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003636 Py_XDECREF(value);
3637 Py_XDECREF(result);
3638 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003639}
3640
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003641PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003642{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003643 switch(o) {
3644 case Load:
3645 Py_INCREF(Load_singleton);
3646 return Load_singleton;
3647 case Store:
3648 Py_INCREF(Store_singleton);
3649 return Store_singleton;
3650 case Del:
3651 Py_INCREF(Del_singleton);
3652 return Del_singleton;
3653 case AugLoad:
3654 Py_INCREF(AugLoad_singleton);
3655 return AugLoad_singleton;
3656 case AugStore:
3657 Py_INCREF(AugStore_singleton);
3658 return AugStore_singleton;
3659 case Param:
3660 Py_INCREF(Param_singleton);
3661 return Param_singleton;
3662 default:
3663 /* should never happen, but just in case ... */
3664 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3665 return NULL;
3666 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003668PyObject*
3669ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003670{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003671 slice_ty o = (slice_ty)_o;
3672 PyObject *result = NULL, *value = NULL;
3673 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003674 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003675 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003676
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003677 switch (o->kind) {
3678 case Slice_kind:
3679 result = PyType_GenericNew(Slice_type, NULL, NULL);
3680 if (!result) goto failed;
3681 value = ast2obj_expr(o->v.Slice.lower);
3682 if (!value) goto failed;
3683 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3684 goto failed;
3685 Py_DECREF(value);
3686 value = ast2obj_expr(o->v.Slice.upper);
3687 if (!value) goto failed;
3688 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3689 goto failed;
3690 Py_DECREF(value);
3691 value = ast2obj_expr(o->v.Slice.step);
3692 if (!value) goto failed;
3693 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3694 goto failed;
3695 Py_DECREF(value);
3696 break;
3697 case ExtSlice_kind:
3698 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3699 if (!result) goto failed;
3700 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3701 if (!value) goto failed;
3702 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3703 goto failed;
3704 Py_DECREF(value);
3705 break;
3706 case Index_kind:
3707 result = PyType_GenericNew(Index_type, NULL, NULL);
3708 if (!result) goto failed;
3709 value = ast2obj_expr(o->v.Index.value);
3710 if (!value) goto failed;
3711 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3712 goto failed;
3713 Py_DECREF(value);
3714 break;
3715 }
3716 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003717failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003718 Py_XDECREF(value);
3719 Py_XDECREF(result);
3720 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721}
3722
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003723PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003724{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003725 switch(o) {
3726 case And:
3727 Py_INCREF(And_singleton);
3728 return And_singleton;
3729 case Or:
3730 Py_INCREF(Or_singleton);
3731 return Or_singleton;
3732 default:
3733 /* should never happen, but just in case ... */
3734 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3735 return NULL;
3736 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003737}
3738PyObject* ast2obj_operator(operator_ty o)
3739{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003740 switch(o) {
3741 case Add:
3742 Py_INCREF(Add_singleton);
3743 return Add_singleton;
3744 case Sub:
3745 Py_INCREF(Sub_singleton);
3746 return Sub_singleton;
3747 case Mult:
3748 Py_INCREF(Mult_singleton);
3749 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003750 case MatMult:
3751 Py_INCREF(MatMult_singleton);
3752 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003753 case Div:
3754 Py_INCREF(Div_singleton);
3755 return Div_singleton;
3756 case Mod:
3757 Py_INCREF(Mod_singleton);
3758 return Mod_singleton;
3759 case Pow:
3760 Py_INCREF(Pow_singleton);
3761 return Pow_singleton;
3762 case LShift:
3763 Py_INCREF(LShift_singleton);
3764 return LShift_singleton;
3765 case RShift:
3766 Py_INCREF(RShift_singleton);
3767 return RShift_singleton;
3768 case BitOr:
3769 Py_INCREF(BitOr_singleton);
3770 return BitOr_singleton;
3771 case BitXor:
3772 Py_INCREF(BitXor_singleton);
3773 return BitXor_singleton;
3774 case BitAnd:
3775 Py_INCREF(BitAnd_singleton);
3776 return BitAnd_singleton;
3777 case FloorDiv:
3778 Py_INCREF(FloorDiv_singleton);
3779 return FloorDiv_singleton;
3780 default:
3781 /* should never happen, but just in case ... */
3782 PyErr_Format(PyExc_SystemError, "unknown operator found");
3783 return NULL;
3784 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003785}
3786PyObject* ast2obj_unaryop(unaryop_ty o)
3787{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003788 switch(o) {
3789 case Invert:
3790 Py_INCREF(Invert_singleton);
3791 return Invert_singleton;
3792 case Not:
3793 Py_INCREF(Not_singleton);
3794 return Not_singleton;
3795 case UAdd:
3796 Py_INCREF(UAdd_singleton);
3797 return UAdd_singleton;
3798 case USub:
3799 Py_INCREF(USub_singleton);
3800 return USub_singleton;
3801 default:
3802 /* should never happen, but just in case ... */
3803 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3804 return NULL;
3805 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003806}
3807PyObject* ast2obj_cmpop(cmpop_ty o)
3808{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003809 switch(o) {
3810 case Eq:
3811 Py_INCREF(Eq_singleton);
3812 return Eq_singleton;
3813 case NotEq:
3814 Py_INCREF(NotEq_singleton);
3815 return NotEq_singleton;
3816 case Lt:
3817 Py_INCREF(Lt_singleton);
3818 return Lt_singleton;
3819 case LtE:
3820 Py_INCREF(LtE_singleton);
3821 return LtE_singleton;
3822 case Gt:
3823 Py_INCREF(Gt_singleton);
3824 return Gt_singleton;
3825 case GtE:
3826 Py_INCREF(GtE_singleton);
3827 return GtE_singleton;
3828 case Is:
3829 Py_INCREF(Is_singleton);
3830 return Is_singleton;
3831 case IsNot:
3832 Py_INCREF(IsNot_singleton);
3833 return IsNot_singleton;
3834 case In:
3835 Py_INCREF(In_singleton);
3836 return In_singleton;
3837 case NotIn:
3838 Py_INCREF(NotIn_singleton);
3839 return NotIn_singleton;
3840 default:
3841 /* should never happen, but just in case ... */
3842 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3843 return NULL;
3844 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003845}
3846PyObject*
3847ast2obj_comprehension(void* _o)
3848{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003849 comprehension_ty o = (comprehension_ty)_o;
3850 PyObject *result = NULL, *value = NULL;
3851 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003852 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003853 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003854
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003855 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3856 if (!result) return NULL;
3857 value = ast2obj_expr(o->target);
3858 if (!value) goto failed;
3859 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3860 goto failed;
3861 Py_DECREF(value);
3862 value = ast2obj_expr(o->iter);
3863 if (!value) goto failed;
3864 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3865 goto failed;
3866 Py_DECREF(value);
3867 value = ast2obj_list(o->ifs, ast2obj_expr);
3868 if (!value) goto failed;
3869 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3870 goto failed;
3871 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003872 value = ast2obj_int(o->is_async);
3873 if (!value) goto failed;
3874 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3875 goto failed;
3876 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003877 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003878failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003879 Py_XDECREF(value);
3880 Py_XDECREF(result);
3881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003882}
3883
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003884PyObject*
3885ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003886{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003887 excepthandler_ty o = (excepthandler_ty)_o;
3888 PyObject *result = NULL, *value = NULL;
3889 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003890 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003891 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003892
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003893 switch (o->kind) {
3894 case ExceptHandler_kind:
3895 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3896 if (!result) goto failed;
3897 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003898 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003899 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3900 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003901 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003902 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003903 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003904 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3905 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003906 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003907 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3908 if (!value) goto failed;
3909 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3910 goto failed;
3911 Py_DECREF(value);
3912 break;
3913 }
3914 value = ast2obj_int(o->lineno);
3915 if (!value) goto failed;
3916 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3917 goto failed;
3918 Py_DECREF(value);
3919 value = ast2obj_int(o->col_offset);
3920 if (!value) goto failed;
3921 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3922 goto failed;
3923 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003924 value = ast2obj_int(o->end_lineno);
3925 if (!value) goto failed;
3926 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3927 goto failed;
3928 Py_DECREF(value);
3929 value = ast2obj_int(o->end_col_offset);
3930 if (!value) goto failed;
3931 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3932 goto failed;
3933 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003934 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
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003941PyObject*
3942ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003943{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003944 arguments_ty o = (arguments_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 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003949
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003950 result = PyType_GenericNew(arguments_type, NULL, NULL);
3951 if (!result) return NULL;
3952 value = ast2obj_list(o->args, ast2obj_arg);
3953 if (!value) goto failed;
3954 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3955 goto failed;
3956 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003957 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003958 if (!value) goto failed;
3959 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3960 goto failed;
3961 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003962 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3963 if (!value) goto failed;
3964 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3965 goto failed;
3966 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003967 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003968 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003969 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003970 goto failed;
3971 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003972 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003973 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003974 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003975 goto failed;
3976 Py_DECREF(value);
3977 value = ast2obj_list(o->defaults, ast2obj_expr);
3978 if (!value) goto failed;
3979 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3980 goto failed;
3981 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003982 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003983failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003984 Py_XDECREF(value);
3985 Py_XDECREF(result);
3986 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003987}
3988
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003989PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003990ast2obj_arg(void* _o)
3991{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003992 arg_ty o = (arg_ty)_o;
3993 PyObject *result = NULL, *value = NULL;
3994 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003995 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003996 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003997
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003998 result = PyType_GenericNew(arg_type, NULL, NULL);
3999 if (!result) return NULL;
4000 value = ast2obj_identifier(o->arg);
4001 if (!value) goto failed;
4002 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4003 goto failed;
4004 Py_DECREF(value);
4005 value = ast2obj_expr(o->annotation);
4006 if (!value) goto failed;
4007 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
4008 goto failed;
4009 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004010 value = ast2obj_string(o->type_comment);
4011 if (!value) goto failed;
4012 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
4013 goto failed;
4014 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004015 value = ast2obj_int(o->lineno);
4016 if (!value) goto failed;
4017 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
4018 goto failed;
4019 Py_DECREF(value);
4020 value = ast2obj_int(o->col_offset);
4021 if (!value) goto failed;
4022 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
4023 goto failed;
4024 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004025 value = ast2obj_int(o->end_lineno);
4026 if (!value) goto failed;
4027 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
4028 goto failed;
4029 Py_DECREF(value);
4030 value = ast2obj_int(o->end_col_offset);
4031 if (!value) goto failed;
4032 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
4033 goto failed;
4034 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004035 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004036failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004037 Py_XDECREF(value);
4038 Py_XDECREF(result);
4039 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004040}
4041
4042PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004043ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004044{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004045 keyword_ty o = (keyword_ty)_o;
4046 PyObject *result = NULL, *value = NULL;
4047 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004048 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004049 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004050
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004051 result = PyType_GenericNew(keyword_type, NULL, NULL);
4052 if (!result) return NULL;
4053 value = ast2obj_identifier(o->arg);
4054 if (!value) goto failed;
4055 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4056 goto failed;
4057 Py_DECREF(value);
4058 value = ast2obj_expr(o->value);
4059 if (!value) goto failed;
4060 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
4061 goto failed;
4062 Py_DECREF(value);
4063 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004064failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004065 Py_XDECREF(value);
4066 Py_XDECREF(result);
4067 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004068}
4069
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004070PyObject*
4071ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004072{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004073 alias_ty o = (alias_ty)_o;
4074 PyObject *result = NULL, *value = NULL;
4075 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004076 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004077 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004078
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004079 result = PyType_GenericNew(alias_type, NULL, NULL);
4080 if (!result) return NULL;
4081 value = ast2obj_identifier(o->name);
4082 if (!value) goto failed;
4083 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
4084 goto failed;
4085 Py_DECREF(value);
4086 value = ast2obj_identifier(o->asname);
4087 if (!value) goto failed;
4088 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
4089 goto failed;
4090 Py_DECREF(value);
4091 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004092failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004093 Py_XDECREF(value);
4094 Py_XDECREF(result);
4095 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004096}
4097
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004098PyObject*
4099ast2obj_withitem(void* _o)
4100{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004101 withitem_ty o = (withitem_ty)_o;
4102 PyObject *result = NULL, *value = NULL;
4103 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004104 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004105 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004106
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004107 result = PyType_GenericNew(withitem_type, NULL, NULL);
4108 if (!result) return NULL;
4109 value = ast2obj_expr(o->context_expr);
4110 if (!value) goto failed;
4111 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
4112 goto failed;
4113 Py_DECREF(value);
4114 value = ast2obj_expr(o->optional_vars);
4115 if (!value) goto failed;
4116 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
4117 goto failed;
4118 Py_DECREF(value);
4119 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004120failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004121 Py_XDECREF(value);
4122 Py_XDECREF(result);
4123 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004124}
4125
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004126PyObject*
4127ast2obj_type_ignore(void* _o)
4128{
4129 type_ignore_ty o = (type_ignore_ty)_o;
4130 PyObject *result = NULL, *value = NULL;
4131 if (!o) {
4132 Py_RETURN_NONE;
4133 }
4134
4135 switch (o->kind) {
4136 case TypeIgnore_kind:
4137 result = PyType_GenericNew(TypeIgnore_type, NULL, NULL);
4138 if (!result) goto failed;
4139 value = ast2obj_int(o->v.TypeIgnore.lineno);
4140 if (!value) goto failed;
4141 if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1)
4142 goto failed;
4143 Py_DECREF(value);
4144 break;
4145 }
4146 return result;
4147failed:
4148 Py_XDECREF(value);
4149 Py_XDECREF(result);
4150 return NULL;
4151}
4152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004153
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004154int
4155obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
4156{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004157 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004158
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004159 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004160
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004161 if (obj == Py_None) {
4162 *out = NULL;
4163 return 0;
4164 }
4165 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
4166 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004167 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004168 }
4169 if (isinstance) {
4170 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004171 asdl_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004172
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004173 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4174 return 1;
4175 }
4176 if (tmp == NULL) {
4177 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4178 return 1;
4179 }
4180 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004181 int res;
4182 Py_ssize_t len;
4183 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004184 if (!PyList_Check(tmp)) {
4185 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4186 goto failed;
4187 }
4188 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004189 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004190 if (body == NULL) goto failed;
4191 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004192 stmt_ty val;
4193 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004194 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004195 if (len != PyList_GET_SIZE(tmp)) {
4196 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
4197 goto failed;
4198 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004199 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004200 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004201 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004202 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004203 if (_PyObject_LookupAttrId(obj, &PyId_type_ignores, &tmp) < 0) {
4204 return 1;
4205 }
4206 if (tmp == NULL) {
4207 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
4208 return 1;
4209 }
4210 else {
4211 int res;
4212 Py_ssize_t len;
4213 Py_ssize_t i;
4214 if (!PyList_Check(tmp)) {
4215 PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4216 goto failed;
4217 }
4218 len = PyList_GET_SIZE(tmp);
4219 type_ignores = _Py_asdl_seq_new(len, arena);
4220 if (type_ignores == NULL) goto failed;
4221 for (i = 0; i < len; i++) {
4222 type_ignore_ty val;
4223 res = obj2ast_type_ignore(PyList_GET_ITEM(tmp, i), &val, arena);
4224 if (res != 0) goto failed;
4225 if (len != PyList_GET_SIZE(tmp)) {
4226 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
4227 goto failed;
4228 }
4229 asdl_seq_SET(type_ignores, i, val);
4230 }
4231 Py_CLEAR(tmp);
4232 }
4233 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004234 if (*out == NULL) goto failed;
4235 return 0;
4236 }
4237 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
4238 if (isinstance == -1) {
4239 return 1;
4240 }
4241 if (isinstance) {
4242 asdl_seq* body;
4243
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004244 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4245 return 1;
4246 }
4247 if (tmp == NULL) {
4248 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4249 return 1;
4250 }
4251 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004252 int res;
4253 Py_ssize_t len;
4254 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004255 if (!PyList_Check(tmp)) {
4256 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4257 goto failed;
4258 }
4259 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004260 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004261 if (body == NULL) goto failed;
4262 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004263 stmt_ty val;
4264 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004265 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004266 if (len != PyList_GET_SIZE(tmp)) {
4267 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4268 goto failed;
4269 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004270 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004271 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004272 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004273 }
4274 *out = Interactive(body, arena);
4275 if (*out == NULL) goto failed;
4276 return 0;
4277 }
4278 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4279 if (isinstance == -1) {
4280 return 1;
4281 }
4282 if (isinstance) {
4283 expr_ty body;
4284
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004285 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4286 return 1;
4287 }
4288 if (tmp == NULL) {
4289 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4290 return 1;
4291 }
4292 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004293 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004294 res = obj2ast_expr(tmp, &body, arena);
4295 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004296 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004297 }
4298 *out = Expression(body, arena);
4299 if (*out == NULL) goto failed;
4300 return 0;
4301 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004302 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionType_type);
4303 if (isinstance == -1) {
4304 return 1;
4305 }
4306 if (isinstance) {
4307 asdl_seq* argtypes;
4308 expr_ty returns;
4309
4310 if (_PyObject_LookupAttrId(obj, &PyId_argtypes, &tmp) < 0) {
4311 return 1;
4312 }
4313 if (tmp == NULL) {
4314 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
4315 return 1;
4316 }
4317 else {
4318 int res;
4319 Py_ssize_t len;
4320 Py_ssize_t i;
4321 if (!PyList_Check(tmp)) {
4322 PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4323 goto failed;
4324 }
4325 len = PyList_GET_SIZE(tmp);
4326 argtypes = _Py_asdl_seq_new(len, arena);
4327 if (argtypes == NULL) goto failed;
4328 for (i = 0; i < len; i++) {
4329 expr_ty val;
4330 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
4331 if (res != 0) goto failed;
4332 if (len != PyList_GET_SIZE(tmp)) {
4333 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
4334 goto failed;
4335 }
4336 asdl_seq_SET(argtypes, i, val);
4337 }
4338 Py_CLEAR(tmp);
4339 }
4340 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
4341 return 1;
4342 }
4343 if (tmp == NULL) {
4344 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
4345 return 1;
4346 }
4347 else {
4348 int res;
4349 res = obj2ast_expr(tmp, &returns, arena);
4350 if (res != 0) goto failed;
4351 Py_CLEAR(tmp);
4352 }
4353 *out = FunctionType(argtypes, returns, arena);
4354 if (*out == NULL) goto failed;
4355 return 0;
4356 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004357 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4358 if (isinstance == -1) {
4359 return 1;
4360 }
4361 if (isinstance) {
4362 asdl_seq* body;
4363
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004364 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4365 return 1;
4366 }
4367 if (tmp == NULL) {
4368 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4369 return 1;
4370 }
4371 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004372 int res;
4373 Py_ssize_t len;
4374 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004375 if (!PyList_Check(tmp)) {
4376 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4377 goto failed;
4378 }
4379 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004380 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004381 if (body == NULL) goto failed;
4382 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004383 stmt_ty val;
4384 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004385 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004386 if (len != PyList_GET_SIZE(tmp)) {
4387 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4388 goto failed;
4389 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004390 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004391 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004392 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004393 }
4394 *out = Suite(body, arena);
4395 if (*out == NULL) goto failed;
4396 return 0;
4397 }
4398
4399 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4400 failed:
4401 Py_XDECREF(tmp);
4402 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004403}
4404
4405int
4406obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4407{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004408 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004409
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004410 PyObject *tmp = NULL;
4411 int lineno;
4412 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004413 int end_lineno;
4414 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004415
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004416 if (obj == Py_None) {
4417 *out = NULL;
4418 return 0;
4419 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004420 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4421 return 1;
4422 }
4423 if (tmp == NULL) {
4424 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4425 return 1;
4426 }
4427 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004428 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004429 res = obj2ast_int(tmp, &lineno, arena);
4430 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004431 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004432 }
4433 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004434 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004435 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004436 if (tmp == NULL) {
4437 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4438 return 1;
4439 }
4440 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004441 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004442 res = obj2ast_int(tmp, &col_offset, arena);
4443 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004444 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004445 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004446 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
4447 return 1;
4448 }
4449 if (tmp == NULL || tmp == Py_None) {
4450 Py_CLEAR(tmp);
4451 end_lineno = 0;
4452 }
4453 else {
4454 int res;
4455 res = obj2ast_int(tmp, &end_lineno, arena);
4456 if (res != 0) goto failed;
4457 Py_CLEAR(tmp);
4458 }
4459 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
4460 return 1;
4461 }
4462 if (tmp == NULL || tmp == Py_None) {
4463 Py_CLEAR(tmp);
4464 end_col_offset = 0;
4465 }
4466 else {
4467 int res;
4468 res = obj2ast_int(tmp, &end_col_offset, arena);
4469 if (res != 0) goto failed;
4470 Py_CLEAR(tmp);
4471 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004472 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4473 if (isinstance == -1) {
4474 return 1;
4475 }
4476 if (isinstance) {
4477 identifier name;
4478 arguments_ty args;
4479 asdl_seq* body;
4480 asdl_seq* decorator_list;
4481 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004482 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004483
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004484 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4485 return 1;
4486 }
4487 if (tmp == NULL) {
4488 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4489 return 1;
4490 }
4491 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004492 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004493 res = obj2ast_identifier(tmp, &name, arena);
4494 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004495 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004496 }
4497 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004498 return 1;
4499 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004500 if (tmp == NULL) {
4501 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4502 return 1;
4503 }
4504 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004505 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004506 res = obj2ast_arguments(tmp, &args, arena);
4507 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004508 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004509 }
4510 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004511 return 1;
4512 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004513 if (tmp == NULL) {
4514 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4515 return 1;
4516 }
4517 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004518 int res;
4519 Py_ssize_t len;
4520 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004521 if (!PyList_Check(tmp)) {
4522 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4523 goto failed;
4524 }
4525 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004526 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004527 if (body == NULL) goto failed;
4528 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004529 stmt_ty val;
4530 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004531 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004532 if (len != PyList_GET_SIZE(tmp)) {
4533 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4534 goto failed;
4535 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004536 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004537 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004538 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004539 }
4540 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004541 return 1;
4542 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004543 if (tmp == NULL) {
4544 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4545 return 1;
4546 }
4547 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004548 int res;
4549 Py_ssize_t len;
4550 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004551 if (!PyList_Check(tmp)) {
4552 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4553 goto failed;
4554 }
4555 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004556 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004557 if (decorator_list == NULL) goto failed;
4558 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004559 expr_ty val;
4560 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004561 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004562 if (len != PyList_GET_SIZE(tmp)) {
4563 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4564 goto failed;
4565 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004566 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004567 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004568 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004569 }
4570 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004571 return 1;
4572 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004573 if (tmp == NULL || tmp == Py_None) {
4574 Py_CLEAR(tmp);
4575 returns = NULL;
4576 }
4577 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004578 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004579 res = obj2ast_expr(tmp, &returns, arena);
4580 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004581 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004582 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004583 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4584 return 1;
4585 }
4586 if (tmp == NULL || tmp == Py_None) {
4587 Py_CLEAR(tmp);
4588 type_comment = NULL;
4589 }
4590 else {
4591 int res;
4592 res = obj2ast_string(tmp, &type_comment, arena);
4593 if (res != 0) goto failed;
4594 Py_CLEAR(tmp);
4595 }
4596 *out = FunctionDef(name, args, body, decorator_list, returns,
4597 type_comment, lineno, col_offset, end_lineno,
4598 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004599 if (*out == NULL) goto failed;
4600 return 0;
4601 }
Yury Selivanov75445082015-05-11 22:57:16 -04004602 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4603 if (isinstance == -1) {
4604 return 1;
4605 }
4606 if (isinstance) {
4607 identifier name;
4608 arguments_ty args;
4609 asdl_seq* body;
4610 asdl_seq* decorator_list;
4611 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004612 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04004613
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004614 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4615 return 1;
4616 }
4617 if (tmp == NULL) {
4618 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4619 return 1;
4620 }
4621 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004622 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004623 res = obj2ast_identifier(tmp, &name, arena);
4624 if (res != 0) goto failed;
4625 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004626 }
4627 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004628 return 1;
4629 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004630 if (tmp == NULL) {
4631 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4632 return 1;
4633 }
4634 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004635 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004636 res = obj2ast_arguments(tmp, &args, arena);
4637 if (res != 0) goto failed;
4638 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004639 }
4640 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004641 return 1;
4642 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004643 if (tmp == NULL) {
4644 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4645 return 1;
4646 }
4647 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004648 int res;
4649 Py_ssize_t len;
4650 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004651 if (!PyList_Check(tmp)) {
4652 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4653 goto failed;
4654 }
4655 len = PyList_GET_SIZE(tmp);
4656 body = _Py_asdl_seq_new(len, arena);
4657 if (body == NULL) goto failed;
4658 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004659 stmt_ty val;
4660 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004661 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004662 if (len != PyList_GET_SIZE(tmp)) {
4663 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4664 goto failed;
4665 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004666 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004667 }
4668 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004669 }
4670 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004671 return 1;
4672 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004673 if (tmp == NULL) {
4674 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4675 return 1;
4676 }
4677 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004678 int res;
4679 Py_ssize_t len;
4680 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004681 if (!PyList_Check(tmp)) {
4682 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4683 goto failed;
4684 }
4685 len = PyList_GET_SIZE(tmp);
4686 decorator_list = _Py_asdl_seq_new(len, arena);
4687 if (decorator_list == NULL) goto failed;
4688 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004689 expr_ty val;
4690 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004691 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004692 if (len != PyList_GET_SIZE(tmp)) {
4693 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4694 goto failed;
4695 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004696 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004697 }
4698 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004699 }
4700 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004701 return 1;
4702 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004703 if (tmp == NULL || tmp == Py_None) {
4704 Py_CLEAR(tmp);
4705 returns = NULL;
4706 }
4707 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004708 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004709 res = obj2ast_expr(tmp, &returns, arena);
4710 if (res != 0) goto failed;
4711 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004712 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004713 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4714 return 1;
4715 }
4716 if (tmp == NULL || tmp == Py_None) {
4717 Py_CLEAR(tmp);
4718 type_comment = NULL;
4719 }
4720 else {
4721 int res;
4722 res = obj2ast_string(tmp, &type_comment, arena);
4723 if (res != 0) goto failed;
4724 Py_CLEAR(tmp);
4725 }
Yury Selivanov75445082015-05-11 22:57:16 -04004726 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004727 type_comment, lineno, col_offset, end_lineno,
4728 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004729 if (*out == NULL) goto failed;
4730 return 0;
4731 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004732 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4733 if (isinstance == -1) {
4734 return 1;
4735 }
4736 if (isinstance) {
4737 identifier name;
4738 asdl_seq* bases;
4739 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004740 asdl_seq* body;
4741 asdl_seq* decorator_list;
4742
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004743 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4744 return 1;
4745 }
4746 if (tmp == NULL) {
4747 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4748 return 1;
4749 }
4750 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004751 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004752 res = obj2ast_identifier(tmp, &name, arena);
4753 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004754 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004755 }
4756 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004757 return 1;
4758 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004759 if (tmp == NULL) {
4760 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4761 return 1;
4762 }
4763 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004764 int res;
4765 Py_ssize_t len;
4766 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004767 if (!PyList_Check(tmp)) {
4768 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4769 goto failed;
4770 }
4771 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004772 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 if (bases == NULL) goto failed;
4774 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004775 expr_ty val;
4776 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004777 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004778 if (len != PyList_GET_SIZE(tmp)) {
4779 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4780 goto failed;
4781 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004782 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004783 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004784 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004785 }
4786 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004787 return 1;
4788 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004789 if (tmp == NULL) {
4790 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4791 return 1;
4792 }
4793 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004794 int res;
4795 Py_ssize_t len;
4796 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004797 if (!PyList_Check(tmp)) {
4798 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4799 goto failed;
4800 }
4801 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004802 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004803 if (keywords == NULL) goto failed;
4804 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004805 keyword_ty val;
4806 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004807 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004808 if (len != PyList_GET_SIZE(tmp)) {
4809 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4810 goto failed;
4811 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004812 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004813 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004814 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004815 }
4816 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004817 return 1;
4818 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004819 if (tmp == NULL) {
4820 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4821 return 1;
4822 }
4823 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004824 int res;
4825 Py_ssize_t len;
4826 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004827 if (!PyList_Check(tmp)) {
4828 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4829 goto failed;
4830 }
4831 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004832 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004833 if (body == NULL) goto failed;
4834 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004835 stmt_ty val;
4836 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004837 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004838 if (len != PyList_GET_SIZE(tmp)) {
4839 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4840 goto failed;
4841 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004842 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004843 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004844 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004845 }
4846 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004847 return 1;
4848 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004849 if (tmp == NULL) {
4850 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4851 return 1;
4852 }
4853 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004854 int res;
4855 Py_ssize_t len;
4856 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004857 if (!PyList_Check(tmp)) {
4858 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4859 goto failed;
4860 }
4861 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004862 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004863 if (decorator_list == NULL) goto failed;
4864 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004865 expr_ty val;
4866 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004867 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004868 if (len != PyList_GET_SIZE(tmp)) {
4869 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4870 goto failed;
4871 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004872 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004873 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004874 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004875 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004876 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004877 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004878 if (*out == NULL) goto failed;
4879 return 0;
4880 }
4881 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4882 if (isinstance == -1) {
4883 return 1;
4884 }
4885 if (isinstance) {
4886 expr_ty value;
4887
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004888 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4889 return 1;
4890 }
4891 if (tmp == NULL || tmp == Py_None) {
4892 Py_CLEAR(tmp);
4893 value = NULL;
4894 }
4895 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004896 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004897 res = obj2ast_expr(tmp, &value, arena);
4898 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004899 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004900 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004901 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
4902 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004903 if (*out == NULL) goto failed;
4904 return 0;
4905 }
4906 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4907 if (isinstance == -1) {
4908 return 1;
4909 }
4910 if (isinstance) {
4911 asdl_seq* targets;
4912
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004913 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4914 return 1;
4915 }
4916 if (tmp == NULL) {
4917 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4918 return 1;
4919 }
4920 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004921 int res;
4922 Py_ssize_t len;
4923 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004924 if (!PyList_Check(tmp)) {
4925 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4926 goto failed;
4927 }
4928 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004929 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004930 if (targets == NULL) goto failed;
4931 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004932 expr_ty val;
4933 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004934 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004935 if (len != PyList_GET_SIZE(tmp)) {
4936 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4937 goto failed;
4938 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004939 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004940 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004941 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004942 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004943 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
4944 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004945 if (*out == NULL) goto failed;
4946 return 0;
4947 }
4948 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4949 if (isinstance == -1) {
4950 return 1;
4951 }
4952 if (isinstance) {
4953 asdl_seq* targets;
4954 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004955 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004956
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004957 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4958 return 1;
4959 }
4960 if (tmp == NULL) {
4961 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4962 return 1;
4963 }
4964 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004965 int res;
4966 Py_ssize_t len;
4967 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004968 if (!PyList_Check(tmp)) {
4969 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4970 goto failed;
4971 }
4972 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004973 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004974 if (targets == NULL) goto failed;
4975 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004976 expr_ty val;
4977 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004978 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004979 if (len != PyList_GET_SIZE(tmp)) {
4980 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4981 goto failed;
4982 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004983 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004984 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004985 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004986 }
4987 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004988 return 1;
4989 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004990 if (tmp == NULL) {
4991 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4992 return 1;
4993 }
4994 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004995 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004996 res = obj2ast_expr(tmp, &value, arena);
4997 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004998 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004999 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005000 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5001 return 1;
5002 }
5003 if (tmp == NULL || tmp == Py_None) {
5004 Py_CLEAR(tmp);
5005 type_comment = NULL;
5006 }
5007 else {
5008 int res;
5009 res = obj2ast_string(tmp, &type_comment, arena);
5010 if (res != 0) goto failed;
5011 Py_CLEAR(tmp);
5012 }
5013 *out = Assign(targets, value, type_comment, lineno, col_offset,
5014 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005015 if (*out == NULL) goto failed;
5016 return 0;
5017 }
5018 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
5019 if (isinstance == -1) {
5020 return 1;
5021 }
5022 if (isinstance) {
5023 expr_ty target;
5024 operator_ty op;
5025 expr_ty value;
5026
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005027 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5028 return 1;
5029 }
5030 if (tmp == NULL) {
5031 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
5032 return 1;
5033 }
5034 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005035 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005036 res = obj2ast_expr(tmp, &target, arena);
5037 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005038 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005039 }
5040 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005041 return 1;
5042 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005043 if (tmp == NULL) {
5044 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
5045 return 1;
5046 }
5047 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005048 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005049 res = obj2ast_operator(tmp, &op, arena);
5050 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005051 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005052 }
5053 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005054 return 1;
5055 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005056 if (tmp == NULL) {
5057 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
5058 return 1;
5059 }
5060 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005061 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005062 res = obj2ast_expr(tmp, &value, arena);
5063 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005064 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005065 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005066 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
5067 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005068 if (*out == NULL) goto failed;
5069 return 0;
5070 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005071 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
5072 if (isinstance == -1) {
5073 return 1;
5074 }
5075 if (isinstance) {
5076 expr_ty target;
5077 expr_ty annotation;
5078 expr_ty value;
5079 int simple;
5080
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005081 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5082 return 1;
5083 }
5084 if (tmp == NULL) {
5085 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
5086 return 1;
5087 }
5088 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005089 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005090 res = obj2ast_expr(tmp, &target, arena);
5091 if (res != 0) goto failed;
5092 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005093 }
5094 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005095 return 1;
5096 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005097 if (tmp == NULL) {
5098 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
5099 return 1;
5100 }
5101 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005102 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005103 res = obj2ast_expr(tmp, &annotation, arena);
5104 if (res != 0) goto failed;
5105 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005106 }
5107 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005108 return 1;
5109 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005110 if (tmp == NULL || tmp == Py_None) {
5111 Py_CLEAR(tmp);
5112 value = NULL;
5113 }
5114 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005115 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005116 res = obj2ast_expr(tmp, &value, arena);
5117 if (res != 0) goto failed;
5118 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005119 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005120 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
5121 return 1;
5122 }
5123 if (tmp == NULL) {
5124 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
5125 return 1;
5126 }
5127 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005128 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005129 res = obj2ast_int(tmp, &simple, arena);
5130 if (res != 0) goto failed;
5131 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005132 }
5133 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005134 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005135 if (*out == NULL) goto failed;
5136 return 0;
5137 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005138 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
5139 if (isinstance == -1) {
5140 return 1;
5141 }
5142 if (isinstance) {
5143 expr_ty target;
5144 expr_ty iter;
5145 asdl_seq* body;
5146 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005147 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005148
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005149 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5150 return 1;
5151 }
5152 if (tmp == NULL) {
5153 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
5154 return 1;
5155 }
5156 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005157 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005158 res = obj2ast_expr(tmp, &target, arena);
5159 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005160 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005161 }
5162 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005163 return 1;
5164 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005165 if (tmp == NULL) {
5166 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
5167 return 1;
5168 }
5169 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005170 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005171 res = obj2ast_expr(tmp, &iter, arena);
5172 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005173 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005174 }
5175 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005176 return 1;
5177 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005178 if (tmp == NULL) {
5179 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
5180 return 1;
5181 }
5182 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005183 int res;
5184 Py_ssize_t len;
5185 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005186 if (!PyList_Check(tmp)) {
5187 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5188 goto failed;
5189 }
5190 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005191 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005192 if (body == NULL) goto failed;
5193 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005194 stmt_ty val;
5195 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005196 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005197 if (len != PyList_GET_SIZE(tmp)) {
5198 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
5199 goto failed;
5200 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005201 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005202 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005203 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005204 }
5205 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005206 return 1;
5207 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005208 if (tmp == NULL) {
5209 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
5210 return 1;
5211 }
5212 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005213 int res;
5214 Py_ssize_t len;
5215 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005216 if (!PyList_Check(tmp)) {
5217 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5218 goto failed;
5219 }
5220 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005221 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005222 if (orelse == NULL) goto failed;
5223 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005224 stmt_ty val;
5225 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005226 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005227 if (len != PyList_GET_SIZE(tmp)) {
5228 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
5229 goto failed;
5230 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005231 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005232 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005233 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005234 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005235 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5236 return 1;
5237 }
5238 if (tmp == NULL || tmp == Py_None) {
5239 Py_CLEAR(tmp);
5240 type_comment = NULL;
5241 }
5242 else {
5243 int res;
5244 res = obj2ast_string(tmp, &type_comment, arena);
5245 if (res != 0) goto failed;
5246 Py_CLEAR(tmp);
5247 }
5248 *out = For(target, iter, body, orelse, type_comment, lineno,
5249 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005250 if (*out == NULL) goto failed;
5251 return 0;
5252 }
Yury Selivanov75445082015-05-11 22:57:16 -04005253 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
5254 if (isinstance == -1) {
5255 return 1;
5256 }
5257 if (isinstance) {
5258 expr_ty target;
5259 expr_ty iter;
5260 asdl_seq* body;
5261 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005262 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005263
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005264 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5265 return 1;
5266 }
5267 if (tmp == NULL) {
5268 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
5269 return 1;
5270 }
5271 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005272 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04005273 res = obj2ast_expr(tmp, &target, arena);
5274 if (res != 0) goto failed;
5275 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005276 }
5277 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005278 return 1;
5279 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005280 if (tmp == NULL) {
5281 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
5282 return 1;
5283 }
5284 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005285 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04005286 res = obj2ast_expr(tmp, &iter, arena);
5287 if (res != 0) goto failed;
5288 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005289 }
5290 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005291 return 1;
5292 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005293 if (tmp == NULL) {
5294 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
5295 return 1;
5296 }
5297 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005298 int res;
5299 Py_ssize_t len;
5300 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005301 if (!PyList_Check(tmp)) {
5302 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5303 goto failed;
5304 }
5305 len = PyList_GET_SIZE(tmp);
5306 body = _Py_asdl_seq_new(len, arena);
5307 if (body == NULL) goto failed;
5308 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005309 stmt_ty val;
5310 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005311 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005312 if (len != PyList_GET_SIZE(tmp)) {
5313 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
5314 goto failed;
5315 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005316 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005317 }
5318 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005319 }
5320 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005321 return 1;
5322 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005323 if (tmp == NULL) {
5324 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
5325 return 1;
5326 }
5327 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005328 int res;
5329 Py_ssize_t len;
5330 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005331 if (!PyList_Check(tmp)) {
5332 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5333 goto failed;
5334 }
5335 len = PyList_GET_SIZE(tmp);
5336 orelse = _Py_asdl_seq_new(len, arena);
5337 if (orelse == NULL) goto failed;
5338 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005339 stmt_ty val;
5340 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005341 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005342 if (len != PyList_GET_SIZE(tmp)) {
5343 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
5344 goto failed;
5345 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005346 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005347 }
5348 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005349 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005350 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5351 return 1;
5352 }
5353 if (tmp == NULL || tmp == Py_None) {
5354 Py_CLEAR(tmp);
5355 type_comment = NULL;
5356 }
5357 else {
5358 int res;
5359 res = obj2ast_string(tmp, &type_comment, arena);
5360 if (res != 0) goto failed;
5361 Py_CLEAR(tmp);
5362 }
5363 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
5364 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005365 if (*out == NULL) goto failed;
5366 return 0;
5367 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005368 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
5369 if (isinstance == -1) {
5370 return 1;
5371 }
5372 if (isinstance) {
5373 expr_ty test;
5374 asdl_seq* body;
5375 asdl_seq* orelse;
5376
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005377 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5378 return 1;
5379 }
5380 if (tmp == NULL) {
5381 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
5382 return 1;
5383 }
5384 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005385 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005386 res = obj2ast_expr(tmp, &test, arena);
5387 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005388 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005389 }
5390 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005391 return 1;
5392 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005393 if (tmp == NULL) {
5394 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
5395 return 1;
5396 }
5397 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005398 int res;
5399 Py_ssize_t len;
5400 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005401 if (!PyList_Check(tmp)) {
5402 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5403 goto failed;
5404 }
5405 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005406 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005407 if (body == NULL) goto failed;
5408 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005409 stmt_ty val;
5410 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005411 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005412 if (len != PyList_GET_SIZE(tmp)) {
5413 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5414 goto failed;
5415 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005416 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005417 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005418 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005419 }
5420 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005421 return 1;
5422 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005423 if (tmp == NULL) {
5424 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5425 return 1;
5426 }
5427 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005428 int res;
5429 Py_ssize_t len;
5430 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005431 if (!PyList_Check(tmp)) {
5432 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5433 goto failed;
5434 }
5435 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005436 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005437 if (orelse == NULL) goto failed;
5438 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005439 stmt_ty val;
5440 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005441 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005442 if (len != PyList_GET_SIZE(tmp)) {
5443 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5444 goto failed;
5445 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005446 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005447 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005448 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005449 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005450 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
5451 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005452 if (*out == NULL) goto failed;
5453 return 0;
5454 }
5455 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5456 if (isinstance == -1) {
5457 return 1;
5458 }
5459 if (isinstance) {
5460 expr_ty test;
5461 asdl_seq* body;
5462 asdl_seq* orelse;
5463
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005464 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5465 return 1;
5466 }
5467 if (tmp == NULL) {
5468 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5469 return 1;
5470 }
5471 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005472 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005473 res = obj2ast_expr(tmp, &test, arena);
5474 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005475 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005476 }
5477 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005478 return 1;
5479 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005480 if (tmp == NULL) {
5481 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5482 return 1;
5483 }
5484 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005485 int res;
5486 Py_ssize_t len;
5487 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005488 if (!PyList_Check(tmp)) {
5489 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5490 goto failed;
5491 }
5492 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005493 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005494 if (body == NULL) goto failed;
5495 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005496 stmt_ty val;
5497 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005498 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005499 if (len != PyList_GET_SIZE(tmp)) {
5500 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5501 goto failed;
5502 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005503 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005504 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005505 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005506 }
5507 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005508 return 1;
5509 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005510 if (tmp == NULL) {
5511 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5512 return 1;
5513 }
5514 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005515 int res;
5516 Py_ssize_t len;
5517 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005518 if (!PyList_Check(tmp)) {
5519 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5520 goto failed;
5521 }
5522 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005523 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005524 if (orelse == NULL) goto failed;
5525 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005526 stmt_ty val;
5527 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005528 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005529 if (len != PyList_GET_SIZE(tmp)) {
5530 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5531 goto failed;
5532 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005533 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005534 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005535 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005536 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005537 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
5538 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005539 if (*out == NULL) goto failed;
5540 return 0;
5541 }
5542 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5543 if (isinstance == -1) {
5544 return 1;
5545 }
5546 if (isinstance) {
5547 asdl_seq* items;
5548 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005549 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005550
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005551 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5552 return 1;
5553 }
5554 if (tmp == NULL) {
5555 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5556 return 1;
5557 }
5558 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005559 int res;
5560 Py_ssize_t len;
5561 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005562 if (!PyList_Check(tmp)) {
5563 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5564 goto failed;
5565 }
5566 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005567 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005568 if (items == NULL) goto failed;
5569 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005570 withitem_ty val;
5571 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005572 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005573 if (len != PyList_GET_SIZE(tmp)) {
5574 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5575 goto failed;
5576 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005577 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005578 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005579 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005580 }
5581 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005582 return 1;
5583 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005584 if (tmp == NULL) {
5585 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5586 return 1;
5587 }
5588 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005589 int res;
5590 Py_ssize_t len;
5591 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005592 if (!PyList_Check(tmp)) {
5593 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5594 goto failed;
5595 }
5596 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005597 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005598 if (body == NULL) goto failed;
5599 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005600 stmt_ty val;
5601 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005602 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005603 if (len != PyList_GET_SIZE(tmp)) {
5604 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5605 goto failed;
5606 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005607 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005608 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005609 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005610 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005611 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5612 return 1;
5613 }
5614 if (tmp == NULL || tmp == Py_None) {
5615 Py_CLEAR(tmp);
5616 type_comment = NULL;
5617 }
5618 else {
5619 int res;
5620 res = obj2ast_string(tmp, &type_comment, arena);
5621 if (res != 0) goto failed;
5622 Py_CLEAR(tmp);
5623 }
5624 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005625 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005626 if (*out == NULL) goto failed;
5627 return 0;
5628 }
Yury Selivanov75445082015-05-11 22:57:16 -04005629 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5630 if (isinstance == -1) {
5631 return 1;
5632 }
5633 if (isinstance) {
5634 asdl_seq* items;
5635 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005636 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005637
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005638 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5639 return 1;
5640 }
5641 if (tmp == NULL) {
5642 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5643 return 1;
5644 }
5645 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005646 int res;
5647 Py_ssize_t len;
5648 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005649 if (!PyList_Check(tmp)) {
5650 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5651 goto failed;
5652 }
5653 len = PyList_GET_SIZE(tmp);
5654 items = _Py_asdl_seq_new(len, arena);
5655 if (items == NULL) goto failed;
5656 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005657 withitem_ty val;
5658 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005659 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005660 if (len != PyList_GET_SIZE(tmp)) {
5661 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5662 goto failed;
5663 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005664 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005665 }
5666 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005667 }
5668 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005669 return 1;
5670 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005671 if (tmp == NULL) {
5672 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5673 return 1;
5674 }
5675 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005676 int res;
5677 Py_ssize_t len;
5678 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005679 if (!PyList_Check(tmp)) {
5680 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5681 goto failed;
5682 }
5683 len = PyList_GET_SIZE(tmp);
5684 body = _Py_asdl_seq_new(len, arena);
5685 if (body == NULL) goto failed;
5686 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005687 stmt_ty val;
5688 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005689 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005690 if (len != PyList_GET_SIZE(tmp)) {
5691 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5692 goto failed;
5693 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005694 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005695 }
5696 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005697 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005698 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5699 return 1;
5700 }
5701 if (tmp == NULL || tmp == Py_None) {
5702 Py_CLEAR(tmp);
5703 type_comment = NULL;
5704 }
5705 else {
5706 int res;
5707 res = obj2ast_string(tmp, &type_comment, arena);
5708 if (res != 0) goto failed;
5709 Py_CLEAR(tmp);
5710 }
5711 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
5712 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005713 if (*out == NULL) goto failed;
5714 return 0;
5715 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005716 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5717 if (isinstance == -1) {
5718 return 1;
5719 }
5720 if (isinstance) {
5721 expr_ty exc;
5722 expr_ty cause;
5723
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005724 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5725 return 1;
5726 }
5727 if (tmp == NULL || tmp == Py_None) {
5728 Py_CLEAR(tmp);
5729 exc = NULL;
5730 }
5731 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005732 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005733 res = obj2ast_expr(tmp, &exc, arena);
5734 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005735 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005736 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005737 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5738 return 1;
5739 }
5740 if (tmp == NULL || tmp == Py_None) {
5741 Py_CLEAR(tmp);
5742 cause = NULL;
5743 }
5744 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005745 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005746 res = obj2ast_expr(tmp, &cause, arena);
5747 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005748 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005749 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005750 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
5751 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005752 if (*out == NULL) goto failed;
5753 return 0;
5754 }
5755 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5756 if (isinstance == -1) {
5757 return 1;
5758 }
5759 if (isinstance) {
5760 asdl_seq* body;
5761 asdl_seq* handlers;
5762 asdl_seq* orelse;
5763 asdl_seq* finalbody;
5764
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005765 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5766 return 1;
5767 }
5768 if (tmp == NULL) {
5769 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5770 return 1;
5771 }
5772 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005773 int res;
5774 Py_ssize_t len;
5775 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005776 if (!PyList_Check(tmp)) {
5777 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5778 goto failed;
5779 }
5780 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005781 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005782 if (body == NULL) goto failed;
5783 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005784 stmt_ty val;
5785 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005786 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005787 if (len != PyList_GET_SIZE(tmp)) {
5788 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5789 goto failed;
5790 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005791 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005792 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005793 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005794 }
5795 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005796 return 1;
5797 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005798 if (tmp == NULL) {
5799 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5800 return 1;
5801 }
5802 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005803 int res;
5804 Py_ssize_t len;
5805 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005806 if (!PyList_Check(tmp)) {
5807 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5808 goto failed;
5809 }
5810 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005811 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005812 if (handlers == NULL) goto failed;
5813 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005814 excepthandler_ty val;
5815 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005816 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005817 if (len != PyList_GET_SIZE(tmp)) {
5818 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5819 goto failed;
5820 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005821 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005822 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005823 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005824 }
5825 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005826 return 1;
5827 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005828 if (tmp == NULL) {
5829 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5830 return 1;
5831 }
5832 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005833 int res;
5834 Py_ssize_t len;
5835 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005836 if (!PyList_Check(tmp)) {
5837 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5838 goto failed;
5839 }
5840 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005841 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005842 if (orelse == NULL) goto failed;
5843 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005844 stmt_ty val;
5845 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005846 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005847 if (len != PyList_GET_SIZE(tmp)) {
5848 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5849 goto failed;
5850 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005851 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005852 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005853 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005854 }
5855 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005856 return 1;
5857 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005858 if (tmp == NULL) {
5859 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5860 return 1;
5861 }
5862 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005863 int res;
5864 Py_ssize_t len;
5865 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005866 if (!PyList_Check(tmp)) {
5867 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5868 goto failed;
5869 }
5870 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005871 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005872 if (finalbody == NULL) goto failed;
5873 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005874 stmt_ty val;
5875 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005876 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005877 if (len != PyList_GET_SIZE(tmp)) {
5878 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5879 goto failed;
5880 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005881 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005882 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005883 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005884 }
5885 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005886 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005887 if (*out == NULL) goto failed;
5888 return 0;
5889 }
5890 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5891 if (isinstance == -1) {
5892 return 1;
5893 }
5894 if (isinstance) {
5895 expr_ty test;
5896 expr_ty msg;
5897
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005898 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5899 return 1;
5900 }
5901 if (tmp == NULL) {
5902 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5903 return 1;
5904 }
5905 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005906 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005907 res = obj2ast_expr(tmp, &test, arena);
5908 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005909 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005910 }
5911 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005912 return 1;
5913 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005914 if (tmp == NULL || tmp == Py_None) {
5915 Py_CLEAR(tmp);
5916 msg = NULL;
5917 }
5918 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005919 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005920 res = obj2ast_expr(tmp, &msg, arena);
5921 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005922 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005923 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005924 *out = Assert(test, msg, lineno, col_offset, end_lineno,
5925 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005926 if (*out == NULL) goto failed;
5927 return 0;
5928 }
5929 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5930 if (isinstance == -1) {
5931 return 1;
5932 }
5933 if (isinstance) {
5934 asdl_seq* names;
5935
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005936 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5937 return 1;
5938 }
5939 if (tmp == NULL) {
5940 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5941 return 1;
5942 }
5943 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005944 int res;
5945 Py_ssize_t len;
5946 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005947 if (!PyList_Check(tmp)) {
5948 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5949 goto failed;
5950 }
5951 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005952 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005953 if (names == NULL) goto failed;
5954 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005955 alias_ty val;
5956 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005957 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005958 if (len != PyList_GET_SIZE(tmp)) {
5959 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5960 goto failed;
5961 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005962 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005963 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005964 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005965 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005966 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
5967 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005968 if (*out == NULL) goto failed;
5969 return 0;
5970 }
5971 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5972 if (isinstance == -1) {
5973 return 1;
5974 }
5975 if (isinstance) {
5976 identifier module;
5977 asdl_seq* names;
5978 int level;
5979
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005980 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5981 return 1;
5982 }
5983 if (tmp == NULL || tmp == Py_None) {
5984 Py_CLEAR(tmp);
5985 module = NULL;
5986 }
5987 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005988 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005989 res = obj2ast_identifier(tmp, &module, arena);
5990 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005991 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005992 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005993 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5994 return 1;
5995 }
5996 if (tmp == NULL) {
5997 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
5998 return 1;
5999 }
6000 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006001 int res;
6002 Py_ssize_t len;
6003 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006004 if (!PyList_Check(tmp)) {
6005 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6006 goto failed;
6007 }
6008 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006009 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006010 if (names == NULL) goto failed;
6011 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006012 alias_ty val;
6013 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006014 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006015 if (len != PyList_GET_SIZE(tmp)) {
6016 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
6017 goto failed;
6018 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006019 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006020 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006021 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006022 }
6023 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006024 return 1;
6025 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006026 if (tmp == NULL || tmp == Py_None) {
6027 Py_CLEAR(tmp);
6028 level = 0;
6029 }
6030 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006031 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006032 res = obj2ast_int(tmp, &level, arena);
6033 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006034 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006035 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006036 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
6037 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006038 if (*out == NULL) goto failed;
6039 return 0;
6040 }
6041 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
6042 if (isinstance == -1) {
6043 return 1;
6044 }
6045 if (isinstance) {
6046 asdl_seq* names;
6047
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006048 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6049 return 1;
6050 }
6051 if (tmp == NULL) {
6052 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
6053 return 1;
6054 }
6055 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006056 int res;
6057 Py_ssize_t len;
6058 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006059 if (!PyList_Check(tmp)) {
6060 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6061 goto failed;
6062 }
6063 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006064 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006065 if (names == NULL) goto failed;
6066 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006067 identifier val;
6068 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006069 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006070 if (len != PyList_GET_SIZE(tmp)) {
6071 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
6072 goto failed;
6073 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006074 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006075 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006076 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006077 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006078 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
6079 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006080 if (*out == NULL) goto failed;
6081 return 0;
6082 }
6083 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
6084 if (isinstance == -1) {
6085 return 1;
6086 }
6087 if (isinstance) {
6088 asdl_seq* names;
6089
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006090 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6091 return 1;
6092 }
6093 if (tmp == NULL) {
6094 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
6095 return 1;
6096 }
6097 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006098 int res;
6099 Py_ssize_t len;
6100 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006101 if (!PyList_Check(tmp)) {
6102 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6103 goto failed;
6104 }
6105 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006106 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006107 if (names == NULL) goto failed;
6108 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006109 identifier val;
6110 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006111 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006112 if (len != PyList_GET_SIZE(tmp)) {
6113 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
6114 goto failed;
6115 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006116 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006117 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006118 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006119 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006120 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
6121 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006122 if (*out == NULL) goto failed;
6123 return 0;
6124 }
6125 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
6126 if (isinstance == -1) {
6127 return 1;
6128 }
6129 if (isinstance) {
6130 expr_ty value;
6131
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006132 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6133 return 1;
6134 }
6135 if (tmp == NULL) {
6136 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
6137 return 1;
6138 }
6139 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006140 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006141 res = obj2ast_expr(tmp, &value, arena);
6142 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006143 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006144 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006145 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
6146 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006147 if (*out == NULL) goto failed;
6148 return 0;
6149 }
6150 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
6151 if (isinstance == -1) {
6152 return 1;
6153 }
6154 if (isinstance) {
6155
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006156 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006157 if (*out == NULL) goto failed;
6158 return 0;
6159 }
6160 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
6161 if (isinstance == -1) {
6162 return 1;
6163 }
6164 if (isinstance) {
6165
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006166 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006167 if (*out == NULL) goto failed;
6168 return 0;
6169 }
6170 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
6171 if (isinstance == -1) {
6172 return 1;
6173 }
6174 if (isinstance) {
6175
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006176 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006177 if (*out == NULL) goto failed;
6178 return 0;
6179 }
6180
6181 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
6182 failed:
6183 Py_XDECREF(tmp);
6184 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006185}
6186
6187int
6188obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
6189{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006190 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006191
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006192 PyObject *tmp = NULL;
6193 int lineno;
6194 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006195 int end_lineno;
6196 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006197
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006198 if (obj == Py_None) {
6199 *out = NULL;
6200 return 0;
6201 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006202 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
6203 return 1;
6204 }
6205 if (tmp == NULL) {
6206 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
6207 return 1;
6208 }
6209 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006210 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006211 res = obj2ast_int(tmp, &lineno, arena);
6212 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006213 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006214 }
6215 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006216 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006217 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006218 if (tmp == NULL) {
6219 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
6220 return 1;
6221 }
6222 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006223 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006224 res = obj2ast_int(tmp, &col_offset, arena);
6225 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006226 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006227 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006228 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
6229 return 1;
6230 }
6231 if (tmp == NULL || tmp == Py_None) {
6232 Py_CLEAR(tmp);
6233 end_lineno = 0;
6234 }
6235 else {
6236 int res;
6237 res = obj2ast_int(tmp, &end_lineno, arena);
6238 if (res != 0) goto failed;
6239 Py_CLEAR(tmp);
6240 }
6241 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
6242 return 1;
6243 }
6244 if (tmp == NULL || tmp == Py_None) {
6245 Py_CLEAR(tmp);
6246 end_col_offset = 0;
6247 }
6248 else {
6249 int res;
6250 res = obj2ast_int(tmp, &end_col_offset, arena);
6251 if (res != 0) goto failed;
6252 Py_CLEAR(tmp);
6253 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006254 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
6255 if (isinstance == -1) {
6256 return 1;
6257 }
6258 if (isinstance) {
6259 boolop_ty op;
6260 asdl_seq* values;
6261
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006262 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6263 return 1;
6264 }
6265 if (tmp == NULL) {
6266 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
6267 return 1;
6268 }
6269 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006270 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006271 res = obj2ast_boolop(tmp, &op, arena);
6272 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006273 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006274 }
6275 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006276 return 1;
6277 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006278 if (tmp == NULL) {
6279 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
6280 return 1;
6281 }
6282 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006283 int res;
6284 Py_ssize_t len;
6285 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006286 if (!PyList_Check(tmp)) {
6287 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6288 goto failed;
6289 }
6290 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006291 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006292 if (values == NULL) goto failed;
6293 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006294 expr_ty val;
6295 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006296 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006297 if (len != PyList_GET_SIZE(tmp)) {
6298 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
6299 goto failed;
6300 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006301 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006302 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006303 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006304 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006305 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
6306 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006307 if (*out == NULL) goto failed;
6308 return 0;
6309 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07006310 isinstance = PyObject_IsInstance(obj, (PyObject*)NamedExpr_type);
6311 if (isinstance == -1) {
6312 return 1;
6313 }
6314 if (isinstance) {
6315 expr_ty target;
6316 expr_ty value;
6317
6318 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
6319 return 1;
6320 }
6321 if (tmp == NULL) {
6322 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
6323 return 1;
6324 }
6325 else {
6326 int res;
6327 res = obj2ast_expr(tmp, &target, arena);
6328 if (res != 0) goto failed;
6329 Py_CLEAR(tmp);
6330 }
6331 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6332 return 1;
6333 }
6334 if (tmp == NULL) {
6335 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
6336 return 1;
6337 }
6338 else {
6339 int res;
6340 res = obj2ast_expr(tmp, &value, arena);
6341 if (res != 0) goto failed;
6342 Py_CLEAR(tmp);
6343 }
6344 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
6345 end_col_offset, arena);
6346 if (*out == NULL) goto failed;
6347 return 0;
6348 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006349 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
6350 if (isinstance == -1) {
6351 return 1;
6352 }
6353 if (isinstance) {
6354 expr_ty left;
6355 operator_ty op;
6356 expr_ty right;
6357
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006358 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6359 return 1;
6360 }
6361 if (tmp == NULL) {
6362 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
6363 return 1;
6364 }
6365 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006366 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006367 res = obj2ast_expr(tmp, &left, arena);
6368 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006369 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006370 }
6371 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006372 return 1;
6373 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006374 if (tmp == NULL) {
6375 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
6376 return 1;
6377 }
6378 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006379 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006380 res = obj2ast_operator(tmp, &op, arena);
6381 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006382 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006383 }
6384 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006385 return 1;
6386 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006387 if (tmp == NULL) {
6388 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
6389 return 1;
6390 }
6391 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006392 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006393 res = obj2ast_expr(tmp, &right, arena);
6394 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006395 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006396 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006397 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
6398 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006399 if (*out == NULL) goto failed;
6400 return 0;
6401 }
6402 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
6403 if (isinstance == -1) {
6404 return 1;
6405 }
6406 if (isinstance) {
6407 unaryop_ty op;
6408 expr_ty operand;
6409
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006410 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6411 return 1;
6412 }
6413 if (tmp == NULL) {
6414 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
6415 return 1;
6416 }
6417 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006418 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006419 res = obj2ast_unaryop(tmp, &op, arena);
6420 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006421 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006422 }
6423 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006424 return 1;
6425 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006426 if (tmp == NULL) {
6427 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
6428 return 1;
6429 }
6430 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006431 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006432 res = obj2ast_expr(tmp, &operand, arena);
6433 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006434 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006435 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006436 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
6437 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006438 if (*out == NULL) goto failed;
6439 return 0;
6440 }
6441 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
6442 if (isinstance == -1) {
6443 return 1;
6444 }
6445 if (isinstance) {
6446 arguments_ty args;
6447 expr_ty body;
6448
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006449 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
6450 return 1;
6451 }
6452 if (tmp == NULL) {
6453 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
6454 return 1;
6455 }
6456 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006457 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006458 res = obj2ast_arguments(tmp, &args, arena);
6459 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006460 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006461 }
6462 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006463 return 1;
6464 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006465 if (tmp == NULL) {
6466 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
6467 return 1;
6468 }
6469 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006470 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006471 res = obj2ast_expr(tmp, &body, arena);
6472 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006473 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006474 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006475 *out = Lambda(args, body, lineno, col_offset, end_lineno,
6476 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006477 if (*out == NULL) goto failed;
6478 return 0;
6479 }
6480 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
6481 if (isinstance == -1) {
6482 return 1;
6483 }
6484 if (isinstance) {
6485 expr_ty test;
6486 expr_ty body;
6487 expr_ty orelse;
6488
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006489 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
6490 return 1;
6491 }
6492 if (tmp == NULL) {
6493 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
6494 return 1;
6495 }
6496 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006497 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006498 res = obj2ast_expr(tmp, &test, arena);
6499 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006500 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006501 }
6502 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006503 return 1;
6504 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006505 if (tmp == NULL) {
6506 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
6507 return 1;
6508 }
6509 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006510 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006511 res = obj2ast_expr(tmp, &body, arena);
6512 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006513 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006514 }
6515 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006516 return 1;
6517 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006518 if (tmp == NULL) {
6519 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6520 return 1;
6521 }
6522 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006523 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006524 res = obj2ast_expr(tmp, &orelse, arena);
6525 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006526 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006527 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006528 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
6529 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006530 if (*out == NULL) goto failed;
6531 return 0;
6532 }
6533 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6534 if (isinstance == -1) {
6535 return 1;
6536 }
6537 if (isinstance) {
6538 asdl_seq* keys;
6539 asdl_seq* values;
6540
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006541 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6542 return 1;
6543 }
6544 if (tmp == NULL) {
6545 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6546 return 1;
6547 }
6548 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006549 int res;
6550 Py_ssize_t len;
6551 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006552 if (!PyList_Check(tmp)) {
6553 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6554 goto failed;
6555 }
6556 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006557 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006558 if (keys == NULL) goto failed;
6559 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006560 expr_ty val;
6561 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006562 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006563 if (len != PyList_GET_SIZE(tmp)) {
6564 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6565 goto failed;
6566 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006567 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006568 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006569 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006570 }
6571 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006572 return 1;
6573 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006574 if (tmp == NULL) {
6575 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6576 return 1;
6577 }
6578 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006579 int res;
6580 Py_ssize_t len;
6581 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006582 if (!PyList_Check(tmp)) {
6583 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6584 goto failed;
6585 }
6586 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006587 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006588 if (values == NULL) goto failed;
6589 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006590 expr_ty val;
6591 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006592 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006593 if (len != PyList_GET_SIZE(tmp)) {
6594 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6595 goto failed;
6596 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006597 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006598 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006599 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006600 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006601 *out = Dict(keys, values, lineno, col_offset, end_lineno,
6602 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006603 if (*out == NULL) goto failed;
6604 return 0;
6605 }
6606 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6607 if (isinstance == -1) {
6608 return 1;
6609 }
6610 if (isinstance) {
6611 asdl_seq* elts;
6612
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006613 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6614 return 1;
6615 }
6616 if (tmp == NULL) {
6617 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6618 return 1;
6619 }
6620 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006621 int res;
6622 Py_ssize_t len;
6623 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006624 if (!PyList_Check(tmp)) {
6625 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6626 goto failed;
6627 }
6628 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006629 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006630 if (elts == NULL) goto failed;
6631 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006632 expr_ty val;
6633 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006634 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006635 if (len != PyList_GET_SIZE(tmp)) {
6636 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6637 goto failed;
6638 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006639 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006640 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006641 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006642 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006643 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006644 if (*out == NULL) goto failed;
6645 return 0;
6646 }
6647 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6648 if (isinstance == -1) {
6649 return 1;
6650 }
6651 if (isinstance) {
6652 expr_ty elt;
6653 asdl_seq* generators;
6654
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006655 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6656 return 1;
6657 }
6658 if (tmp == NULL) {
6659 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6660 return 1;
6661 }
6662 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006663 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006664 res = obj2ast_expr(tmp, &elt, arena);
6665 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006666 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006667 }
6668 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006669 return 1;
6670 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006671 if (tmp == NULL) {
6672 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6673 return 1;
6674 }
6675 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006676 int res;
6677 Py_ssize_t len;
6678 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006679 if (!PyList_Check(tmp)) {
6680 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6681 goto failed;
6682 }
6683 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006684 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006685 if (generators == NULL) goto failed;
6686 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006687 comprehension_ty val;
6688 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006689 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006690 if (len != PyList_GET_SIZE(tmp)) {
6691 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6692 goto failed;
6693 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006694 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006695 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006696 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006697 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006698 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
6699 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006700 if (*out == NULL) goto failed;
6701 return 0;
6702 }
6703 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6704 if (isinstance == -1) {
6705 return 1;
6706 }
6707 if (isinstance) {
6708 expr_ty elt;
6709 asdl_seq* generators;
6710
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006711 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6712 return 1;
6713 }
6714 if (tmp == NULL) {
6715 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6716 return 1;
6717 }
6718 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006719 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006720 res = obj2ast_expr(tmp, &elt, arena);
6721 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006722 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006723 }
6724 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006725 return 1;
6726 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006727 if (tmp == NULL) {
6728 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6729 return 1;
6730 }
6731 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006732 int res;
6733 Py_ssize_t len;
6734 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006735 if (!PyList_Check(tmp)) {
6736 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6737 goto failed;
6738 }
6739 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006740 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006741 if (generators == NULL) goto failed;
6742 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006743 comprehension_ty val;
6744 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006745 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006746 if (len != PyList_GET_SIZE(tmp)) {
6747 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6748 goto failed;
6749 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006750 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006751 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006752 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006753 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006754 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
6755 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006756 if (*out == NULL) goto failed;
6757 return 0;
6758 }
6759 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6760 if (isinstance == -1) {
6761 return 1;
6762 }
6763 if (isinstance) {
6764 expr_ty key;
6765 expr_ty value;
6766 asdl_seq* generators;
6767
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006768 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6769 return 1;
6770 }
6771 if (tmp == NULL) {
6772 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6773 return 1;
6774 }
6775 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006776 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006777 res = obj2ast_expr(tmp, &key, arena);
6778 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006779 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006780 }
6781 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006782 return 1;
6783 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006784 if (tmp == NULL) {
6785 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6786 return 1;
6787 }
6788 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006789 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006790 res = obj2ast_expr(tmp, &value, arena);
6791 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006792 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006793 }
6794 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006795 return 1;
6796 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006797 if (tmp == NULL) {
6798 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6799 return 1;
6800 }
6801 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006802 int res;
6803 Py_ssize_t len;
6804 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006805 if (!PyList_Check(tmp)) {
6806 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6807 goto failed;
6808 }
6809 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006810 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006811 if (generators == NULL) goto failed;
6812 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006813 comprehension_ty val;
6814 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006815 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006816 if (len != PyList_GET_SIZE(tmp)) {
6817 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6818 goto failed;
6819 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006820 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006821 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006822 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006823 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006824 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
6825 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006826 if (*out == NULL) goto failed;
6827 return 0;
6828 }
6829 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6830 if (isinstance == -1) {
6831 return 1;
6832 }
6833 if (isinstance) {
6834 expr_ty elt;
6835 asdl_seq* generators;
6836
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006837 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6838 return 1;
6839 }
6840 if (tmp == NULL) {
6841 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6842 return 1;
6843 }
6844 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006845 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006846 res = obj2ast_expr(tmp, &elt, arena);
6847 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006848 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006849 }
6850 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006851 return 1;
6852 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006853 if (tmp == NULL) {
6854 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6855 return 1;
6856 }
6857 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006858 int res;
6859 Py_ssize_t len;
6860 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006861 if (!PyList_Check(tmp)) {
6862 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6863 goto failed;
6864 }
6865 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006866 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006867 if (generators == NULL) goto failed;
6868 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006869 comprehension_ty val;
6870 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006871 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006872 if (len != PyList_GET_SIZE(tmp)) {
6873 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6874 goto failed;
6875 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006876 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006877 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006878 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006879 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006880 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
6881 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006882 if (*out == NULL) goto failed;
6883 return 0;
6884 }
Yury Selivanov75445082015-05-11 22:57:16 -04006885 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6886 if (isinstance == -1) {
6887 return 1;
6888 }
6889 if (isinstance) {
6890 expr_ty value;
6891
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006892 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6893 return 1;
6894 }
6895 if (tmp == NULL) {
6896 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6897 return 1;
6898 }
6899 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006900 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006901 res = obj2ast_expr(tmp, &value, arena);
6902 if (res != 0) goto failed;
6903 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006904 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006905 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
6906 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006907 if (*out == NULL) goto failed;
6908 return 0;
6909 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006910 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6911 if (isinstance == -1) {
6912 return 1;
6913 }
6914 if (isinstance) {
6915 expr_ty value;
6916
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006917 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6918 return 1;
6919 }
6920 if (tmp == NULL || tmp == Py_None) {
6921 Py_CLEAR(tmp);
6922 value = NULL;
6923 }
6924 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006925 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006926 res = obj2ast_expr(tmp, &value, arena);
6927 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006928 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006929 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006930 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
6931 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006932 if (*out == NULL) goto failed;
6933 return 0;
6934 }
6935 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6936 if (isinstance == -1) {
6937 return 1;
6938 }
6939 if (isinstance) {
6940 expr_ty value;
6941
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006942 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6943 return 1;
6944 }
6945 if (tmp == NULL) {
6946 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6947 return 1;
6948 }
6949 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006950 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006951 res = obj2ast_expr(tmp, &value, arena);
6952 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006953 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006954 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006955 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
6956 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006957 if (*out == NULL) goto failed;
6958 return 0;
6959 }
6960 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6961 if (isinstance == -1) {
6962 return 1;
6963 }
6964 if (isinstance) {
6965 expr_ty left;
6966 asdl_int_seq* ops;
6967 asdl_seq* comparators;
6968
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006969 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6970 return 1;
6971 }
6972 if (tmp == NULL) {
6973 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6974 return 1;
6975 }
6976 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006977 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006978 res = obj2ast_expr(tmp, &left, arena);
6979 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006980 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006981 }
6982 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006983 return 1;
6984 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006985 if (tmp == NULL) {
6986 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6987 return 1;
6988 }
6989 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006990 int res;
6991 Py_ssize_t len;
6992 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006993 if (!PyList_Check(tmp)) {
6994 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6995 goto failed;
6996 }
6997 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006998 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006999 if (ops == NULL) goto failed;
7000 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007001 cmpop_ty val;
7002 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007003 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007004 if (len != PyList_GET_SIZE(tmp)) {
7005 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
7006 goto failed;
7007 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007008 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007009 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007010 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007011 }
7012 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007013 return 1;
7014 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007015 if (tmp == NULL) {
7016 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
7017 return 1;
7018 }
7019 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007020 int res;
7021 Py_ssize_t len;
7022 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007023 if (!PyList_Check(tmp)) {
7024 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7025 goto failed;
7026 }
7027 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007028 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007029 if (comparators == NULL) goto failed;
7030 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007031 expr_ty val;
7032 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007033 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007034 if (len != PyList_GET_SIZE(tmp)) {
7035 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
7036 goto failed;
7037 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007038 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007039 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007040 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007041 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007042 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
7043 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007044 if (*out == NULL) goto failed;
7045 return 0;
7046 }
7047 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
7048 if (isinstance == -1) {
7049 return 1;
7050 }
7051 if (isinstance) {
7052 expr_ty func;
7053 asdl_seq* args;
7054 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007055
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007056 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
7057 return 1;
7058 }
7059 if (tmp == NULL) {
7060 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
7061 return 1;
7062 }
7063 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007064 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007065 res = obj2ast_expr(tmp, &func, arena);
7066 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007067 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007068 }
7069 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007070 return 1;
7071 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007072 if (tmp == NULL) {
7073 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
7074 return 1;
7075 }
7076 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007077 int res;
7078 Py_ssize_t len;
7079 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007080 if (!PyList_Check(tmp)) {
7081 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7082 goto failed;
7083 }
7084 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007085 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007086 if (args == NULL) goto failed;
7087 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007088 expr_ty val;
7089 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007090 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007091 if (len != PyList_GET_SIZE(tmp)) {
7092 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
7093 goto failed;
7094 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007095 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007096 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007097 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007098 }
7099 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007100 return 1;
7101 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007102 if (tmp == NULL) {
7103 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
7104 return 1;
7105 }
7106 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007107 int res;
7108 Py_ssize_t len;
7109 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007110 if (!PyList_Check(tmp)) {
7111 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7112 goto failed;
7113 }
7114 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007115 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007116 if (keywords == NULL) goto failed;
7117 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007118 keyword_ty val;
7119 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007120 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007121 if (len != PyList_GET_SIZE(tmp)) {
7122 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
7123 goto failed;
7124 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007125 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007126 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007127 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007128 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007129 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
7130 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007131 if (*out == NULL) goto failed;
7132 return 0;
7133 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04007134 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
7135 if (isinstance == -1) {
7136 return 1;
7137 }
7138 if (isinstance) {
7139 expr_ty value;
7140 int conversion;
7141 expr_ty format_spec;
7142
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007143 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7144 return 1;
7145 }
7146 if (tmp == NULL) {
7147 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
7148 return 1;
7149 }
7150 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007151 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007152 res = obj2ast_expr(tmp, &value, arena);
7153 if (res != 0) goto failed;
7154 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007155 }
7156 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007157 return 1;
7158 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007159 if (tmp == NULL || tmp == Py_None) {
7160 Py_CLEAR(tmp);
7161 conversion = 0;
7162 }
7163 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007164 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007165 res = obj2ast_int(tmp, &conversion, arena);
7166 if (res != 0) goto failed;
7167 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007168 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007169 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
7170 return 1;
7171 }
7172 if (tmp == NULL || tmp == Py_None) {
7173 Py_CLEAR(tmp);
7174 format_spec = NULL;
7175 }
7176 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007177 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007178 res = obj2ast_expr(tmp, &format_spec, arena);
7179 if (res != 0) goto failed;
7180 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007181 }
7182 *out = FormattedValue(value, conversion, format_spec, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007183 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007184 if (*out == NULL) goto failed;
7185 return 0;
7186 }
7187 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
7188 if (isinstance == -1) {
7189 return 1;
7190 }
7191 if (isinstance) {
7192 asdl_seq* values;
7193
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007194 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
7195 return 1;
7196 }
7197 if (tmp == NULL) {
7198 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
7199 return 1;
7200 }
7201 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007202 int res;
7203 Py_ssize_t len;
7204 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007205 if (!PyList_Check(tmp)) {
7206 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7207 goto failed;
7208 }
7209 len = PyList_GET_SIZE(tmp);
7210 values = _Py_asdl_seq_new(len, arena);
7211 if (values == NULL) goto failed;
7212 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007213 expr_ty val;
7214 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007215 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03007216 if (len != PyList_GET_SIZE(tmp)) {
7217 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
7218 goto failed;
7219 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007220 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007221 }
7222 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007223 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007224 *out = JoinedStr(values, lineno, col_offset, end_lineno,
7225 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007226 if (*out == NULL) goto failed;
7227 return 0;
7228 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007229 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
7230 if (isinstance == -1) {
7231 return 1;
7232 }
7233 if (isinstance) {
7234 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007235 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007236
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007237 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7238 return 1;
7239 }
7240 if (tmp == NULL) {
7241 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
7242 return 1;
7243 }
7244 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007245 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007246 res = obj2ast_constant(tmp, &value, arena);
7247 if (res != 0) goto failed;
7248 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007249 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007250 if (_PyObject_LookupAttrId(obj, &PyId_kind, &tmp) < 0) {
7251 return 1;
7252 }
7253 if (tmp == NULL || tmp == Py_None) {
7254 Py_CLEAR(tmp);
7255 kind = NULL;
7256 }
7257 else {
7258 int res;
7259 res = obj2ast_string(tmp, &kind, arena);
7260 if (res != 0) goto failed;
7261 Py_CLEAR(tmp);
7262 }
7263 *out = Constant(value, kind, lineno, col_offset, end_lineno,
7264 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007265 if (*out == NULL) goto failed;
7266 return 0;
7267 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007268 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
7269 if (isinstance == -1) {
7270 return 1;
7271 }
7272 if (isinstance) {
7273 expr_ty value;
7274 identifier attr;
7275 expr_context_ty ctx;
7276
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007277 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7278 return 1;
7279 }
7280 if (tmp == NULL) {
7281 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
7282 return 1;
7283 }
7284 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007285 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007286 res = obj2ast_expr(tmp, &value, arena);
7287 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007288 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007289 }
7290 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007291 return 1;
7292 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007293 if (tmp == NULL) {
7294 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
7295 return 1;
7296 }
7297 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007298 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007299 res = obj2ast_identifier(tmp, &attr, arena);
7300 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007301 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007302 }
7303 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007304 return 1;
7305 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007306 if (tmp == NULL) {
7307 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
7308 return 1;
7309 }
7310 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007311 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007312 res = obj2ast_expr_context(tmp, &ctx, arena);
7313 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007314 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007315 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007316 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
7317 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007318 if (*out == NULL) goto failed;
7319 return 0;
7320 }
7321 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
7322 if (isinstance == -1) {
7323 return 1;
7324 }
7325 if (isinstance) {
7326 expr_ty value;
7327 slice_ty slice;
7328 expr_context_ty ctx;
7329
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007330 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7331 return 1;
7332 }
7333 if (tmp == NULL) {
7334 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
7335 return 1;
7336 }
7337 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007338 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007339 res = obj2ast_expr(tmp, &value, arena);
7340 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007341 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007342 }
7343 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007344 return 1;
7345 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007346 if (tmp == NULL) {
7347 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
7348 return 1;
7349 }
7350 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007351 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007352 res = obj2ast_slice(tmp, &slice, arena);
7353 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007354 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007355 }
7356 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007357 return 1;
7358 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007359 if (tmp == NULL) {
7360 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
7361 return 1;
7362 }
7363 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007364 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007365 res = obj2ast_expr_context(tmp, &ctx, arena);
7366 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007367 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007368 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007369 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
7370 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007371 if (*out == NULL) goto failed;
7372 return 0;
7373 }
7374 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
7375 if (isinstance == -1) {
7376 return 1;
7377 }
7378 if (isinstance) {
7379 expr_ty value;
7380 expr_context_ty ctx;
7381
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007382 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7383 return 1;
7384 }
7385 if (tmp == NULL) {
7386 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
7387 return 1;
7388 }
7389 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007390 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007391 res = obj2ast_expr(tmp, &value, arena);
7392 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007393 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007394 }
7395 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007396 return 1;
7397 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007398 if (tmp == NULL) {
7399 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
7400 return 1;
7401 }
7402 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007403 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007404 res = obj2ast_expr_context(tmp, &ctx, arena);
7405 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007406 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007407 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007408 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
7409 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007410 if (*out == NULL) goto failed;
7411 return 0;
7412 }
7413 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
7414 if (isinstance == -1) {
7415 return 1;
7416 }
7417 if (isinstance) {
7418 identifier id;
7419 expr_context_ty ctx;
7420
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007421 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
7422 return 1;
7423 }
7424 if (tmp == NULL) {
7425 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
7426 return 1;
7427 }
7428 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007429 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007430 res = obj2ast_identifier(tmp, &id, arena);
7431 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007432 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007433 }
7434 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007435 return 1;
7436 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007437 if (tmp == NULL) {
7438 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
7439 return 1;
7440 }
7441 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007442 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007443 res = obj2ast_expr_context(tmp, &ctx, arena);
7444 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007445 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007446 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007447 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
7448 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007449 if (*out == NULL) goto failed;
7450 return 0;
7451 }
7452 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7453 if (isinstance == -1) {
7454 return 1;
7455 }
7456 if (isinstance) {
7457 asdl_seq* elts;
7458 expr_context_ty ctx;
7459
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007460 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7461 return 1;
7462 }
7463 if (tmp == NULL) {
7464 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7465 return 1;
7466 }
7467 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007468 int res;
7469 Py_ssize_t len;
7470 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007471 if (!PyList_Check(tmp)) {
7472 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7473 goto failed;
7474 }
7475 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007476 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007477 if (elts == NULL) goto failed;
7478 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007479 expr_ty val;
7480 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007481 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007482 if (len != PyList_GET_SIZE(tmp)) {
7483 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7484 goto failed;
7485 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007486 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007487 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007488 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007489 }
7490 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007491 return 1;
7492 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007493 if (tmp == NULL) {
7494 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7495 return 1;
7496 }
7497 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007498 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007499 res = obj2ast_expr_context(tmp, &ctx, arena);
7500 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007501 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007502 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007503 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7504 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007505 if (*out == NULL) goto failed;
7506 return 0;
7507 }
7508 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7509 if (isinstance == -1) {
7510 return 1;
7511 }
7512 if (isinstance) {
7513 asdl_seq* elts;
7514 expr_context_ty ctx;
7515
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007516 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7517 return 1;
7518 }
7519 if (tmp == NULL) {
7520 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7521 return 1;
7522 }
7523 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007524 int res;
7525 Py_ssize_t len;
7526 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007527 if (!PyList_Check(tmp)) {
7528 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7529 goto failed;
7530 }
7531 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007532 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007533 if (elts == NULL) goto failed;
7534 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007535 expr_ty val;
7536 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007537 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007538 if (len != PyList_GET_SIZE(tmp)) {
7539 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7540 goto failed;
7541 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007542 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007543 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007544 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007545 }
7546 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007547 return 1;
7548 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007549 if (tmp == NULL) {
7550 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7551 return 1;
7552 }
7553 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007554 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007555 res = obj2ast_expr_context(tmp, &ctx, arena);
7556 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007557 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007558 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007559 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7560 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007561 if (*out == NULL) goto failed;
7562 return 0;
7563 }
7564
7565 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7566 failed:
7567 Py_XDECREF(tmp);
7568 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007569}
7570
7571int
7572obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7573{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007574 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007575
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007576 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7577 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007578 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007579 }
7580 if (isinstance) {
7581 *out = Load;
7582 return 0;
7583 }
7584 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7585 if (isinstance == -1) {
7586 return 1;
7587 }
7588 if (isinstance) {
7589 *out = Store;
7590 return 0;
7591 }
7592 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7593 if (isinstance == -1) {
7594 return 1;
7595 }
7596 if (isinstance) {
7597 *out = Del;
7598 return 0;
7599 }
7600 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7601 if (isinstance == -1) {
7602 return 1;
7603 }
7604 if (isinstance) {
7605 *out = AugLoad;
7606 return 0;
7607 }
7608 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7609 if (isinstance == -1) {
7610 return 1;
7611 }
7612 if (isinstance) {
7613 *out = AugStore;
7614 return 0;
7615 }
7616 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7617 if (isinstance == -1) {
7618 return 1;
7619 }
7620 if (isinstance) {
7621 *out = Param;
7622 return 0;
7623 }
7624
7625 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7626 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007627}
7628
7629int
7630obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7631{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007632 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007633
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007634 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007635
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007636 if (obj == Py_None) {
7637 *out = NULL;
7638 return 0;
7639 }
7640 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7641 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007642 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007643 }
7644 if (isinstance) {
7645 expr_ty lower;
7646 expr_ty upper;
7647 expr_ty step;
7648
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007649 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7650 return 1;
7651 }
7652 if (tmp == NULL || tmp == Py_None) {
7653 Py_CLEAR(tmp);
7654 lower = NULL;
7655 }
7656 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007657 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007658 res = obj2ast_expr(tmp, &lower, arena);
7659 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007660 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007661 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007662 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7663 return 1;
7664 }
7665 if (tmp == NULL || tmp == Py_None) {
7666 Py_CLEAR(tmp);
7667 upper = NULL;
7668 }
7669 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007670 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007671 res = obj2ast_expr(tmp, &upper, arena);
7672 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007673 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007674 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007675 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
7676 return 1;
7677 }
7678 if (tmp == NULL || tmp == Py_None) {
7679 Py_CLEAR(tmp);
7680 step = NULL;
7681 }
7682 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007683 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007684 res = obj2ast_expr(tmp, &step, arena);
7685 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007686 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007687 }
7688 *out = Slice(lower, upper, step, arena);
7689 if (*out == NULL) goto failed;
7690 return 0;
7691 }
7692 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7693 if (isinstance == -1) {
7694 return 1;
7695 }
7696 if (isinstance) {
7697 asdl_seq* dims;
7698
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007699 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7700 return 1;
7701 }
7702 if (tmp == NULL) {
7703 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7704 return 1;
7705 }
7706 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007707 int res;
7708 Py_ssize_t len;
7709 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007710 if (!PyList_Check(tmp)) {
7711 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7712 goto failed;
7713 }
7714 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007715 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007716 if (dims == NULL) goto failed;
7717 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007718 slice_ty val;
7719 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007720 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007721 if (len != PyList_GET_SIZE(tmp)) {
7722 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7723 goto failed;
7724 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007725 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007726 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007727 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007728 }
7729 *out = ExtSlice(dims, arena);
7730 if (*out == NULL) goto failed;
7731 return 0;
7732 }
7733 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7734 if (isinstance == -1) {
7735 return 1;
7736 }
7737 if (isinstance) {
7738 expr_ty value;
7739
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007740 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7741 return 1;
7742 }
7743 if (tmp == NULL) {
7744 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7745 return 1;
7746 }
7747 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007748 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007749 res = obj2ast_expr(tmp, &value, arena);
7750 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007751 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007752 }
7753 *out = Index(value, arena);
7754 if (*out == NULL) goto failed;
7755 return 0;
7756 }
7757
7758 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7759 failed:
7760 Py_XDECREF(tmp);
7761 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007762}
7763
7764int
7765obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7766{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007767 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007768
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007769 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7770 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007771 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007772 }
7773 if (isinstance) {
7774 *out = And;
7775 return 0;
7776 }
7777 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7778 if (isinstance == -1) {
7779 return 1;
7780 }
7781 if (isinstance) {
7782 *out = Or;
7783 return 0;
7784 }
7785
7786 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7787 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007788}
7789
7790int
7791obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7792{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007793 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007794
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007795 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7796 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007797 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007798 }
7799 if (isinstance) {
7800 *out = Add;
7801 return 0;
7802 }
7803 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7804 if (isinstance == -1) {
7805 return 1;
7806 }
7807 if (isinstance) {
7808 *out = Sub;
7809 return 0;
7810 }
7811 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7812 if (isinstance == -1) {
7813 return 1;
7814 }
7815 if (isinstance) {
7816 *out = Mult;
7817 return 0;
7818 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007819 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7820 if (isinstance == -1) {
7821 return 1;
7822 }
7823 if (isinstance) {
7824 *out = MatMult;
7825 return 0;
7826 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007827 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7828 if (isinstance == -1) {
7829 return 1;
7830 }
7831 if (isinstance) {
7832 *out = Div;
7833 return 0;
7834 }
7835 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7836 if (isinstance == -1) {
7837 return 1;
7838 }
7839 if (isinstance) {
7840 *out = Mod;
7841 return 0;
7842 }
7843 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7844 if (isinstance == -1) {
7845 return 1;
7846 }
7847 if (isinstance) {
7848 *out = Pow;
7849 return 0;
7850 }
7851 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7852 if (isinstance == -1) {
7853 return 1;
7854 }
7855 if (isinstance) {
7856 *out = LShift;
7857 return 0;
7858 }
7859 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7860 if (isinstance == -1) {
7861 return 1;
7862 }
7863 if (isinstance) {
7864 *out = RShift;
7865 return 0;
7866 }
7867 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7868 if (isinstance == -1) {
7869 return 1;
7870 }
7871 if (isinstance) {
7872 *out = BitOr;
7873 return 0;
7874 }
7875 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7876 if (isinstance == -1) {
7877 return 1;
7878 }
7879 if (isinstance) {
7880 *out = BitXor;
7881 return 0;
7882 }
7883 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7884 if (isinstance == -1) {
7885 return 1;
7886 }
7887 if (isinstance) {
7888 *out = BitAnd;
7889 return 0;
7890 }
7891 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7892 if (isinstance == -1) {
7893 return 1;
7894 }
7895 if (isinstance) {
7896 *out = FloorDiv;
7897 return 0;
7898 }
7899
7900 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7901 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007902}
7903
7904int
7905obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7906{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007907 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007908
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007909 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7910 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007911 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007912 }
7913 if (isinstance) {
7914 *out = Invert;
7915 return 0;
7916 }
7917 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7918 if (isinstance == -1) {
7919 return 1;
7920 }
7921 if (isinstance) {
7922 *out = Not;
7923 return 0;
7924 }
7925 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7926 if (isinstance == -1) {
7927 return 1;
7928 }
7929 if (isinstance) {
7930 *out = UAdd;
7931 return 0;
7932 }
7933 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7934 if (isinstance == -1) {
7935 return 1;
7936 }
7937 if (isinstance) {
7938 *out = USub;
7939 return 0;
7940 }
7941
7942 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7943 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007944}
7945
7946int
7947obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7948{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007949 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007950
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007951 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7952 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007953 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007954 }
7955 if (isinstance) {
7956 *out = Eq;
7957 return 0;
7958 }
7959 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7960 if (isinstance == -1) {
7961 return 1;
7962 }
7963 if (isinstance) {
7964 *out = NotEq;
7965 return 0;
7966 }
7967 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7968 if (isinstance == -1) {
7969 return 1;
7970 }
7971 if (isinstance) {
7972 *out = Lt;
7973 return 0;
7974 }
7975 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7976 if (isinstance == -1) {
7977 return 1;
7978 }
7979 if (isinstance) {
7980 *out = LtE;
7981 return 0;
7982 }
7983 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7984 if (isinstance == -1) {
7985 return 1;
7986 }
7987 if (isinstance) {
7988 *out = Gt;
7989 return 0;
7990 }
7991 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
7992 if (isinstance == -1) {
7993 return 1;
7994 }
7995 if (isinstance) {
7996 *out = GtE;
7997 return 0;
7998 }
7999 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
8000 if (isinstance == -1) {
8001 return 1;
8002 }
8003 if (isinstance) {
8004 *out = Is;
8005 return 0;
8006 }
8007 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
8008 if (isinstance == -1) {
8009 return 1;
8010 }
8011 if (isinstance) {
8012 *out = IsNot;
8013 return 0;
8014 }
8015 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
8016 if (isinstance == -1) {
8017 return 1;
8018 }
8019 if (isinstance) {
8020 *out = In;
8021 return 0;
8022 }
8023 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
8024 if (isinstance == -1) {
8025 return 1;
8026 }
8027 if (isinstance) {
8028 *out = NotIn;
8029 return 0;
8030 }
8031
8032 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
8033 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008034}
8035
8036int
8037obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
8038{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008039 PyObject* tmp = NULL;
8040 expr_ty target;
8041 expr_ty iter;
8042 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008043 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008044
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008045 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
8046 return 1;
8047 }
8048 if (tmp == NULL) {
8049 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
8050 return 1;
8051 }
8052 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008053 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008054 res = obj2ast_expr(tmp, &target, arena);
8055 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008056 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008057 }
8058 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008059 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008060 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008061 if (tmp == NULL) {
8062 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
8063 return 1;
8064 }
8065 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008066 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008067 res = obj2ast_expr(tmp, &iter, arena);
8068 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008069 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008070 }
8071 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008072 return 1;
8073 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008074 if (tmp == NULL) {
8075 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
8076 return 1;
8077 }
8078 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008079 int res;
8080 Py_ssize_t len;
8081 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008082 if (!PyList_Check(tmp)) {
8083 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8084 goto failed;
8085 }
8086 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008087 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008088 if (ifs == NULL) goto failed;
8089 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008090 expr_ty val;
8091 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008092 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008093 if (len != PyList_GET_SIZE(tmp)) {
8094 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
8095 goto failed;
8096 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008097 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008098 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008099 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008100 }
8101 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008102 return 1;
8103 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008104 if (tmp == NULL) {
8105 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
8106 return 1;
8107 }
8108 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008109 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008110 res = obj2ast_int(tmp, &is_async, arena);
8111 if (res != 0) goto failed;
8112 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008113 }
8114 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008115 return 0;
8116failed:
8117 Py_XDECREF(tmp);
8118 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008119}
8120
8121int
8122obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
8123{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008124 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00008125
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008126 PyObject *tmp = NULL;
8127 int lineno;
8128 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008129 int end_lineno;
8130 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008131
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008132 if (obj == Py_None) {
8133 *out = NULL;
8134 return 0;
8135 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008136 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8137 return 1;
8138 }
8139 if (tmp == NULL) {
8140 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
8141 return 1;
8142 }
8143 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008144 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008145 res = obj2ast_int(tmp, &lineno, arena);
8146 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008147 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008148 }
8149 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008150 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008151 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008152 if (tmp == NULL) {
8153 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
8154 return 1;
8155 }
8156 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008157 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008158 res = obj2ast_int(tmp, &col_offset, arena);
8159 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008160 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008161 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008162 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8163 return 1;
8164 }
8165 if (tmp == NULL || tmp == Py_None) {
8166 Py_CLEAR(tmp);
8167 end_lineno = 0;
8168 }
8169 else {
8170 int res;
8171 res = obj2ast_int(tmp, &end_lineno, arena);
8172 if (res != 0) goto failed;
8173 Py_CLEAR(tmp);
8174 }
8175 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8176 return 1;
8177 }
8178 if (tmp == NULL || tmp == Py_None) {
8179 Py_CLEAR(tmp);
8180 end_col_offset = 0;
8181 }
8182 else {
8183 int res;
8184 res = obj2ast_int(tmp, &end_col_offset, arena);
8185 if (res != 0) goto failed;
8186 Py_CLEAR(tmp);
8187 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008188 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
8189 if (isinstance == -1) {
8190 return 1;
8191 }
8192 if (isinstance) {
8193 expr_ty type;
8194 identifier name;
8195 asdl_seq* body;
8196
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008197 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
8198 return 1;
8199 }
8200 if (tmp == NULL || tmp == Py_None) {
8201 Py_CLEAR(tmp);
8202 type = NULL;
8203 }
8204 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008205 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008206 res = obj2ast_expr(tmp, &type, arena);
8207 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008208 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008209 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008210 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8211 return 1;
8212 }
8213 if (tmp == NULL || tmp == Py_None) {
8214 Py_CLEAR(tmp);
8215 name = NULL;
8216 }
8217 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008218 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008219 res = obj2ast_identifier(tmp, &name, arena);
8220 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008221 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008222 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008223 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
8224 return 1;
8225 }
8226 if (tmp == NULL) {
8227 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
8228 return 1;
8229 }
8230 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008231 int res;
8232 Py_ssize_t len;
8233 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008234 if (!PyList_Check(tmp)) {
8235 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8236 goto failed;
8237 }
8238 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008239 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008240 if (body == NULL) goto failed;
8241 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008242 stmt_ty val;
8243 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008244 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008245 if (len != PyList_GET_SIZE(tmp)) {
8246 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
8247 goto failed;
8248 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008249 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008250 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008251 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008252 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008253 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
8254 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008255 if (*out == NULL) goto failed;
8256 return 0;
8257 }
8258
8259 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
8260 failed:
8261 Py_XDECREF(tmp);
8262 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008263}
8264
8265int
8266obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
8267{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008268 PyObject* tmp = NULL;
8269 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008270 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008271 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008272 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008273 arg_ty kwarg;
8274 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008275
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008276 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
8277 return 1;
8278 }
8279 if (tmp == NULL) {
8280 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
8281 return 1;
8282 }
8283 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008284 int res;
8285 Py_ssize_t len;
8286 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008287 if (!PyList_Check(tmp)) {
8288 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8289 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008290 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008291 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008292 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008293 if (args == NULL) goto failed;
8294 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008295 arg_ty val;
8296 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008297 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008298 if (len != PyList_GET_SIZE(tmp)) {
8299 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
8300 goto failed;
8301 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008302 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008303 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008304 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008305 }
8306 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008307 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008308 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008309 if (tmp == NULL || tmp == Py_None) {
8310 Py_CLEAR(tmp);
8311 vararg = NULL;
8312 }
8313 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008314 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008315 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008316 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008317 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008318 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008319 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
8320 return 1;
8321 }
8322 if (tmp == NULL) {
8323 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
8324 return 1;
8325 }
8326 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008327 int res;
8328 Py_ssize_t len;
8329 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008330 if (!PyList_Check(tmp)) {
8331 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8332 goto failed;
8333 }
8334 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008335 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008336 if (kwonlyargs == NULL) goto failed;
8337 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008338 arg_ty val;
8339 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008340 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008341 if (len != PyList_GET_SIZE(tmp)) {
8342 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
8343 goto failed;
8344 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008345 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008346 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008347 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008348 }
8349 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008350 return 1;
8351 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008352 if (tmp == NULL) {
8353 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
8354 return 1;
8355 }
8356 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008357 int res;
8358 Py_ssize_t len;
8359 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008360 if (!PyList_Check(tmp)) {
8361 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8362 goto failed;
8363 }
8364 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008365 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008366 if (kw_defaults == NULL) goto failed;
8367 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008368 expr_ty val;
8369 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008370 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008371 if (len != PyList_GET_SIZE(tmp)) {
8372 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
8373 goto failed;
8374 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008375 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008376 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008377 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008378 }
8379 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008380 return 1;
8381 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008382 if (tmp == NULL || tmp == Py_None) {
8383 Py_CLEAR(tmp);
8384 kwarg = NULL;
8385 }
8386 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008387 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008388 res = obj2ast_arg(tmp, &kwarg, arena);
8389 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02008390 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008391 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008392 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
8393 return 1;
8394 }
8395 if (tmp == NULL) {
8396 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
8397 return 1;
8398 }
8399 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008400 int res;
8401 Py_ssize_t len;
8402 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008403 if (!PyList_Check(tmp)) {
8404 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8405 goto failed;
8406 }
8407 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008408 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008409 if (defaults == NULL) goto failed;
8410 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008411 expr_ty val;
8412 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008413 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008414 if (len != PyList_GET_SIZE(tmp)) {
8415 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
8416 goto failed;
8417 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008418 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008419 }
Victor Stinnerb3189902013-07-27 00:04:42 +02008420 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008421 }
8422 *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults,
8423 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008424 return 0;
8425failed:
8426 Py_XDECREF(tmp);
8427 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008428}
8429
8430int
8431obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
8432{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008433 PyObject* tmp = NULL;
8434 identifier arg;
8435 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008436 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01008437 int lineno;
8438 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008439 int end_lineno;
8440 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008441
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008442 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8443 return 1;
8444 }
8445 if (tmp == NULL) {
8446 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
8447 return 1;
8448 }
8449 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008450 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008451 res = obj2ast_identifier(tmp, &arg, arena);
8452 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008453 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008454 }
8455 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008456 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008457 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008458 if (tmp == NULL || tmp == Py_None) {
8459 Py_CLEAR(tmp);
8460 annotation = NULL;
8461 }
8462 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008463 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008464 res = obj2ast_expr(tmp, &annotation, arena);
8465 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008466 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008467 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008468 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
8469 return 1;
8470 }
8471 if (tmp == NULL || tmp == Py_None) {
8472 Py_CLEAR(tmp);
8473 type_comment = NULL;
8474 }
8475 else {
8476 int res;
8477 res = obj2ast_string(tmp, &type_comment, arena);
8478 if (res != 0) goto failed;
8479 Py_CLEAR(tmp);
8480 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008481 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8482 return 1;
8483 }
8484 if (tmp == NULL) {
8485 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
8486 return 1;
8487 }
8488 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008489 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008490 res = obj2ast_int(tmp, &lineno, arena);
8491 if (res != 0) goto failed;
8492 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008493 }
8494 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008495 return 1;
8496 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008497 if (tmp == NULL) {
8498 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
8499 return 1;
8500 }
8501 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008502 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008503 res = obj2ast_int(tmp, &col_offset, arena);
8504 if (res != 0) goto failed;
8505 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008506 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008507 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8508 return 1;
8509 }
8510 if (tmp == NULL || tmp == Py_None) {
8511 Py_CLEAR(tmp);
8512 end_lineno = 0;
8513 }
8514 else {
8515 int res;
8516 res = obj2ast_int(tmp, &end_lineno, arena);
8517 if (res != 0) goto failed;
8518 Py_CLEAR(tmp);
8519 }
8520 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8521 return 1;
8522 }
8523 if (tmp == NULL || tmp == Py_None) {
8524 Py_CLEAR(tmp);
8525 end_col_offset = 0;
8526 }
8527 else {
8528 int res;
8529 res = obj2ast_int(tmp, &end_col_offset, arena);
8530 if (res != 0) goto failed;
8531 Py_CLEAR(tmp);
8532 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008533 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
8534 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008535 return 0;
8536failed:
8537 Py_XDECREF(tmp);
8538 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008539}
8540
8541int
8542obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8543{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008544 PyObject* tmp = NULL;
8545 identifier arg;
8546 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008547
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008548 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8549 return 1;
8550 }
8551 if (tmp == NULL || tmp == Py_None) {
8552 Py_CLEAR(tmp);
8553 arg = NULL;
8554 }
8555 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008556 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008557 res = obj2ast_identifier(tmp, &arg, arena);
8558 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008559 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008560 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008561 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8562 return 1;
8563 }
8564 if (tmp == NULL) {
8565 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8566 return 1;
8567 }
8568 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008569 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008570 res = obj2ast_expr(tmp, &value, arena);
8571 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008572 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008573 }
8574 *out = keyword(arg, value, arena);
8575 return 0;
8576failed:
8577 Py_XDECREF(tmp);
8578 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008579}
8580
8581int
8582obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8583{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008584 PyObject* tmp = NULL;
8585 identifier name;
8586 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008587
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008588 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8589 return 1;
8590 }
8591 if (tmp == NULL) {
8592 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8593 return 1;
8594 }
8595 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008596 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008597 res = obj2ast_identifier(tmp, &name, arena);
8598 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008599 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008600 }
8601 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008602 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008603 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008604 if (tmp == NULL || tmp == Py_None) {
8605 Py_CLEAR(tmp);
8606 asname = NULL;
8607 }
8608 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008609 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008610 res = obj2ast_identifier(tmp, &asname, arena);
8611 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008612 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008613 }
8614 *out = alias(name, asname, arena);
8615 return 0;
8616failed:
8617 Py_XDECREF(tmp);
8618 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008619}
8620
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008621int
8622obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8623{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008624 PyObject* tmp = NULL;
8625 expr_ty context_expr;
8626 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008627
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008628 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8629 return 1;
8630 }
8631 if (tmp == NULL) {
8632 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8633 return 1;
8634 }
8635 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008636 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008637 res = obj2ast_expr(tmp, &context_expr, arena);
8638 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008639 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008640 }
8641 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008642 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008643 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008644 if (tmp == NULL || tmp == Py_None) {
8645 Py_CLEAR(tmp);
8646 optional_vars = NULL;
8647 }
8648 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008649 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008650 res = obj2ast_expr(tmp, &optional_vars, arena);
8651 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008652 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008653 }
8654 *out = withitem(context_expr, optional_vars, arena);
8655 return 0;
8656failed:
8657 Py_XDECREF(tmp);
8658 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008659}
8660
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008661int
8662obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena)
8663{
8664 int isinstance;
8665
8666 PyObject *tmp = NULL;
8667
8668 if (obj == Py_None) {
8669 *out = NULL;
8670 return 0;
8671 }
8672 isinstance = PyObject_IsInstance(obj, (PyObject*)TypeIgnore_type);
8673 if (isinstance == -1) {
8674 return 1;
8675 }
8676 if (isinstance) {
8677 int lineno;
8678
8679 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8680 return 1;
8681 }
8682 if (tmp == NULL) {
8683 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
8684 return 1;
8685 }
8686 else {
8687 int res;
8688 res = obj2ast_int(tmp, &lineno, arena);
8689 if (res != 0) goto failed;
8690 Py_CLEAR(tmp);
8691 }
8692 *out = TypeIgnore(lineno, arena);
8693 if (*out == NULL) goto failed;
8694 return 0;
8695 }
8696
8697 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
8698 failed:
8699 Py_XDECREF(tmp);
8700 return 1;
8701}
8702
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008703
Martin v. Löwis1a214512008-06-11 05:26:20 +00008704static struct PyModuleDef _astmodule = {
8705 PyModuleDef_HEAD_INIT, "_ast"
8706};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008707PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008708PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008709{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008710 PyObject *m, *d;
8711 if (!init_types()) return NULL;
8712 m = PyModule_Create(&_astmodule);
8713 if (!m) return NULL;
8714 d = PyModule_GetDict(m);
8715 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008716 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008717 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008718 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)
8719 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008720 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8721 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8722 NULL;
8723 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8724 0) return NULL;
8725 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8726 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008727 if (PyDict_SetItemString(d, "FunctionType", (PyObject*)FunctionType_type) <
8728 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008729 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8730 NULL;
8731 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8732 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8733 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008734 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8735 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008736 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8737 return NULL;
8738 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8739 NULL;
8740 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8741 NULL;
8742 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8743 NULL;
8744 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8745 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008746 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8747 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008748 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008749 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8750 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008751 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8752 NULL;
8753 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8754 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008755 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8756 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008757 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8758 NULL;
8759 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8760 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8761 NULL;
8762 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8763 NULL;
8764 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8765 return NULL;
8766 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8767 NULL;
8768 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8769 return NULL;
8770 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8771 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8772 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8773 NULL;
8774 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8775 return NULL;
8776 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8777 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8778 NULL;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07008779 if (PyDict_SetItemString(d, "NamedExpr", (PyObject*)NamedExpr_type) < 0)
8780 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008781 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8782 NULL;
8783 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8784 NULL;
8785 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8786 NULL;
8787 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8788 NULL;
8789 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8790 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8791 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8792 return NULL;
8793 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8794 NULL;
8795 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8796 return NULL;
8797 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8798 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008799 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8800 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008801 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8802 NULL;
8803 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8804 return NULL;
8805 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8806 NULL;
8807 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008808 if (PyDict_SetItemString(d, "FormattedValue",
8809 (PyObject*)FormattedValue_type) < 0) return NULL;
8810 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8811 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008812 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8813 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008814 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8815 return NULL;
8816 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8817 return NULL;
8818 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8819 NULL;
8820 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8821 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8822 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8823 NULL;
8824 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8825 0) return NULL;
8826 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8827 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8828 NULL;
8829 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8830 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8831 NULL;
8832 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8833 return NULL;
8834 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8835 NULL;
8836 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8837 NULL;
8838 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8839 NULL;
8840 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8841 return NULL;
8842 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8843 NULL;
8844 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8845 NULL;
8846 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8847 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8848 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8849 return NULL;
8850 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8851 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8852 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008853 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8854 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008855 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8856 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8857 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8858 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8859 NULL;
8860 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8861 NULL;
8862 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8863 NULL;
8864 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8865 NULL;
8866 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8867 NULL;
8868 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8869 return NULL;
8870 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8871 NULL;
8872 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8873 NULL;
8874 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8875 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8876 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8877 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8878 NULL;
8879 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8880 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8881 NULL;
8882 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8883 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8884 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8885 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8886 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8887 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8888 NULL;
8889 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8890 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8891 NULL;
8892 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8893 < 0) return NULL;
8894 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8895 < 0) return NULL;
8896 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8897 < 0) return NULL;
8898 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8899 return NULL;
8900 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8901 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8902 NULL;
8903 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8904 NULL;
8905 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8906 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008907 if (PyDict_SetItemString(d, "type_ignore", (PyObject*)type_ignore_type) <
8908 0) return NULL;
8909 if (PyDict_SetItemString(d, "TypeIgnore", (PyObject*)TypeIgnore_type) < 0)
8910 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008911 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008912}
8913
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008914
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008915PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008916{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008917 if (!init_types())
8918 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008919 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008920}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008921
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008922/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8923mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008924{
Guido van Rossum495da292019-03-07 12:38:08 -08008925 return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION);
8926}
8927
8928mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version)
8929{
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008930 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008931 PyObject *req_type[3];
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08008932 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008933 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008934
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008935 req_type[0] = (PyObject*)Module_type;
8936 req_type[1] = (PyObject*)Expression_type;
8937 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008938
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08008939 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008940
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008941 if (!init_types())
8942 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008943
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008944 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8945 if (isinstance == -1)
8946 return NULL;
8947 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008948 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8949 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008950 return NULL;
8951 }
8952 if (obj2ast_mod(ast, &res, arena) != 0)
8953 return NULL;
8954 else
8955 return res;
8956}
8957
8958int PyAST_Check(PyObject* obj)
8959{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008960 if (!init_types())
8961 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00008962 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008963}
8964
Martin v. Löwis5b222132007-06-10 09:51:05 +00008965