blob: fd96964a1e77eded118dfd916199bed3c69be533 [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*);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100472_Py_IDENTIFIER(posonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200473_Py_IDENTIFIER(vararg);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200474_Py_IDENTIFIER(kwonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200475_Py_IDENTIFIER(kw_defaults);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700476_Py_IDENTIFIER(kwarg);
477_Py_IDENTIFIER(defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000478static char *arguments_fields[]={
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100479 "posonlyargs",
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -0700480 "args",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200481 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200482 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200483 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200484 "kwarg",
485 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000486};
Neal Norwitzc1505362006-12-28 06:47:50 +0000487static PyTypeObject *arg_type;
488static PyObject* ast2obj_arg(void*);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700489static char *arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200490 "lineno",
491 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000492 "end_lineno",
493 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700494};
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200495_Py_IDENTIFIER(arg);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000496static char *arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200497 "arg",
498 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800499 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +0000500};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000501static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000502static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000503static char *keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200504 "arg",
505 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000506};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000507static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000508static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200509_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000510static char *alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200511 "name",
512 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000513};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500514static PyTypeObject *withitem_type;
515static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200516_Py_IDENTIFIER(context_expr);
517_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500518static char *withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200519 "context_expr",
520 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500521};
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800522static PyTypeObject *type_ignore_type;
523static PyObject* ast2obj_type_ignore(void*);
524static PyTypeObject *TypeIgnore_type;
Michael J. Sullivan933e1502019-05-22 07:54:20 -0700525_Py_IDENTIFIER(tag);
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800526static char *TypeIgnore_fields[]={
527 "lineno",
Michael J. Sullivan933e1502019-05-22 07:54:20 -0700528 "tag",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800529};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000530
531
INADA Naokifc489082017-01-25 22:33:43 +0900532_Py_IDENTIFIER(_fields);
533_Py_IDENTIFIER(_attributes);
534
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700535typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100536 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700537 PyObject *dict;
538} AST_object;
539
Benjamin Peterson1767e022012-03-14 21:50:29 -0500540static void
541ast_dealloc(AST_object *self)
542{
INADA Naokia6296d32017-08-24 14:55:17 +0900543 /* bpo-31095: UnTrack is needed before calling any callbacks */
544 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500545 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200546 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500547}
548
Neal Norwitz207c9f32008-03-31 04:42:11 +0000549static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700550ast_traverse(AST_object *self, visitproc visit, void *arg)
551{
552 Py_VISIT(self->dict);
553 return 0;
554}
555
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300556static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700557ast_clear(AST_object *self)
558{
559 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300560 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700561}
562
563static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000564ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
565{
566 Py_ssize_t i, numfields = 0;
567 int res = -1;
568 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200569 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
570 goto cleanup;
571 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000572 if (fields) {
573 numfields = PySequence_Size(fields);
574 if (numfields == -1)
575 goto cleanup;
576 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900577
Neal Norwitz207c9f32008-03-31 04:42:11 +0000578 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900579 if (numfields < PyTuple_GET_SIZE(args)) {
580 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
581 "%zd positional argument%s",
582 Py_TYPE(self)->tp_name,
583 numfields, numfields == 1 ? "" : "s");
584 res = -1;
585 goto cleanup;
586 }
587 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
588 /* cannot be reached when fields is NULL */
589 PyObject *name = PySequence_GetItem(fields, i);
590 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000591 res = -1;
592 goto cleanup;
593 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900594 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
595 Py_DECREF(name);
596 if (res < 0)
597 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000598 }
599 if (kw) {
600 i = 0; /* needed by PyDict_Next */
601 while (PyDict_Next(kw, &i, &key, &value)) {
602 res = PyObject_SetAttr(self, key, value);
603 if (res < 0)
604 goto cleanup;
605 }
606 }
607 cleanup:
608 Py_XDECREF(fields);
609 return res;
610}
611
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000612/* Pickling support */
613static PyObject *
614ast_type_reduce(PyObject *self, PyObject *unused)
615{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200616 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200617 PyObject *dict;
618 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
619 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000620 }
621 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200622 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000623 }
624 return Py_BuildValue("O()", Py_TYPE(self));
625}
626
627static PyMethodDef ast_type_methods[] = {
628 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
629 {NULL}
630};
631
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700632static PyGetSetDef ast_type_getsets[] = {
633 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
634 {NULL}
635};
636
Neal Norwitz207c9f32008-03-31 04:42:11 +0000637static PyTypeObject AST_type = {
638 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000639 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700640 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000641 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500642 (destructor)ast_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200643 0, /* tp_vectorcall_offset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000644 0, /* tp_getattr */
645 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200646 0, /* tp_as_async */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000647 0, /* tp_repr */
648 0, /* tp_as_number */
649 0, /* tp_as_sequence */
650 0, /* tp_as_mapping */
651 0, /* tp_hash */
652 0, /* tp_call */
653 0, /* tp_str */
654 PyObject_GenericGetAttr, /* tp_getattro */
655 PyObject_GenericSetAttr, /* tp_setattro */
656 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700657 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000658 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700659 (traverseproc)ast_traverse, /* tp_traverse */
660 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000661 0, /* tp_richcompare */
662 0, /* tp_weaklistoffset */
663 0, /* tp_iter */
664 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000665 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000666 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700667 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000668 0, /* tp_base */
669 0, /* tp_dict */
670 0, /* tp_descr_get */
671 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700672 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000673 (initproc)ast_type_init, /* tp_init */
674 PyType_GenericAlloc, /* tp_alloc */
675 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700676 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000677};
678
679
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000680static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
681{
INADA Naokifc489082017-01-25 22:33:43 +0900682 _Py_IDENTIFIER(__module__);
683 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000684 PyObject *fnames, *result;
685 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000686 fnames = PyTuple_New(num_fields);
687 if (!fnames) return NULL;
688 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000689 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000690 if (!field) {
691 Py_DECREF(fnames);
692 return NULL;
693 }
694 PyTuple_SET_ITEM(fnames, i, field);
695 }
INADA Naokifc489082017-01-25 22:33:43 +0900696 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
697 type, base,
698 _PyUnicode_FromId(&PyId__fields), fnames,
699 _PyUnicode_FromId(&PyId___module__),
700 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000701 Py_DECREF(fnames);
702 return (PyTypeObject*)result;
703}
704
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000705static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
706{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000707 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000708 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000709 if (!l)
710 return 0;
711 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000712 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000713 if (!s) {
714 Py_DECREF(l);
715 return 0;
716 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000717 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000718 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200719 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000720 Py_DECREF(l);
721 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000722}
723
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000724/* Conversion AST -> Python */
725
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000726static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
727{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700728 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000729 PyObject *result = PyList_New(n);
730 PyObject *value;
731 if (!result)
732 return NULL;
733 for (i = 0; i < n; i++) {
734 value = func(asdl_seq_GET(seq, i));
735 if (!value) {
736 Py_DECREF(result);
737 return NULL;
738 }
739 PyList_SET_ITEM(result, i, value);
740 }
741 return result;
742}
743
744static PyObject* ast2obj_object(void *o)
745{
746 if (!o)
747 o = Py_None;
748 Py_INCREF((PyObject*)o);
749 return (PyObject*)o;
750}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500751#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100752#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000753#define ast2obj_identifier ast2obj_object
754#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500755#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000756
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000757static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000758{
Christian Heimes217cfd12007-12-02 14:31:20 +0000759 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000760}
761
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000762/* Conversion Python -> AST */
763
764static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
765{
766 if (obj == Py_None)
767 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200768 if (obj) {
769 if (PyArena_AddPyObject(arena, obj) < 0) {
770 *out = NULL;
771 return -1;
772 }
773 Py_INCREF(obj);
774 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000775 *out = obj;
776 return 0;
777}
778
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100779static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
780{
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300781 if (PyArena_AddPyObject(arena, obj) < 0) {
782 *out = NULL;
783 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100784 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300785 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100786 *out = obj;
787 return 0;
788}
789
Benjamin Peterson180e6352011-07-22 11:09:07 -0500790static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500791{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500792 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
793 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500794 return 1;
795 }
796 return obj2ast_object(obj, out, arena);
797}
798
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800799static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
800{
801 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
802 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
803 return 1;
804 }
805 return obj2ast_object(obj, out, arena);
806}
807
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000808static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
809{
810 int i;
811 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100812 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000813 return 1;
814 }
815
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300816 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000817 if (i == -1 && PyErr_Occurred())
818 return 1;
819 *out = i;
820 return 0;
821}
822
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000823static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000824{
825 PyObject *empty_tuple, *d;
826 if (PyType_Ready(&AST_type) < 0)
827 return -1;
828 d = AST_type.tp_dict;
829 empty_tuple = PyTuple_New(0);
830 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900831 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
832 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000833 Py_XDECREF(empty_tuple);
834 return -1;
835 }
836 Py_DECREF(empty_tuple);
837 return 0;
838}
839
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000840
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000841static int init_types(void)
842{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200843 static int initialized;
844 if (initialized) return 1;
845 if (add_ast_fields() < 0) return 0;
846 mod_type = make_type("mod", &AST_type, NULL, 0);
847 if (!mod_type) return 0;
848 if (!add_attributes(mod_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800849 Module_type = make_type("Module", mod_type, Module_fields, 2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200850 if (!Module_type) return 0;
851 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
852 1);
853 if (!Interactive_type) return 0;
854 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
855 if (!Expression_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800856 FunctionType_type = make_type("FunctionType", mod_type,
857 FunctionType_fields, 2);
858 if (!FunctionType_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200859 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
860 if (!Suite_type) return 0;
861 stmt_type = make_type("stmt", &AST_type, NULL, 0);
862 if (!stmt_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000863 if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200864 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800865 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200866 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400867 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800868 AsyncFunctionDef_fields, 6);
Yury Selivanov75445082015-05-11 22:57:16 -0400869 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300870 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200871 if (!ClassDef_type) return 0;
872 Return_type = make_type("Return", stmt_type, Return_fields, 1);
873 if (!Return_type) return 0;
874 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
875 if (!Delete_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800876 Assign_type = make_type("Assign", stmt_type, Assign_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200877 if (!Assign_type) return 0;
878 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
879 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700880 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
881 if (!AnnAssign_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800882 For_type = make_type("For", stmt_type, For_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200883 if (!For_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800884 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400885 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200886 While_type = make_type("While", stmt_type, While_fields, 3);
887 if (!While_type) return 0;
888 If_type = make_type("If", stmt_type, If_fields, 3);
889 if (!If_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800890 With_type = make_type("With", stmt_type, With_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200891 if (!With_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800892 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 3);
Yury Selivanov75445082015-05-11 22:57:16 -0400893 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200894 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
895 if (!Raise_type) return 0;
896 Try_type = make_type("Try", stmt_type, Try_fields, 4);
897 if (!Try_type) return 0;
898 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
899 if (!Assert_type) return 0;
900 Import_type = make_type("Import", stmt_type, Import_fields, 1);
901 if (!Import_type) return 0;
902 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
903 if (!ImportFrom_type) return 0;
904 Global_type = make_type("Global", stmt_type, Global_fields, 1);
905 if (!Global_type) return 0;
906 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
907 if (!Nonlocal_type) return 0;
908 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
909 if (!Expr_type) return 0;
910 Pass_type = make_type("Pass", stmt_type, NULL, 0);
911 if (!Pass_type) return 0;
912 Break_type = make_type("Break", stmt_type, NULL, 0);
913 if (!Break_type) return 0;
914 Continue_type = make_type("Continue", stmt_type, NULL, 0);
915 if (!Continue_type) return 0;
916 expr_type = make_type("expr", &AST_type, NULL, 0);
917 if (!expr_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000918 if (!add_attributes(expr_type, expr_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200919 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
920 if (!BoolOp_type) return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700921 NamedExpr_type = make_type("NamedExpr", expr_type, NamedExpr_fields, 2);
922 if (!NamedExpr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200923 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
924 if (!BinOp_type) return 0;
925 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
926 if (!UnaryOp_type) return 0;
927 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
928 if (!Lambda_type) return 0;
929 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
930 if (!IfExp_type) return 0;
931 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
932 if (!Dict_type) return 0;
933 Set_type = make_type("Set", expr_type, Set_fields, 1);
934 if (!Set_type) return 0;
935 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
936 if (!ListComp_type) return 0;
937 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
938 if (!SetComp_type) return 0;
939 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
940 if (!DictComp_type) return 0;
941 GeneratorExp_type = make_type("GeneratorExp", expr_type,
942 GeneratorExp_fields, 2);
943 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400944 Await_type = make_type("Await", expr_type, Await_fields, 1);
945 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200946 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
947 if (!Yield_type) return 0;
948 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
949 if (!YieldFrom_type) return 0;
950 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
951 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400952 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200953 if (!Call_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400954 FormattedValue_type = make_type("FormattedValue", expr_type,
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -0400955 FormattedValue_fields, 3);
Eric V. Smith235a6f02015-09-19 14:51:32 -0400956 if (!FormattedValue_type) return 0;
957 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
958 if (!JoinedStr_type) return 0;
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700959 Constant_type = make_type("Constant", expr_type, Constant_fields, 2);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100960 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200961 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
962 if (!Attribute_type) return 0;
963 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
964 if (!Subscript_type) return 0;
965 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
966 if (!Starred_type) return 0;
967 Name_type = make_type("Name", expr_type, Name_fields, 2);
968 if (!Name_type) return 0;
969 List_type = make_type("List", expr_type, List_fields, 2);
970 if (!List_type) return 0;
971 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
972 if (!Tuple_type) return 0;
973 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
974 if (!expr_context_type) return 0;
975 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
976 Load_type = make_type("Load", expr_context_type, NULL, 0);
977 if (!Load_type) return 0;
978 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
979 if (!Load_singleton) return 0;
980 Store_type = make_type("Store", expr_context_type, NULL, 0);
981 if (!Store_type) return 0;
982 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
983 if (!Store_singleton) return 0;
984 Del_type = make_type("Del", expr_context_type, NULL, 0);
985 if (!Del_type) return 0;
986 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
987 if (!Del_singleton) return 0;
988 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
989 if (!AugLoad_type) return 0;
990 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
991 if (!AugLoad_singleton) return 0;
992 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
993 if (!AugStore_type) return 0;
994 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
995 if (!AugStore_singleton) return 0;
996 Param_type = make_type("Param", expr_context_type, NULL, 0);
997 if (!Param_type) return 0;
998 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
999 if (!Param_singleton) return 0;
1000 slice_type = make_type("slice", &AST_type, NULL, 0);
1001 if (!slice_type) return 0;
1002 if (!add_attributes(slice_type, NULL, 0)) return 0;
1003 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1004 if (!Slice_type) return 0;
1005 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1006 if (!ExtSlice_type) return 0;
1007 Index_type = make_type("Index", slice_type, Index_fields, 1);
1008 if (!Index_type) return 0;
1009 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1010 if (!boolop_type) return 0;
1011 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1012 And_type = make_type("And", boolop_type, NULL, 0);
1013 if (!And_type) return 0;
1014 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1015 if (!And_singleton) return 0;
1016 Or_type = make_type("Or", boolop_type, NULL, 0);
1017 if (!Or_type) return 0;
1018 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1019 if (!Or_singleton) return 0;
1020 operator_type = make_type("operator", &AST_type, NULL, 0);
1021 if (!operator_type) return 0;
1022 if (!add_attributes(operator_type, NULL, 0)) return 0;
1023 Add_type = make_type("Add", operator_type, NULL, 0);
1024 if (!Add_type) return 0;
1025 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1026 if (!Add_singleton) return 0;
1027 Sub_type = make_type("Sub", operator_type, NULL, 0);
1028 if (!Sub_type) return 0;
1029 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1030 if (!Sub_singleton) return 0;
1031 Mult_type = make_type("Mult", operator_type, NULL, 0);
1032 if (!Mult_type) return 0;
1033 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1034 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001035 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1036 if (!MatMult_type) return 0;
1037 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1038 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001039 Div_type = make_type("Div", operator_type, NULL, 0);
1040 if (!Div_type) return 0;
1041 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1042 if (!Div_singleton) return 0;
1043 Mod_type = make_type("Mod", operator_type, NULL, 0);
1044 if (!Mod_type) return 0;
1045 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1046 if (!Mod_singleton) return 0;
1047 Pow_type = make_type("Pow", operator_type, NULL, 0);
1048 if (!Pow_type) return 0;
1049 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1050 if (!Pow_singleton) return 0;
1051 LShift_type = make_type("LShift", operator_type, NULL, 0);
1052 if (!LShift_type) return 0;
1053 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1054 if (!LShift_singleton) return 0;
1055 RShift_type = make_type("RShift", operator_type, NULL, 0);
1056 if (!RShift_type) return 0;
1057 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1058 if (!RShift_singleton) return 0;
1059 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1060 if (!BitOr_type) return 0;
1061 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1062 if (!BitOr_singleton) return 0;
1063 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1064 if (!BitXor_type) return 0;
1065 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1066 if (!BitXor_singleton) return 0;
1067 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1068 if (!BitAnd_type) return 0;
1069 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1070 if (!BitAnd_singleton) return 0;
1071 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1072 if (!FloorDiv_type) return 0;
1073 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1074 if (!FloorDiv_singleton) return 0;
1075 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1076 if (!unaryop_type) return 0;
1077 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1078 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1079 if (!Invert_type) return 0;
1080 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1081 if (!Invert_singleton) return 0;
1082 Not_type = make_type("Not", unaryop_type, NULL, 0);
1083 if (!Not_type) return 0;
1084 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1085 if (!Not_singleton) return 0;
1086 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1087 if (!UAdd_type) return 0;
1088 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1089 if (!UAdd_singleton) return 0;
1090 USub_type = make_type("USub", unaryop_type, NULL, 0);
1091 if (!USub_type) return 0;
1092 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1093 if (!USub_singleton) return 0;
1094 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1095 if (!cmpop_type) return 0;
1096 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1097 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1098 if (!Eq_type) return 0;
1099 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1100 if (!Eq_singleton) return 0;
1101 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1102 if (!NotEq_type) return 0;
1103 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1104 if (!NotEq_singleton) return 0;
1105 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1106 if (!Lt_type) return 0;
1107 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1108 if (!Lt_singleton) return 0;
1109 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1110 if (!LtE_type) return 0;
1111 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1112 if (!LtE_singleton) return 0;
1113 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1114 if (!Gt_type) return 0;
1115 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1116 if (!Gt_singleton) return 0;
1117 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1118 if (!GtE_type) return 0;
1119 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1120 if (!GtE_singleton) return 0;
1121 Is_type = make_type("Is", cmpop_type, NULL, 0);
1122 if (!Is_type) return 0;
1123 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1124 if (!Is_singleton) return 0;
1125 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1126 if (!IsNot_type) return 0;
1127 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1128 if (!IsNot_singleton) return 0;
1129 In_type = make_type("In", cmpop_type, NULL, 0);
1130 if (!In_type) return 0;
1131 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1132 if (!In_singleton) return 0;
1133 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1134 if (!NotIn_type) return 0;
1135 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1136 if (!NotIn_singleton) return 0;
1137 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001138 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001139 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001140 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001141 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1142 if (!excepthandler_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001143 if (!add_attributes(excepthandler_type, excepthandler_attributes, 4))
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001144 return 0;
1145 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1146 ExceptHandler_fields, 3);
1147 if (!ExceptHandler_type) return 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001148 arguments_type = make_type("arguments", &AST_type, arguments_fields, 7);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001149 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001150 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001151 arg_type = make_type("arg", &AST_type, arg_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001152 if (!arg_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001153 if (!add_attributes(arg_type, arg_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001154 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1155 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001156 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001157 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1158 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001159 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001160 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1161 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001162 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001163 type_ignore_type = make_type("type_ignore", &AST_type, NULL, 0);
1164 if (!type_ignore_type) return 0;
1165 if (!add_attributes(type_ignore_type, NULL, 0)) return 0;
1166 TypeIgnore_type = make_type("TypeIgnore", type_ignore_type,
Michael J. Sullivan933e1502019-05-22 07:54:20 -07001167 TypeIgnore_fields, 2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001168 if (!TypeIgnore_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001169 initialized = 1;
1170 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001171}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001172
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001173static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1174static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1175static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1176static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1177 arena);
1178static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1179static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1180static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1181static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1182static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1183static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1184 arena);
1185static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1186 arena);
1187static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1188static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1189static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1190static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001191static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001192static int obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena*
1193 arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001194
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001196Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001198 mod_ty p;
1199 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1200 if (!p)
1201 return NULL;
1202 p->kind = Module_kind;
1203 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001204 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001205 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206}
1207
1208mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001209Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001211 mod_ty p;
1212 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1213 if (!p)
1214 return NULL;
1215 p->kind = Interactive_kind;
1216 p->v.Interactive.body = body;
1217 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218}
1219
1220mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001221Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001223 mod_ty p;
1224 if (!body) {
1225 PyErr_SetString(PyExc_ValueError,
1226 "field body is required for Expression");
1227 return NULL;
1228 }
1229 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1230 if (!p)
1231 return NULL;
1232 p->kind = Expression_kind;
1233 p->v.Expression.body = body;
1234 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235}
1236
1237mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001238FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena)
1239{
1240 mod_ty p;
1241 if (!returns) {
1242 PyErr_SetString(PyExc_ValueError,
1243 "field returns is required for FunctionType");
1244 return NULL;
1245 }
1246 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1247 if (!p)
1248 return NULL;
1249 p->kind = FunctionType_kind;
1250 p->v.FunctionType.argtypes = argtypes;
1251 p->v.FunctionType.returns = returns;
1252 return p;
1253}
1254
1255mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001256Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001258 mod_ty p;
1259 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1260 if (!p)
1261 return NULL;
1262 p->kind = Suite_kind;
1263 p->v.Suite.body = body;
1264 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265}
1266
1267stmt_ty
1268FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001269 decorator_list, expr_ty returns, string type_comment, int lineno,
1270 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001272 stmt_ty p;
1273 if (!name) {
1274 PyErr_SetString(PyExc_ValueError,
1275 "field name is required for FunctionDef");
1276 return NULL;
1277 }
1278 if (!args) {
1279 PyErr_SetString(PyExc_ValueError,
1280 "field args is required for FunctionDef");
1281 return NULL;
1282 }
1283 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1284 if (!p)
1285 return NULL;
1286 p->kind = FunctionDef_kind;
1287 p->v.FunctionDef.name = name;
1288 p->v.FunctionDef.args = args;
1289 p->v.FunctionDef.body = body;
1290 p->v.FunctionDef.decorator_list = decorator_list;
1291 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001292 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001293 p->lineno = lineno;
1294 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001295 p->end_lineno = end_lineno;
1296 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001297 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001298}
1299
1300stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001301AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001302 * decorator_list, expr_ty returns, string type_comment, int
1303 lineno, int col_offset, int end_lineno, int end_col_offset,
1304 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001305{
1306 stmt_ty p;
1307 if (!name) {
1308 PyErr_SetString(PyExc_ValueError,
1309 "field name is required for AsyncFunctionDef");
1310 return NULL;
1311 }
1312 if (!args) {
1313 PyErr_SetString(PyExc_ValueError,
1314 "field args is required for AsyncFunctionDef");
1315 return NULL;
1316 }
1317 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1318 if (!p)
1319 return NULL;
1320 p->kind = AsyncFunctionDef_kind;
1321 p->v.AsyncFunctionDef.name = name;
1322 p->v.AsyncFunctionDef.args = args;
1323 p->v.AsyncFunctionDef.body = body;
1324 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1325 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001326 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001327 p->lineno = lineno;
1328 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001329 p->end_lineno = end_lineno;
1330 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001331 return p;
1332}
1333
1334stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001335ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001336 body, asdl_seq * decorator_list, int lineno, int col_offset, int
1337 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001339 stmt_ty p;
1340 if (!name) {
1341 PyErr_SetString(PyExc_ValueError,
1342 "field name is required for ClassDef");
1343 return NULL;
1344 }
1345 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1346 if (!p)
1347 return NULL;
1348 p->kind = ClassDef_kind;
1349 p->v.ClassDef.name = name;
1350 p->v.ClassDef.bases = bases;
1351 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001352 p->v.ClassDef.body = body;
1353 p->v.ClassDef.decorator_list = decorator_list;
1354 p->lineno = lineno;
1355 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001356 p->end_lineno = end_lineno;
1357 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001358 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359}
1360
1361stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001362Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
1363 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001365 stmt_ty p;
1366 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1367 if (!p)
1368 return NULL;
1369 p->kind = Return_kind;
1370 p->v.Return.value = value;
1371 p->lineno = lineno;
1372 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001373 p->end_lineno = end_lineno;
1374 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001375 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376}
1377
1378stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001379Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int
1380 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001382 stmt_ty p;
1383 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1384 if (!p)
1385 return NULL;
1386 p->kind = Delete_kind;
1387 p->v.Delete.targets = targets;
1388 p->lineno = lineno;
1389 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001390 p->end_lineno = end_lineno;
1391 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001392 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393}
1394
1395stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001396Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int
1397 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001399 stmt_ty p;
1400 if (!value) {
1401 PyErr_SetString(PyExc_ValueError,
1402 "field value is required for Assign");
1403 return NULL;
1404 }
1405 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1406 if (!p)
1407 return NULL;
1408 p->kind = Assign_kind;
1409 p->v.Assign.targets = targets;
1410 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001411 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001412 p->lineno = lineno;
1413 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001414 p->end_lineno = end_lineno;
1415 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001416 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417}
1418
1419stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001420AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001421 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001423 stmt_ty p;
1424 if (!target) {
1425 PyErr_SetString(PyExc_ValueError,
1426 "field target is required for AugAssign");
1427 return NULL;
1428 }
1429 if (!op) {
1430 PyErr_SetString(PyExc_ValueError,
1431 "field op is required for AugAssign");
1432 return NULL;
1433 }
1434 if (!value) {
1435 PyErr_SetString(PyExc_ValueError,
1436 "field value is required for AugAssign");
1437 return NULL;
1438 }
1439 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1440 if (!p)
1441 return NULL;
1442 p->kind = AugAssign_kind;
1443 p->v.AugAssign.target = target;
1444 p->v.AugAssign.op = op;
1445 p->v.AugAssign.value = value;
1446 p->lineno = lineno;
1447 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001448 p->end_lineno = end_lineno;
1449 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001450 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451}
1452
1453stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001454AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001455 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1456 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001457{
1458 stmt_ty p;
1459 if (!target) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "field target is required for AnnAssign");
1462 return NULL;
1463 }
1464 if (!annotation) {
1465 PyErr_SetString(PyExc_ValueError,
1466 "field annotation is required for AnnAssign");
1467 return NULL;
1468 }
1469 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1470 if (!p)
1471 return NULL;
1472 p->kind = AnnAssign_kind;
1473 p->v.AnnAssign.target = target;
1474 p->v.AnnAssign.annotation = annotation;
1475 p->v.AnnAssign.value = value;
1476 p->v.AnnAssign.simple = simple;
1477 p->lineno = lineno;
1478 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001479 p->end_lineno = end_lineno;
1480 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001481 return p;
1482}
1483
1484stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001485For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string
1486 type_comment, int lineno, int col_offset, int end_lineno, int
1487 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001489 stmt_ty p;
1490 if (!target) {
1491 PyErr_SetString(PyExc_ValueError,
1492 "field target is required for For");
1493 return NULL;
1494 }
1495 if (!iter) {
1496 PyErr_SetString(PyExc_ValueError,
1497 "field iter is required for For");
1498 return NULL;
1499 }
1500 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1501 if (!p)
1502 return NULL;
1503 p->kind = For_kind;
1504 p->v.For.target = target;
1505 p->v.For.iter = iter;
1506 p->v.For.body = body;
1507 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001508 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001509 p->lineno = lineno;
1510 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001511 p->end_lineno = end_lineno;
1512 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001513 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514}
1515
1516stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001517AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse,
1518 string type_comment, int lineno, int col_offset, int end_lineno, int
1519 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001520{
1521 stmt_ty p;
1522 if (!target) {
1523 PyErr_SetString(PyExc_ValueError,
1524 "field target is required for AsyncFor");
1525 return NULL;
1526 }
1527 if (!iter) {
1528 PyErr_SetString(PyExc_ValueError,
1529 "field iter is required for AsyncFor");
1530 return NULL;
1531 }
1532 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1533 if (!p)
1534 return NULL;
1535 p->kind = AsyncFor_kind;
1536 p->v.AsyncFor.target = target;
1537 p->v.AsyncFor.iter = iter;
1538 p->v.AsyncFor.body = body;
1539 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001540 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001541 p->lineno = lineno;
1542 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001543 p->end_lineno = end_lineno;
1544 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001545 return p;
1546}
1547
1548stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001549While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001550 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001552 stmt_ty p;
1553 if (!test) {
1554 PyErr_SetString(PyExc_ValueError,
1555 "field test is required for While");
1556 return NULL;
1557 }
1558 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1559 if (!p)
1560 return NULL;
1561 p->kind = While_kind;
1562 p->v.While.test = test;
1563 p->v.While.body = body;
1564 p->v.While.orelse = orelse;
1565 p->lineno = lineno;
1566 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001567 p->end_lineno = end_lineno;
1568 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001569 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570}
1571
1572stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001573If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001574 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001576 stmt_ty p;
1577 if (!test) {
1578 PyErr_SetString(PyExc_ValueError,
1579 "field test is required for If");
1580 return NULL;
1581 }
1582 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1583 if (!p)
1584 return NULL;
1585 p->kind = If_kind;
1586 p->v.If.test = test;
1587 p->v.If.body = body;
1588 p->v.If.orelse = orelse;
1589 p->lineno = lineno;
1590 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001591 p->end_lineno = end_lineno;
1592 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001593 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594}
1595
1596stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001597With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int
1598 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001599{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001600 stmt_ty p;
1601 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1602 if (!p)
1603 return NULL;
1604 p->kind = With_kind;
1605 p->v.With.items = items;
1606 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001607 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001608 p->lineno = lineno;
1609 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001610 p->end_lineno = end_lineno;
1611 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001612 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001613}
1614
1615stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001616AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno,
1617 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001618{
1619 stmt_ty p;
1620 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1621 if (!p)
1622 return NULL;
1623 p->kind = AsyncWith_kind;
1624 p->v.AsyncWith.items = items;
1625 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001626 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001627 p->lineno = lineno;
1628 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001629 p->end_lineno = end_lineno;
1630 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001631 return p;
1632}
1633
1634stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001635Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
1636 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001638 stmt_ty p;
1639 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1640 if (!p)
1641 return NULL;
1642 p->kind = Raise_kind;
1643 p->v.Raise.exc = exc;
1644 p->v.Raise.cause = cause;
1645 p->lineno = lineno;
1646 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001647 p->end_lineno = end_lineno;
1648 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001649 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650}
1651
1652stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001653Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001654 finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset,
1655 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001657 stmt_ty p;
1658 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1659 if (!p)
1660 return NULL;
1661 p->kind = Try_kind;
1662 p->v.Try.body = body;
1663 p->v.Try.handlers = handlers;
1664 p->v.Try.orelse = orelse;
1665 p->v.Try.finalbody = finalbody;
1666 p->lineno = lineno;
1667 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001668 p->end_lineno = end_lineno;
1669 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001670 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671}
1672
1673stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001674Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
1675 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001677 stmt_ty p;
1678 if (!test) {
1679 PyErr_SetString(PyExc_ValueError,
1680 "field test is required for Assert");
1681 return NULL;
1682 }
1683 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1684 if (!p)
1685 return NULL;
1686 p->kind = Assert_kind;
1687 p->v.Assert.test = test;
1688 p->v.Assert.msg = msg;
1689 p->lineno = lineno;
1690 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001691 p->end_lineno = end_lineno;
1692 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001693 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694}
1695
1696stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001697Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1698 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001700 stmt_ty p;
1701 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1702 if (!p)
1703 return NULL;
1704 p->kind = Import_kind;
1705 p->v.Import.names = names;
1706 p->lineno = lineno;
1707 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001708 p->end_lineno = end_lineno;
1709 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001710 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711}
1712
1713stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001714ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001715 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001717 stmt_ty p;
1718 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1719 if (!p)
1720 return NULL;
1721 p->kind = ImportFrom_kind;
1722 p->v.ImportFrom.module = module;
1723 p->v.ImportFrom.names = names;
1724 p->v.ImportFrom.level = level;
1725 p->lineno = lineno;
1726 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001727 p->end_lineno = end_lineno;
1728 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001729 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730}
1731
1732stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001733Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1734 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001736 stmt_ty p;
1737 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1738 if (!p)
1739 return NULL;
1740 p->kind = Global_kind;
1741 p->v.Global.names = names;
1742 p->lineno = lineno;
1743 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001744 p->end_lineno = end_lineno;
1745 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001746 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747}
1748
1749stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001750Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1751 end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00001752{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001753 stmt_ty p;
1754 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1755 if (!p)
1756 return NULL;
1757 p->kind = Nonlocal_kind;
1758 p->v.Nonlocal.names = names;
1759 p->lineno = lineno;
1760 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001761 p->end_lineno = end_lineno;
1762 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001763 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001764}
1765
1766stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001767Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
1768 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001770 stmt_ty p;
1771 if (!value) {
1772 PyErr_SetString(PyExc_ValueError,
1773 "field value is required for Expr");
1774 return NULL;
1775 }
1776 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1777 if (!p)
1778 return NULL;
1779 p->kind = Expr_kind;
1780 p->v.Expr.value = value;
1781 p->lineno = lineno;
1782 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001783 p->end_lineno = end_lineno;
1784 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001785 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786}
1787
1788stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001789Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1790 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001792 stmt_ty p;
1793 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1794 if (!p)
1795 return NULL;
1796 p->kind = Pass_kind;
1797 p->lineno = lineno;
1798 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001799 p->end_lineno = end_lineno;
1800 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001801 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802}
1803
1804stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001805Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1806 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001808 stmt_ty p;
1809 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1810 if (!p)
1811 return NULL;
1812 p->kind = Break_kind;
1813 p->lineno = lineno;
1814 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001815 p->end_lineno = end_lineno;
1816 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001817 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818}
1819
1820stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001821Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
1822 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001824 stmt_ty p;
1825 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1826 if (!p)
1827 return NULL;
1828 p->kind = Continue_kind;
1829 p->lineno = lineno;
1830 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001831 p->end_lineno = end_lineno;
1832 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001833 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834}
1835
1836expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001837BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int
1838 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001840 expr_ty p;
1841 if (!op) {
1842 PyErr_SetString(PyExc_ValueError,
1843 "field op is required for BoolOp");
1844 return NULL;
1845 }
1846 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1847 if (!p)
1848 return NULL;
1849 p->kind = BoolOp_kind;
1850 p->v.BoolOp.op = op;
1851 p->v.BoolOp.values = values;
1852 p->lineno = lineno;
1853 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001854 p->end_lineno = end_lineno;
1855 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001856 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857}
1858
1859expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001860NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
1861 end_lineno, int end_col_offset, PyArena *arena)
1862{
1863 expr_ty p;
1864 if (!target) {
1865 PyErr_SetString(PyExc_ValueError,
1866 "field target is required for NamedExpr");
1867 return NULL;
1868 }
1869 if (!value) {
1870 PyErr_SetString(PyExc_ValueError,
1871 "field value is required for NamedExpr");
1872 return NULL;
1873 }
1874 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1875 if (!p)
1876 return NULL;
1877 p->kind = NamedExpr_kind;
1878 p->v.NamedExpr.target = target;
1879 p->v.NamedExpr.value = value;
1880 p->lineno = lineno;
1881 p->col_offset = col_offset;
1882 p->end_lineno = end_lineno;
1883 p->end_col_offset = end_col_offset;
1884 return p;
1885}
1886
1887expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001888BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001889 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001891 expr_ty p;
1892 if (!left) {
1893 PyErr_SetString(PyExc_ValueError,
1894 "field left is required for BinOp");
1895 return NULL;
1896 }
1897 if (!op) {
1898 PyErr_SetString(PyExc_ValueError,
1899 "field op is required for BinOp");
1900 return NULL;
1901 }
1902 if (!right) {
1903 PyErr_SetString(PyExc_ValueError,
1904 "field right is required for BinOp");
1905 return NULL;
1906 }
1907 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1908 if (!p)
1909 return NULL;
1910 p->kind = BinOp_kind;
1911 p->v.BinOp.left = left;
1912 p->v.BinOp.op = op;
1913 p->v.BinOp.right = right;
1914 p->lineno = lineno;
1915 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001916 p->end_lineno = end_lineno;
1917 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001918 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919}
1920
1921expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001922UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
1923 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001925 expr_ty p;
1926 if (!op) {
1927 PyErr_SetString(PyExc_ValueError,
1928 "field op is required for UnaryOp");
1929 return NULL;
1930 }
1931 if (!operand) {
1932 PyErr_SetString(PyExc_ValueError,
1933 "field operand is required for UnaryOp");
1934 return NULL;
1935 }
1936 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1937 if (!p)
1938 return NULL;
1939 p->kind = UnaryOp_kind;
1940 p->v.UnaryOp.op = op;
1941 p->v.UnaryOp.operand = operand;
1942 p->lineno = lineno;
1943 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001944 p->end_lineno = end_lineno;
1945 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001946 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947}
1948
1949expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001950Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
1951 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001953 expr_ty p;
1954 if (!args) {
1955 PyErr_SetString(PyExc_ValueError,
1956 "field args is required for Lambda");
1957 return NULL;
1958 }
1959 if (!body) {
1960 PyErr_SetString(PyExc_ValueError,
1961 "field body is required for Lambda");
1962 return NULL;
1963 }
1964 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1965 if (!p)
1966 return NULL;
1967 p->kind = Lambda_kind;
1968 p->v.Lambda.args = args;
1969 p->v.Lambda.body = body;
1970 p->lineno = lineno;
1971 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001972 p->end_lineno = end_lineno;
1973 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001974 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975}
1976
1977expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001978IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001979 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001980{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001981 expr_ty p;
1982 if (!test) {
1983 PyErr_SetString(PyExc_ValueError,
1984 "field test is required for IfExp");
1985 return NULL;
1986 }
1987 if (!body) {
1988 PyErr_SetString(PyExc_ValueError,
1989 "field body is required for IfExp");
1990 return NULL;
1991 }
1992 if (!orelse) {
1993 PyErr_SetString(PyExc_ValueError,
1994 "field orelse is required for IfExp");
1995 return NULL;
1996 }
1997 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1998 if (!p)
1999 return NULL;
2000 p->kind = IfExp_kind;
2001 p->v.IfExp.test = test;
2002 p->v.IfExp.body = body;
2003 p->v.IfExp.orelse = orelse;
2004 p->lineno = lineno;
2005 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002006 p->end_lineno = end_lineno;
2007 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002008 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002009}
2010
2011expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002012Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int
2013 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002015 expr_ty p;
2016 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2017 if (!p)
2018 return NULL;
2019 p->kind = Dict_kind;
2020 p->v.Dict.keys = keys;
2021 p->v.Dict.values = values;
2022 p->lineno = lineno;
2023 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002024 p->end_lineno = end_lineno;
2025 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002026 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027}
2028
2029expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002030Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int
2031 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002032{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002033 expr_ty p;
2034 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2035 if (!p)
2036 return NULL;
2037 p->kind = Set_kind;
2038 p->v.Set.elts = elts;
2039 p->lineno = lineno;
2040 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002041 p->end_lineno = end_lineno;
2042 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002043 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002044}
2045
2046expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002047ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2048 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002050 expr_ty p;
2051 if (!elt) {
2052 PyErr_SetString(PyExc_ValueError,
2053 "field elt is required for ListComp");
2054 return NULL;
2055 }
2056 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2057 if (!p)
2058 return NULL;
2059 p->kind = ListComp_kind;
2060 p->v.ListComp.elt = elt;
2061 p->v.ListComp.generators = generators;
2062 p->lineno = lineno;
2063 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002064 p->end_lineno = end_lineno;
2065 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002066 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067}
2068
2069expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002070SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2071 end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002072{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002073 expr_ty p;
2074 if (!elt) {
2075 PyErr_SetString(PyExc_ValueError,
2076 "field elt is required for SetComp");
2077 return NULL;
2078 }
2079 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2080 if (!p)
2081 return NULL;
2082 p->kind = SetComp_kind;
2083 p->v.SetComp.elt = elt;
2084 p->v.SetComp.generators = generators;
2085 p->lineno = lineno;
2086 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002087 p->end_lineno = end_lineno;
2088 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002089 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002090}
2091
2092expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00002093DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002094 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002095{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002096 expr_ty p;
2097 if (!key) {
2098 PyErr_SetString(PyExc_ValueError,
2099 "field key is required for DictComp");
2100 return NULL;
2101 }
2102 if (!value) {
2103 PyErr_SetString(PyExc_ValueError,
2104 "field value is required for DictComp");
2105 return NULL;
2106 }
2107 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2108 if (!p)
2109 return NULL;
2110 p->kind = DictComp_kind;
2111 p->v.DictComp.key = key;
2112 p->v.DictComp.value = value;
2113 p->v.DictComp.generators = generators;
2114 p->lineno = lineno;
2115 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002116 p->end_lineno = end_lineno;
2117 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002118 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002119}
2120
2121expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002122GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002123 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002125 expr_ty p;
2126 if (!elt) {
2127 PyErr_SetString(PyExc_ValueError,
2128 "field elt is required for GeneratorExp");
2129 return NULL;
2130 }
2131 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2132 if (!p)
2133 return NULL;
2134 p->kind = GeneratorExp_kind;
2135 p->v.GeneratorExp.elt = elt;
2136 p->v.GeneratorExp.generators = generators;
2137 p->lineno = lineno;
2138 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002139 p->end_lineno = end_lineno;
2140 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002141 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142}
2143
2144expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002145Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2146 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002147{
2148 expr_ty p;
2149 if (!value) {
2150 PyErr_SetString(PyExc_ValueError,
2151 "field value is required for Await");
2152 return NULL;
2153 }
2154 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2155 if (!p)
2156 return NULL;
2157 p->kind = Await_kind;
2158 p->v.Await.value = value;
2159 p->lineno = lineno;
2160 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002161 p->end_lineno = end_lineno;
2162 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002163 return p;
2164}
2165
2166expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002167Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
2168 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002170 expr_ty p;
2171 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2172 if (!p)
2173 return NULL;
2174 p->kind = Yield_kind;
2175 p->v.Yield.value = value;
2176 p->lineno = lineno;
2177 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002178 p->end_lineno = end_lineno;
2179 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002180 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181}
2182
2183expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002184YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
2185 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05002186{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002187 expr_ty p;
2188 if (!value) {
2189 PyErr_SetString(PyExc_ValueError,
2190 "field value is required for YieldFrom");
2191 return NULL;
2192 }
2193 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2194 if (!p)
2195 return NULL;
2196 p->kind = YieldFrom_kind;
2197 p->v.YieldFrom.value = value;
2198 p->lineno = lineno;
2199 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002200 p->end_lineno = end_lineno;
2201 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002202 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002203}
2204
2205expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002206Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002207 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002209 expr_ty p;
2210 if (!left) {
2211 PyErr_SetString(PyExc_ValueError,
2212 "field left is required for Compare");
2213 return NULL;
2214 }
2215 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2216 if (!p)
2217 return NULL;
2218 p->kind = Compare_kind;
2219 p->v.Compare.left = left;
2220 p->v.Compare.ops = ops;
2221 p->v.Compare.comparators = comparators;
2222 p->lineno = lineno;
2223 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002224 p->end_lineno = end_lineno;
2225 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002226 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227}
2228
2229expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002230Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002231 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002233 expr_ty p;
2234 if (!func) {
2235 PyErr_SetString(PyExc_ValueError,
2236 "field func is required for Call");
2237 return NULL;
2238 }
2239 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2240 if (!p)
2241 return NULL;
2242 p->kind = Call_kind;
2243 p->v.Call.func = func;
2244 p->v.Call.args = args;
2245 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002246 p->lineno = lineno;
2247 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002248 p->end_lineno = end_lineno;
2249 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002250 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251}
2252
2253expr_ty
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04002254FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
2255 int col_offset, int end_lineno, int end_col_offset, PyArena
2256 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002257{
2258 expr_ty p;
2259 if (!value) {
2260 PyErr_SetString(PyExc_ValueError,
2261 "field value is required for FormattedValue");
2262 return NULL;
2263 }
2264 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2265 if (!p)
2266 return NULL;
2267 p->kind = FormattedValue_kind;
2268 p->v.FormattedValue.value = value;
2269 p->v.FormattedValue.conversion = conversion;
2270 p->v.FormattedValue.format_spec = format_spec;
2271 p->lineno = lineno;
2272 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002273 p->end_lineno = end_lineno;
2274 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002275 return p;
2276}
2277
2278expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002279JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int
2280 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002281{
2282 expr_ty p;
2283 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2284 if (!p)
2285 return NULL;
2286 p->kind = JoinedStr_kind;
2287 p->v.JoinedStr.values = values;
2288 p->lineno = lineno;
2289 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002290 p->end_lineno = end_lineno;
2291 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002292 return p;
2293}
2294
2295expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002296Constant(constant value, string kind, int lineno, int col_offset, int
2297 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002298{
2299 expr_ty p;
2300 if (!value) {
2301 PyErr_SetString(PyExc_ValueError,
2302 "field value is required for Constant");
2303 return NULL;
2304 }
2305 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2306 if (!p)
2307 return NULL;
2308 p->kind = Constant_kind;
2309 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002310 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002311 p->lineno = lineno;
2312 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002313 p->end_lineno = end_lineno;
2314 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002315 return p;
2316}
2317
2318expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002319Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002320 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002322 expr_ty p;
2323 if (!value) {
2324 PyErr_SetString(PyExc_ValueError,
2325 "field value is required for Attribute");
2326 return NULL;
2327 }
2328 if (!attr) {
2329 PyErr_SetString(PyExc_ValueError,
2330 "field attr is required for Attribute");
2331 return NULL;
2332 }
2333 if (!ctx) {
2334 PyErr_SetString(PyExc_ValueError,
2335 "field ctx is required for Attribute");
2336 return NULL;
2337 }
2338 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2339 if (!p)
2340 return NULL;
2341 p->kind = Attribute_kind;
2342 p->v.Attribute.value = value;
2343 p->v.Attribute.attr = attr;
2344 p->v.Attribute.ctx = ctx;
2345 p->lineno = lineno;
2346 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002347 p->end_lineno = end_lineno;
2348 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002349 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350}
2351
2352expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002353Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002354 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002356 expr_ty p;
2357 if (!value) {
2358 PyErr_SetString(PyExc_ValueError,
2359 "field value is required for Subscript");
2360 return NULL;
2361 }
2362 if (!slice) {
2363 PyErr_SetString(PyExc_ValueError,
2364 "field slice is required for Subscript");
2365 return NULL;
2366 }
2367 if (!ctx) {
2368 PyErr_SetString(PyExc_ValueError,
2369 "field ctx is required for Subscript");
2370 return NULL;
2371 }
2372 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2373 if (!p)
2374 return NULL;
2375 p->kind = Subscript_kind;
2376 p->v.Subscript.value = value;
2377 p->v.Subscript.slice = slice;
2378 p->v.Subscript.ctx = ctx;
2379 p->lineno = lineno;
2380 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002381 p->end_lineno = end_lineno;
2382 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002383 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384}
2385
2386expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002387Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
2388 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00002389{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002390 expr_ty p;
2391 if (!value) {
2392 PyErr_SetString(PyExc_ValueError,
2393 "field value is required for Starred");
2394 return NULL;
2395 }
2396 if (!ctx) {
2397 PyErr_SetString(PyExc_ValueError,
2398 "field ctx is required for Starred");
2399 return NULL;
2400 }
2401 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2402 if (!p)
2403 return NULL;
2404 p->kind = Starred_kind;
2405 p->v.Starred.value = value;
2406 p->v.Starred.ctx = ctx;
2407 p->lineno = lineno;
2408 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002409 p->end_lineno = end_lineno;
2410 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002411 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002412}
2413
2414expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002415Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
2416 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002418 expr_ty p;
2419 if (!id) {
2420 PyErr_SetString(PyExc_ValueError,
2421 "field id is required for Name");
2422 return NULL;
2423 }
2424 if (!ctx) {
2425 PyErr_SetString(PyExc_ValueError,
2426 "field ctx is required for Name");
2427 return NULL;
2428 }
2429 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2430 if (!p)
2431 return NULL;
2432 p->kind = Name_kind;
2433 p->v.Name.id = id;
2434 p->v.Name.ctx = ctx;
2435 p->lineno = lineno;
2436 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002437 p->end_lineno = end_lineno;
2438 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002439 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440}
2441
2442expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002443List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2444 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002446 expr_ty p;
2447 if (!ctx) {
2448 PyErr_SetString(PyExc_ValueError,
2449 "field ctx is required for List");
2450 return NULL;
2451 }
2452 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2453 if (!p)
2454 return NULL;
2455 p->kind = List_kind;
2456 p->v.List.elts = elts;
2457 p->v.List.ctx = ctx;
2458 p->lineno = lineno;
2459 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002460 p->end_lineno = end_lineno;
2461 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002462 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463}
2464
2465expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002466Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2467 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002469 expr_ty p;
2470 if (!ctx) {
2471 PyErr_SetString(PyExc_ValueError,
2472 "field ctx is required for Tuple");
2473 return NULL;
2474 }
2475 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2476 if (!p)
2477 return NULL;
2478 p->kind = Tuple_kind;
2479 p->v.Tuple.elts = elts;
2480 p->v.Tuple.ctx = ctx;
2481 p->lineno = lineno;
2482 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002483 p->end_lineno = end_lineno;
2484 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002485 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486}
2487
2488slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002489Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002491 slice_ty p;
2492 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2493 if (!p)
2494 return NULL;
2495 p->kind = Slice_kind;
2496 p->v.Slice.lower = lower;
2497 p->v.Slice.upper = upper;
2498 p->v.Slice.step = step;
2499 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500}
2501
2502slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002503ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002505 slice_ty p;
2506 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2507 if (!p)
2508 return NULL;
2509 p->kind = ExtSlice_kind;
2510 p->v.ExtSlice.dims = dims;
2511 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512}
2513
2514slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002515Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002516{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002517 slice_ty p;
2518 if (!value) {
2519 PyErr_SetString(PyExc_ValueError,
2520 "field value is required for Index");
2521 return NULL;
2522 }
2523 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2524 if (!p)
2525 return NULL;
2526 p->kind = Index_kind;
2527 p->v.Index.value = value;
2528 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529}
2530
2531comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002532comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2533 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002535 comprehension_ty p;
2536 if (!target) {
2537 PyErr_SetString(PyExc_ValueError,
2538 "field target is required for comprehension");
2539 return NULL;
2540 }
2541 if (!iter) {
2542 PyErr_SetString(PyExc_ValueError,
2543 "field iter is required for comprehension");
2544 return NULL;
2545 }
2546 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2547 if (!p)
2548 return NULL;
2549 p->target = target;
2550 p->iter = iter;
2551 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002552 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002553 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554}
2555
2556excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002557ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002558 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002560 excepthandler_ty p;
2561 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2562 if (!p)
2563 return NULL;
2564 p->kind = ExceptHandler_kind;
2565 p->v.ExceptHandler.type = type;
2566 p->v.ExceptHandler.name = name;
2567 p->v.ExceptHandler.body = body;
2568 p->lineno = lineno;
2569 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002570 p->end_lineno = end_lineno;
2571 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002572 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573}
2574
2575arguments_ty
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07002576arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty vararg, asdl_seq *
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002577 kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, asdl_seq *
2578 defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002580 arguments_ty p;
2581 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2582 if (!p)
2583 return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002584 p->posonlyargs = posonlyargs;
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07002585 p->args = args;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002586 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002587 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002588 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002589 p->kwarg = kwarg;
2590 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002591 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592}
2593
Neal Norwitzc1505362006-12-28 06:47:50 +00002594arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002595arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
2596 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002597{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002598 arg_ty p;
2599 if (!arg) {
2600 PyErr_SetString(PyExc_ValueError,
2601 "field arg is required for arg");
2602 return NULL;
2603 }
2604 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2605 if (!p)
2606 return NULL;
2607 p->arg = arg;
2608 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002609 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01002610 p->lineno = lineno;
2611 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002612 p->end_lineno = end_lineno;
2613 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002614 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002615}
2616
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002618keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002620 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002621 if (!value) {
2622 PyErr_SetString(PyExc_ValueError,
2623 "field value is required for keyword");
2624 return NULL;
2625 }
2626 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2627 if (!p)
2628 return NULL;
2629 p->arg = arg;
2630 p->value = value;
2631 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632}
2633
2634alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002635alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002637 alias_ty p;
2638 if (!name) {
2639 PyErr_SetString(PyExc_ValueError,
2640 "field name is required for alias");
2641 return NULL;
2642 }
2643 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2644 if (!p)
2645 return NULL;
2646 p->name = name;
2647 p->asname = asname;
2648 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649}
2650
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002651withitem_ty
2652withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2653{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002654 withitem_ty p;
2655 if (!context_expr) {
2656 PyErr_SetString(PyExc_ValueError,
2657 "field context_expr is required for withitem");
2658 return NULL;
2659 }
2660 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2661 if (!p)
2662 return NULL;
2663 p->context_expr = context_expr;
2664 p->optional_vars = optional_vars;
2665 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002666}
2667
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002668type_ignore_ty
Michael J. Sullivan933e1502019-05-22 07:54:20 -07002669TypeIgnore(int lineno, string tag, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002670{
2671 type_ignore_ty p;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07002672 if (!tag) {
2673 PyErr_SetString(PyExc_ValueError,
2674 "field tag is required for TypeIgnore");
2675 return NULL;
2676 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002677 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
2678 if (!p)
2679 return NULL;
2680 p->kind = TypeIgnore_kind;
2681 p->v.TypeIgnore.lineno = lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07002682 p->v.TypeIgnore.tag = tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002683 return p;
2684}
2685
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002686
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002687PyObject*
2688ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002689{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002690 mod_ty o = (mod_ty)_o;
2691 PyObject *result = NULL, *value = NULL;
2692 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002693 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002694 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002695
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002696 switch (o->kind) {
2697 case Module_kind:
2698 result = PyType_GenericNew(Module_type, NULL, NULL);
2699 if (!result) goto failed;
2700 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2701 if (!value) goto failed;
2702 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2703 goto failed;
2704 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002705 value = ast2obj_list(o->v.Module.type_ignores, ast2obj_type_ignore);
2706 if (!value) goto failed;
2707 if (_PyObject_SetAttrId(result, &PyId_type_ignores, value) == -1)
2708 goto failed;
2709 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002710 break;
2711 case Interactive_kind:
2712 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2713 if (!result) goto failed;
2714 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2715 if (!value) goto failed;
2716 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2717 goto failed;
2718 Py_DECREF(value);
2719 break;
2720 case Expression_kind:
2721 result = PyType_GenericNew(Expression_type, NULL, NULL);
2722 if (!result) goto failed;
2723 value = ast2obj_expr(o->v.Expression.body);
2724 if (!value) goto failed;
2725 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2726 goto failed;
2727 Py_DECREF(value);
2728 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002729 case FunctionType_kind:
2730 result = PyType_GenericNew(FunctionType_type, NULL, NULL);
2731 if (!result) goto failed;
2732 value = ast2obj_list(o->v.FunctionType.argtypes, ast2obj_expr);
2733 if (!value) goto failed;
2734 if (_PyObject_SetAttrId(result, &PyId_argtypes, value) == -1)
2735 goto failed;
2736 Py_DECREF(value);
2737 value = ast2obj_expr(o->v.FunctionType.returns);
2738 if (!value) goto failed;
2739 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2740 goto failed;
2741 Py_DECREF(value);
2742 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002743 case Suite_kind:
2744 result = PyType_GenericNew(Suite_type, NULL, NULL);
2745 if (!result) goto failed;
2746 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2747 if (!value) goto failed;
2748 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2749 goto failed;
2750 Py_DECREF(value);
2751 break;
2752 }
2753 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002754failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002755 Py_XDECREF(value);
2756 Py_XDECREF(result);
2757 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758}
2759
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002760PyObject*
2761ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002763 stmt_ty o = (stmt_ty)_o;
2764 PyObject *result = NULL, *value = NULL;
2765 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002766 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002767 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002768
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002769 switch (o->kind) {
2770 case FunctionDef_kind:
2771 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2772 if (!result) goto failed;
2773 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002774 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002775 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2776 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002777 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002778 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002779 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002780 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2781 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002782 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002783 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2784 if (!value) goto failed;
2785 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2786 goto failed;
2787 Py_DECREF(value);
2788 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2789 if (!value) goto failed;
2790 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2791 goto failed;
2792 Py_DECREF(value);
2793 value = ast2obj_expr(o->v.FunctionDef.returns);
2794 if (!value) goto failed;
2795 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2796 goto failed;
2797 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002798 value = ast2obj_string(o->v.FunctionDef.type_comment);
2799 if (!value) goto failed;
2800 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2801 goto failed;
2802 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002803 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002804 case AsyncFunctionDef_kind:
2805 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2806 if (!result) goto failed;
2807 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2808 if (!value) goto failed;
2809 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2810 goto failed;
2811 Py_DECREF(value);
2812 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2813 if (!value) goto failed;
2814 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2815 goto failed;
2816 Py_DECREF(value);
2817 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2818 if (!value) goto failed;
2819 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2820 goto failed;
2821 Py_DECREF(value);
2822 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2823 ast2obj_expr);
2824 if (!value) goto failed;
2825 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2826 goto failed;
2827 Py_DECREF(value);
2828 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2829 if (!value) goto failed;
2830 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2831 goto failed;
2832 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002833 value = ast2obj_string(o->v.AsyncFunctionDef.type_comment);
2834 if (!value) goto failed;
2835 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2836 goto failed;
2837 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002838 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002839 case ClassDef_kind:
2840 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2841 if (!result) goto failed;
2842 value = ast2obj_identifier(o->v.ClassDef.name);
2843 if (!value) goto failed;
2844 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2845 goto failed;
2846 Py_DECREF(value);
2847 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2848 if (!value) goto failed;
2849 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2850 goto failed;
2851 Py_DECREF(value);
2852 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2853 if (!value) goto failed;
2854 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2855 goto failed;
2856 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002857 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2858 if (!value) goto failed;
2859 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2860 goto failed;
2861 Py_DECREF(value);
2862 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2863 if (!value) goto failed;
2864 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2865 goto failed;
2866 Py_DECREF(value);
2867 break;
2868 case Return_kind:
2869 result = PyType_GenericNew(Return_type, NULL, NULL);
2870 if (!result) goto failed;
2871 value = ast2obj_expr(o->v.Return.value);
2872 if (!value) goto failed;
2873 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2874 goto failed;
2875 Py_DECREF(value);
2876 break;
2877 case Delete_kind:
2878 result = PyType_GenericNew(Delete_type, NULL, NULL);
2879 if (!result) goto failed;
2880 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2881 if (!value) goto failed;
2882 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2883 goto failed;
2884 Py_DECREF(value);
2885 break;
2886 case Assign_kind:
2887 result = PyType_GenericNew(Assign_type, NULL, NULL);
2888 if (!result) goto failed;
2889 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2890 if (!value) goto failed;
2891 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2892 goto failed;
2893 Py_DECREF(value);
2894 value = ast2obj_expr(o->v.Assign.value);
2895 if (!value) goto failed;
2896 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2897 goto failed;
2898 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002899 value = ast2obj_string(o->v.Assign.type_comment);
2900 if (!value) goto failed;
2901 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2902 goto failed;
2903 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002904 break;
2905 case AugAssign_kind:
2906 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2907 if (!result) goto failed;
2908 value = ast2obj_expr(o->v.AugAssign.target);
2909 if (!value) goto failed;
2910 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2911 goto failed;
2912 Py_DECREF(value);
2913 value = ast2obj_operator(o->v.AugAssign.op);
2914 if (!value) goto failed;
2915 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2916 goto failed;
2917 Py_DECREF(value);
2918 value = ast2obj_expr(o->v.AugAssign.value);
2919 if (!value) goto failed;
2920 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2921 goto failed;
2922 Py_DECREF(value);
2923 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002924 case AnnAssign_kind:
2925 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2926 if (!result) goto failed;
2927 value = ast2obj_expr(o->v.AnnAssign.target);
2928 if (!value) goto failed;
2929 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2930 goto failed;
2931 Py_DECREF(value);
2932 value = ast2obj_expr(o->v.AnnAssign.annotation);
2933 if (!value) goto failed;
2934 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2935 goto failed;
2936 Py_DECREF(value);
2937 value = ast2obj_expr(o->v.AnnAssign.value);
2938 if (!value) goto failed;
2939 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2940 goto failed;
2941 Py_DECREF(value);
2942 value = ast2obj_int(o->v.AnnAssign.simple);
2943 if (!value) goto failed;
2944 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2945 goto failed;
2946 Py_DECREF(value);
2947 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002948 case For_kind:
2949 result = PyType_GenericNew(For_type, NULL, NULL);
2950 if (!result) goto failed;
2951 value = ast2obj_expr(o->v.For.target);
2952 if (!value) goto failed;
2953 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2954 goto failed;
2955 Py_DECREF(value);
2956 value = ast2obj_expr(o->v.For.iter);
2957 if (!value) goto failed;
2958 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2959 goto failed;
2960 Py_DECREF(value);
2961 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2962 if (!value) goto failed;
2963 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2964 goto failed;
2965 Py_DECREF(value);
2966 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2967 if (!value) goto failed;
2968 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2969 goto failed;
2970 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002971 value = ast2obj_string(o->v.For.type_comment);
2972 if (!value) goto failed;
2973 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2974 goto failed;
2975 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002976 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002977 case AsyncFor_kind:
2978 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2979 if (!result) goto failed;
2980 value = ast2obj_expr(o->v.AsyncFor.target);
2981 if (!value) goto failed;
2982 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2983 goto failed;
2984 Py_DECREF(value);
2985 value = ast2obj_expr(o->v.AsyncFor.iter);
2986 if (!value) goto failed;
2987 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2988 goto failed;
2989 Py_DECREF(value);
2990 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2991 if (!value) goto failed;
2992 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2993 goto failed;
2994 Py_DECREF(value);
2995 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2996 if (!value) goto failed;
2997 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2998 goto failed;
2999 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003000 value = ast2obj_string(o->v.AsyncFor.type_comment);
3001 if (!value) goto failed;
3002 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3003 goto failed;
3004 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003005 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003006 case While_kind:
3007 result = PyType_GenericNew(While_type, NULL, NULL);
3008 if (!result) goto failed;
3009 value = ast2obj_expr(o->v.While.test);
3010 if (!value) goto failed;
3011 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3012 goto failed;
3013 Py_DECREF(value);
3014 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
3015 if (!value) goto failed;
3016 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3017 goto failed;
3018 Py_DECREF(value);
3019 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
3020 if (!value) goto failed;
3021 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3022 goto failed;
3023 Py_DECREF(value);
3024 break;
3025 case If_kind:
3026 result = PyType_GenericNew(If_type, NULL, NULL);
3027 if (!result) goto failed;
3028 value = ast2obj_expr(o->v.If.test);
3029 if (!value) goto failed;
3030 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3031 goto failed;
3032 Py_DECREF(value);
3033 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
3034 if (!value) goto failed;
3035 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3036 goto failed;
3037 Py_DECREF(value);
3038 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
3039 if (!value) goto failed;
3040 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3041 goto failed;
3042 Py_DECREF(value);
3043 break;
3044 case With_kind:
3045 result = PyType_GenericNew(With_type, NULL, NULL);
3046 if (!result) goto failed;
3047 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
3048 if (!value) goto failed;
3049 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3050 goto failed;
3051 Py_DECREF(value);
3052 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
3053 if (!value) goto failed;
3054 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3055 goto failed;
3056 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003057 value = ast2obj_string(o->v.With.type_comment);
3058 if (!value) goto failed;
3059 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3060 goto failed;
3061 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003062 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003063 case AsyncWith_kind:
3064 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
3065 if (!result) goto failed;
3066 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
3067 if (!value) goto failed;
3068 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3069 goto failed;
3070 Py_DECREF(value);
3071 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
3072 if (!value) goto failed;
3073 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3074 goto failed;
3075 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003076 value = ast2obj_string(o->v.AsyncWith.type_comment);
3077 if (!value) goto failed;
3078 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3079 goto failed;
3080 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003081 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003082 case Raise_kind:
3083 result = PyType_GenericNew(Raise_type, NULL, NULL);
3084 if (!result) goto failed;
3085 value = ast2obj_expr(o->v.Raise.exc);
3086 if (!value) goto failed;
3087 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
3088 goto failed;
3089 Py_DECREF(value);
3090 value = ast2obj_expr(o->v.Raise.cause);
3091 if (!value) goto failed;
3092 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
3093 goto failed;
3094 Py_DECREF(value);
3095 break;
3096 case Try_kind:
3097 result = PyType_GenericNew(Try_type, NULL, NULL);
3098 if (!result) goto failed;
3099 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
3100 if (!value) goto failed;
3101 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3102 goto failed;
3103 Py_DECREF(value);
3104 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
3105 if (!value) goto failed;
3106 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
3107 goto failed;
3108 Py_DECREF(value);
3109 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
3110 if (!value) goto failed;
3111 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3112 goto failed;
3113 Py_DECREF(value);
3114 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
3115 if (!value) goto failed;
3116 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
3117 goto failed;
3118 Py_DECREF(value);
3119 break;
3120 case Assert_kind:
3121 result = PyType_GenericNew(Assert_type, NULL, NULL);
3122 if (!result) goto failed;
3123 value = ast2obj_expr(o->v.Assert.test);
3124 if (!value) goto failed;
3125 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3126 goto failed;
3127 Py_DECREF(value);
3128 value = ast2obj_expr(o->v.Assert.msg);
3129 if (!value) goto failed;
3130 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
3131 goto failed;
3132 Py_DECREF(value);
3133 break;
3134 case Import_kind:
3135 result = PyType_GenericNew(Import_type, NULL, NULL);
3136 if (!result) goto failed;
3137 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
3138 if (!value) goto failed;
3139 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3140 goto failed;
3141 Py_DECREF(value);
3142 break;
3143 case ImportFrom_kind:
3144 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
3145 if (!result) goto failed;
3146 value = ast2obj_identifier(o->v.ImportFrom.module);
3147 if (!value) goto failed;
3148 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
3149 goto failed;
3150 Py_DECREF(value);
3151 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
3152 if (!value) goto failed;
3153 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3154 goto failed;
3155 Py_DECREF(value);
3156 value = ast2obj_int(o->v.ImportFrom.level);
3157 if (!value) goto failed;
3158 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
3159 goto failed;
3160 Py_DECREF(value);
3161 break;
3162 case Global_kind:
3163 result = PyType_GenericNew(Global_type, NULL, NULL);
3164 if (!result) goto failed;
3165 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
3166 if (!value) goto failed;
3167 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3168 goto failed;
3169 Py_DECREF(value);
3170 break;
3171 case Nonlocal_kind:
3172 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3173 if (!result) goto failed;
3174 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3175 if (!value) goto failed;
3176 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3177 goto failed;
3178 Py_DECREF(value);
3179 break;
3180 case Expr_kind:
3181 result = PyType_GenericNew(Expr_type, NULL, NULL);
3182 if (!result) goto failed;
3183 value = ast2obj_expr(o->v.Expr.value);
3184 if (!value) goto failed;
3185 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3186 goto failed;
3187 Py_DECREF(value);
3188 break;
3189 case Pass_kind:
3190 result = PyType_GenericNew(Pass_type, NULL, NULL);
3191 if (!result) goto failed;
3192 break;
3193 case Break_kind:
3194 result = PyType_GenericNew(Break_type, NULL, NULL);
3195 if (!result) goto failed;
3196 break;
3197 case Continue_kind:
3198 result = PyType_GenericNew(Continue_type, NULL, NULL);
3199 if (!result) goto failed;
3200 break;
3201 }
3202 value = ast2obj_int(o->lineno);
3203 if (!value) goto failed;
3204 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3205 goto failed;
3206 Py_DECREF(value);
3207 value = ast2obj_int(o->col_offset);
3208 if (!value) goto failed;
3209 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3210 goto failed;
3211 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003212 value = ast2obj_int(o->end_lineno);
3213 if (!value) goto failed;
3214 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3215 goto failed;
3216 Py_DECREF(value);
3217 value = ast2obj_int(o->end_col_offset);
3218 if (!value) goto failed;
3219 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3220 goto failed;
3221 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003222 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003223failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003224 Py_XDECREF(value);
3225 Py_XDECREF(result);
3226 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227}
3228
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003229PyObject*
3230ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003232 expr_ty o = (expr_ty)_o;
3233 PyObject *result = NULL, *value = NULL;
3234 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003235 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003236 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003237
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003238 switch (o->kind) {
3239 case BoolOp_kind:
3240 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3241 if (!result) goto failed;
3242 value = ast2obj_boolop(o->v.BoolOp.op);
3243 if (!value) goto failed;
3244 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3245 goto failed;
3246 Py_DECREF(value);
3247 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3248 if (!value) goto failed;
3249 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3250 goto failed;
3251 Py_DECREF(value);
3252 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003253 case NamedExpr_kind:
3254 result = PyType_GenericNew(NamedExpr_type, NULL, NULL);
3255 if (!result) goto failed;
3256 value = ast2obj_expr(o->v.NamedExpr.target);
3257 if (!value) goto failed;
3258 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3259 goto failed;
3260 Py_DECREF(value);
3261 value = ast2obj_expr(o->v.NamedExpr.value);
3262 if (!value) goto failed;
3263 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3264 goto failed;
3265 Py_DECREF(value);
3266 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003267 case BinOp_kind:
3268 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3269 if (!result) goto failed;
3270 value = ast2obj_expr(o->v.BinOp.left);
3271 if (!value) goto failed;
3272 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3273 goto failed;
3274 Py_DECREF(value);
3275 value = ast2obj_operator(o->v.BinOp.op);
3276 if (!value) goto failed;
3277 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3278 goto failed;
3279 Py_DECREF(value);
3280 value = ast2obj_expr(o->v.BinOp.right);
3281 if (!value) goto failed;
3282 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3283 goto failed;
3284 Py_DECREF(value);
3285 break;
3286 case UnaryOp_kind:
3287 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3288 if (!result) goto failed;
3289 value = ast2obj_unaryop(o->v.UnaryOp.op);
3290 if (!value) goto failed;
3291 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3292 goto failed;
3293 Py_DECREF(value);
3294 value = ast2obj_expr(o->v.UnaryOp.operand);
3295 if (!value) goto failed;
3296 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3297 goto failed;
3298 Py_DECREF(value);
3299 break;
3300 case Lambda_kind:
3301 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3302 if (!result) goto failed;
3303 value = ast2obj_arguments(o->v.Lambda.args);
3304 if (!value) goto failed;
3305 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3306 goto failed;
3307 Py_DECREF(value);
3308 value = ast2obj_expr(o->v.Lambda.body);
3309 if (!value) goto failed;
3310 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3311 goto failed;
3312 Py_DECREF(value);
3313 break;
3314 case IfExp_kind:
3315 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3316 if (!result) goto failed;
3317 value = ast2obj_expr(o->v.IfExp.test);
3318 if (!value) goto failed;
3319 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3320 goto failed;
3321 Py_DECREF(value);
3322 value = ast2obj_expr(o->v.IfExp.body);
3323 if (!value) goto failed;
3324 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3325 goto failed;
3326 Py_DECREF(value);
3327 value = ast2obj_expr(o->v.IfExp.orelse);
3328 if (!value) goto failed;
3329 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3330 goto failed;
3331 Py_DECREF(value);
3332 break;
3333 case Dict_kind:
3334 result = PyType_GenericNew(Dict_type, NULL, NULL);
3335 if (!result) goto failed;
3336 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3337 if (!value) goto failed;
3338 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3339 goto failed;
3340 Py_DECREF(value);
3341 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3342 if (!value) goto failed;
3343 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3344 goto failed;
3345 Py_DECREF(value);
3346 break;
3347 case Set_kind:
3348 result = PyType_GenericNew(Set_type, NULL, NULL);
3349 if (!result) goto failed;
3350 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3351 if (!value) goto failed;
3352 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3353 goto failed;
3354 Py_DECREF(value);
3355 break;
3356 case ListComp_kind:
3357 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3358 if (!result) goto failed;
3359 value = ast2obj_expr(o->v.ListComp.elt);
3360 if (!value) goto failed;
3361 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3362 goto failed;
3363 Py_DECREF(value);
3364 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3365 if (!value) goto failed;
3366 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3367 goto failed;
3368 Py_DECREF(value);
3369 break;
3370 case SetComp_kind:
3371 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3372 if (!result) goto failed;
3373 value = ast2obj_expr(o->v.SetComp.elt);
3374 if (!value) goto failed;
3375 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3376 goto failed;
3377 Py_DECREF(value);
3378 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3379 if (!value) goto failed;
3380 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3381 goto failed;
3382 Py_DECREF(value);
3383 break;
3384 case DictComp_kind:
3385 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3386 if (!result) goto failed;
3387 value = ast2obj_expr(o->v.DictComp.key);
3388 if (!value) goto failed;
3389 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3390 goto failed;
3391 Py_DECREF(value);
3392 value = ast2obj_expr(o->v.DictComp.value);
3393 if (!value) goto failed;
3394 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3395 goto failed;
3396 Py_DECREF(value);
3397 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3398 if (!value) goto failed;
3399 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3400 goto failed;
3401 Py_DECREF(value);
3402 break;
3403 case GeneratorExp_kind:
3404 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3405 if (!result) goto failed;
3406 value = ast2obj_expr(o->v.GeneratorExp.elt);
3407 if (!value) goto failed;
3408 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3409 goto failed;
3410 Py_DECREF(value);
3411 value = ast2obj_list(o->v.GeneratorExp.generators,
3412 ast2obj_comprehension);
3413 if (!value) goto failed;
3414 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3415 goto failed;
3416 Py_DECREF(value);
3417 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003418 case Await_kind:
3419 result = PyType_GenericNew(Await_type, NULL, NULL);
3420 if (!result) goto failed;
3421 value = ast2obj_expr(o->v.Await.value);
3422 if (!value) goto failed;
3423 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3424 goto failed;
3425 Py_DECREF(value);
3426 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003427 case Yield_kind:
3428 result = PyType_GenericNew(Yield_type, NULL, NULL);
3429 if (!result) goto failed;
3430 value = ast2obj_expr(o->v.Yield.value);
3431 if (!value) goto failed;
3432 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3433 goto failed;
3434 Py_DECREF(value);
3435 break;
3436 case YieldFrom_kind:
3437 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3438 if (!result) goto failed;
3439 value = ast2obj_expr(o->v.YieldFrom.value);
3440 if (!value) goto failed;
3441 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3442 goto failed;
3443 Py_DECREF(value);
3444 break;
3445 case Compare_kind:
3446 result = PyType_GenericNew(Compare_type, NULL, NULL);
3447 if (!result) goto failed;
3448 value = ast2obj_expr(o->v.Compare.left);
3449 if (!value) goto failed;
3450 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3451 goto failed;
3452 Py_DECREF(value);
3453 {
3454 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3455 value = PyList_New(n);
3456 if (!value) goto failed;
3457 for(i = 0; i < n; i++)
3458 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003459 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003460 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003461 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3462 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003463 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003464 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003465 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003466 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3467 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003468 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003469 break;
3470 case Call_kind:
3471 result = PyType_GenericNew(Call_type, NULL, NULL);
3472 if (!result) goto failed;
3473 value = ast2obj_expr(o->v.Call.func);
3474 if (!value) goto failed;
3475 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3476 goto failed;
3477 Py_DECREF(value);
3478 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3479 if (!value) goto failed;
3480 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3481 goto failed;
3482 Py_DECREF(value);
3483 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3484 if (!value) goto failed;
3485 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3486 goto failed;
3487 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003488 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003489 case FormattedValue_kind:
3490 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3491 if (!result) goto failed;
3492 value = ast2obj_expr(o->v.FormattedValue.value);
3493 if (!value) goto failed;
3494 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3495 goto failed;
3496 Py_DECREF(value);
3497 value = ast2obj_int(o->v.FormattedValue.conversion);
3498 if (!value) goto failed;
3499 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3500 goto failed;
3501 Py_DECREF(value);
3502 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3503 if (!value) goto failed;
3504 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3505 goto failed;
3506 Py_DECREF(value);
3507 break;
3508 case JoinedStr_kind:
3509 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3510 if (!result) goto failed;
3511 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3512 if (!value) goto failed;
3513 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3514 goto failed;
3515 Py_DECREF(value);
3516 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003517 case Constant_kind:
3518 result = PyType_GenericNew(Constant_type, NULL, NULL);
3519 if (!result) goto failed;
3520 value = ast2obj_constant(o->v.Constant.value);
3521 if (!value) goto failed;
3522 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3523 goto failed;
3524 Py_DECREF(value);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003525 value = ast2obj_string(o->v.Constant.kind);
3526 if (!value) goto failed;
3527 if (_PyObject_SetAttrId(result, &PyId_kind, value) == -1)
3528 goto failed;
3529 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003530 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003531 case Attribute_kind:
3532 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3533 if (!result) goto failed;
3534 value = ast2obj_expr(o->v.Attribute.value);
3535 if (!value) goto failed;
3536 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3537 goto failed;
3538 Py_DECREF(value);
3539 value = ast2obj_identifier(o->v.Attribute.attr);
3540 if (!value) goto failed;
3541 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3542 goto failed;
3543 Py_DECREF(value);
3544 value = ast2obj_expr_context(o->v.Attribute.ctx);
3545 if (!value) goto failed;
3546 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3547 goto failed;
3548 Py_DECREF(value);
3549 break;
3550 case Subscript_kind:
3551 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3552 if (!result) goto failed;
3553 value = ast2obj_expr(o->v.Subscript.value);
3554 if (!value) goto failed;
3555 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3556 goto failed;
3557 Py_DECREF(value);
3558 value = ast2obj_slice(o->v.Subscript.slice);
3559 if (!value) goto failed;
3560 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3561 goto failed;
3562 Py_DECREF(value);
3563 value = ast2obj_expr_context(o->v.Subscript.ctx);
3564 if (!value) goto failed;
3565 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3566 goto failed;
3567 Py_DECREF(value);
3568 break;
3569 case Starred_kind:
3570 result = PyType_GenericNew(Starred_type, NULL, NULL);
3571 if (!result) goto failed;
3572 value = ast2obj_expr(o->v.Starred.value);
3573 if (!value) goto failed;
3574 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3575 goto failed;
3576 Py_DECREF(value);
3577 value = ast2obj_expr_context(o->v.Starred.ctx);
3578 if (!value) goto failed;
3579 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3580 goto failed;
3581 Py_DECREF(value);
3582 break;
3583 case Name_kind:
3584 result = PyType_GenericNew(Name_type, NULL, NULL);
3585 if (!result) goto failed;
3586 value = ast2obj_identifier(o->v.Name.id);
3587 if (!value) goto failed;
3588 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3589 goto failed;
3590 Py_DECREF(value);
3591 value = ast2obj_expr_context(o->v.Name.ctx);
3592 if (!value) goto failed;
3593 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3594 goto failed;
3595 Py_DECREF(value);
3596 break;
3597 case List_kind:
3598 result = PyType_GenericNew(List_type, NULL, NULL);
3599 if (!result) goto failed;
3600 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3601 if (!value) goto failed;
3602 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3603 goto failed;
3604 Py_DECREF(value);
3605 value = ast2obj_expr_context(o->v.List.ctx);
3606 if (!value) goto failed;
3607 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3608 goto failed;
3609 Py_DECREF(value);
3610 break;
3611 case Tuple_kind:
3612 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3613 if (!result) goto failed;
3614 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3615 if (!value) goto failed;
3616 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3617 goto failed;
3618 Py_DECREF(value);
3619 value = ast2obj_expr_context(o->v.Tuple.ctx);
3620 if (!value) goto failed;
3621 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3622 goto failed;
3623 Py_DECREF(value);
3624 break;
3625 }
3626 value = ast2obj_int(o->lineno);
3627 if (!value) goto failed;
3628 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3629 goto failed;
3630 Py_DECREF(value);
3631 value = ast2obj_int(o->col_offset);
3632 if (!value) goto failed;
3633 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3634 goto failed;
3635 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003636 value = ast2obj_int(o->end_lineno);
3637 if (!value) goto failed;
3638 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3639 goto failed;
3640 Py_DECREF(value);
3641 value = ast2obj_int(o->end_col_offset);
3642 if (!value) goto failed;
3643 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3644 goto failed;
3645 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003646 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003647failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003648 Py_XDECREF(value);
3649 Py_XDECREF(result);
3650 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003651}
3652
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003653PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003655 switch(o) {
3656 case Load:
3657 Py_INCREF(Load_singleton);
3658 return Load_singleton;
3659 case Store:
3660 Py_INCREF(Store_singleton);
3661 return Store_singleton;
3662 case Del:
3663 Py_INCREF(Del_singleton);
3664 return Del_singleton;
3665 case AugLoad:
3666 Py_INCREF(AugLoad_singleton);
3667 return AugLoad_singleton;
3668 case AugStore:
3669 Py_INCREF(AugStore_singleton);
3670 return AugStore_singleton;
3671 case Param:
3672 Py_INCREF(Param_singleton);
3673 return Param_singleton;
3674 default:
3675 /* should never happen, but just in case ... */
3676 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3677 return NULL;
3678 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003679}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003680PyObject*
3681ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003683 slice_ty o = (slice_ty)_o;
3684 PyObject *result = NULL, *value = NULL;
3685 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003686 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003687 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003688
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003689 switch (o->kind) {
3690 case Slice_kind:
3691 result = PyType_GenericNew(Slice_type, NULL, NULL);
3692 if (!result) goto failed;
3693 value = ast2obj_expr(o->v.Slice.lower);
3694 if (!value) goto failed;
3695 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3696 goto failed;
3697 Py_DECREF(value);
3698 value = ast2obj_expr(o->v.Slice.upper);
3699 if (!value) goto failed;
3700 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3701 goto failed;
3702 Py_DECREF(value);
3703 value = ast2obj_expr(o->v.Slice.step);
3704 if (!value) goto failed;
3705 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3706 goto failed;
3707 Py_DECREF(value);
3708 break;
3709 case ExtSlice_kind:
3710 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3711 if (!result) goto failed;
3712 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3713 if (!value) goto failed;
3714 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3715 goto failed;
3716 Py_DECREF(value);
3717 break;
3718 case Index_kind:
3719 result = PyType_GenericNew(Index_type, NULL, NULL);
3720 if (!result) goto failed;
3721 value = ast2obj_expr(o->v.Index.value);
3722 if (!value) goto failed;
3723 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3724 goto failed;
3725 Py_DECREF(value);
3726 break;
3727 }
3728 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003729failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003730 Py_XDECREF(value);
3731 Py_XDECREF(result);
3732 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003733}
3734
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003735PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003736{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003737 switch(o) {
3738 case And:
3739 Py_INCREF(And_singleton);
3740 return And_singleton;
3741 case Or:
3742 Py_INCREF(Or_singleton);
3743 return Or_singleton;
3744 default:
3745 /* should never happen, but just in case ... */
3746 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3747 return NULL;
3748 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003749}
3750PyObject* ast2obj_operator(operator_ty o)
3751{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003752 switch(o) {
3753 case Add:
3754 Py_INCREF(Add_singleton);
3755 return Add_singleton;
3756 case Sub:
3757 Py_INCREF(Sub_singleton);
3758 return Sub_singleton;
3759 case Mult:
3760 Py_INCREF(Mult_singleton);
3761 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003762 case MatMult:
3763 Py_INCREF(MatMult_singleton);
3764 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003765 case Div:
3766 Py_INCREF(Div_singleton);
3767 return Div_singleton;
3768 case Mod:
3769 Py_INCREF(Mod_singleton);
3770 return Mod_singleton;
3771 case Pow:
3772 Py_INCREF(Pow_singleton);
3773 return Pow_singleton;
3774 case LShift:
3775 Py_INCREF(LShift_singleton);
3776 return LShift_singleton;
3777 case RShift:
3778 Py_INCREF(RShift_singleton);
3779 return RShift_singleton;
3780 case BitOr:
3781 Py_INCREF(BitOr_singleton);
3782 return BitOr_singleton;
3783 case BitXor:
3784 Py_INCREF(BitXor_singleton);
3785 return BitXor_singleton;
3786 case BitAnd:
3787 Py_INCREF(BitAnd_singleton);
3788 return BitAnd_singleton;
3789 case FloorDiv:
3790 Py_INCREF(FloorDiv_singleton);
3791 return FloorDiv_singleton;
3792 default:
3793 /* should never happen, but just in case ... */
3794 PyErr_Format(PyExc_SystemError, "unknown operator found");
3795 return NULL;
3796 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003797}
3798PyObject* ast2obj_unaryop(unaryop_ty o)
3799{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003800 switch(o) {
3801 case Invert:
3802 Py_INCREF(Invert_singleton);
3803 return Invert_singleton;
3804 case Not:
3805 Py_INCREF(Not_singleton);
3806 return Not_singleton;
3807 case UAdd:
3808 Py_INCREF(UAdd_singleton);
3809 return UAdd_singleton;
3810 case USub:
3811 Py_INCREF(USub_singleton);
3812 return USub_singleton;
3813 default:
3814 /* should never happen, but just in case ... */
3815 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3816 return NULL;
3817 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003818}
3819PyObject* ast2obj_cmpop(cmpop_ty o)
3820{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003821 switch(o) {
3822 case Eq:
3823 Py_INCREF(Eq_singleton);
3824 return Eq_singleton;
3825 case NotEq:
3826 Py_INCREF(NotEq_singleton);
3827 return NotEq_singleton;
3828 case Lt:
3829 Py_INCREF(Lt_singleton);
3830 return Lt_singleton;
3831 case LtE:
3832 Py_INCREF(LtE_singleton);
3833 return LtE_singleton;
3834 case Gt:
3835 Py_INCREF(Gt_singleton);
3836 return Gt_singleton;
3837 case GtE:
3838 Py_INCREF(GtE_singleton);
3839 return GtE_singleton;
3840 case Is:
3841 Py_INCREF(Is_singleton);
3842 return Is_singleton;
3843 case IsNot:
3844 Py_INCREF(IsNot_singleton);
3845 return IsNot_singleton;
3846 case In:
3847 Py_INCREF(In_singleton);
3848 return In_singleton;
3849 case NotIn:
3850 Py_INCREF(NotIn_singleton);
3851 return NotIn_singleton;
3852 default:
3853 /* should never happen, but just in case ... */
3854 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3855 return NULL;
3856 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003857}
3858PyObject*
3859ast2obj_comprehension(void* _o)
3860{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003861 comprehension_ty o = (comprehension_ty)_o;
3862 PyObject *result = NULL, *value = NULL;
3863 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003864 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003865 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003866
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003867 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3868 if (!result) return NULL;
3869 value = ast2obj_expr(o->target);
3870 if (!value) goto failed;
3871 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3872 goto failed;
3873 Py_DECREF(value);
3874 value = ast2obj_expr(o->iter);
3875 if (!value) goto failed;
3876 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3877 goto failed;
3878 Py_DECREF(value);
3879 value = ast2obj_list(o->ifs, ast2obj_expr);
3880 if (!value) goto failed;
3881 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3882 goto failed;
3883 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003884 value = ast2obj_int(o->is_async);
3885 if (!value) goto failed;
3886 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3887 goto failed;
3888 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003889 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003890failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003891 Py_XDECREF(value);
3892 Py_XDECREF(result);
3893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894}
3895
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003896PyObject*
3897ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003898{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003899 excepthandler_ty o = (excepthandler_ty)_o;
3900 PyObject *result = NULL, *value = NULL;
3901 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003902 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003903 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003904
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003905 switch (o->kind) {
3906 case ExceptHandler_kind:
3907 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3908 if (!result) goto failed;
3909 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003910 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003911 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3912 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003913 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003914 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003915 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003916 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3917 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003918 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003919 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3920 if (!value) goto failed;
3921 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3922 goto failed;
3923 Py_DECREF(value);
3924 break;
3925 }
3926 value = ast2obj_int(o->lineno);
3927 if (!value) goto failed;
3928 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3929 goto failed;
3930 Py_DECREF(value);
3931 value = ast2obj_int(o->col_offset);
3932 if (!value) goto failed;
3933 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3934 goto failed;
3935 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003936 value = ast2obj_int(o->end_lineno);
3937 if (!value) goto failed;
3938 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3939 goto failed;
3940 Py_DECREF(value);
3941 value = ast2obj_int(o->end_col_offset);
3942 if (!value) goto failed;
3943 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3944 goto failed;
3945 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003946 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003947failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 Py_XDECREF(value);
3949 Py_XDECREF(result);
3950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003951}
3952
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003953PyObject*
3954ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003955{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003956 arguments_ty o = (arguments_ty)_o;
3957 PyObject *result = NULL, *value = NULL;
3958 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003959 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003960 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003961
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003962 result = PyType_GenericNew(arguments_type, NULL, NULL);
3963 if (!result) return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003964 value = ast2obj_list(o->posonlyargs, ast2obj_arg);
3965 if (!value) goto failed;
3966 if (_PyObject_SetAttrId(result, &PyId_posonlyargs, value) == -1)
3967 goto failed;
3968 Py_DECREF(value);
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07003969 value = ast2obj_list(o->args, ast2obj_arg);
3970 if (!value) goto failed;
3971 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3972 goto failed;
3973 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003974 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003975 if (!value) goto failed;
3976 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3977 goto failed;
3978 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003979 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3980 if (!value) goto failed;
3981 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3982 goto failed;
3983 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003984 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003985 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003986 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003987 goto failed;
3988 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003989 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003990 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003991 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003992 goto failed;
3993 Py_DECREF(value);
3994 value = ast2obj_list(o->defaults, ast2obj_expr);
3995 if (!value) goto failed;
3996 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3997 goto failed;
3998 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003999 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004000failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004001 Py_XDECREF(value);
4002 Py_XDECREF(result);
4003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004004}
4005
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004006PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00004007ast2obj_arg(void* _o)
4008{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004009 arg_ty o = (arg_ty)_o;
4010 PyObject *result = NULL, *value = NULL;
4011 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004012 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004013 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004014
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004015 result = PyType_GenericNew(arg_type, NULL, NULL);
4016 if (!result) return NULL;
4017 value = ast2obj_identifier(o->arg);
4018 if (!value) goto failed;
4019 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4020 goto failed;
4021 Py_DECREF(value);
4022 value = ast2obj_expr(o->annotation);
4023 if (!value) goto failed;
4024 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
4025 goto failed;
4026 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004027 value = ast2obj_string(o->type_comment);
4028 if (!value) goto failed;
4029 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
4030 goto failed;
4031 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004032 value = ast2obj_int(o->lineno);
4033 if (!value) goto failed;
4034 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
4035 goto failed;
4036 Py_DECREF(value);
4037 value = ast2obj_int(o->col_offset);
4038 if (!value) goto failed;
4039 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
4040 goto failed;
4041 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004042 value = ast2obj_int(o->end_lineno);
4043 if (!value) goto failed;
4044 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
4045 goto failed;
4046 Py_DECREF(value);
4047 value = ast2obj_int(o->end_col_offset);
4048 if (!value) goto failed;
4049 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
4050 goto failed;
4051 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004052 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004053failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004054 Py_XDECREF(value);
4055 Py_XDECREF(result);
4056 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004057}
4058
4059PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004060ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004061{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004062 keyword_ty o = (keyword_ty)_o;
4063 PyObject *result = NULL, *value = NULL;
4064 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004065 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004066 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004067
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004068 result = PyType_GenericNew(keyword_type, NULL, NULL);
4069 if (!result) return NULL;
4070 value = ast2obj_identifier(o->arg);
4071 if (!value) goto failed;
4072 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4073 goto failed;
4074 Py_DECREF(value);
4075 value = ast2obj_expr(o->value);
4076 if (!value) goto failed;
4077 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
4078 goto failed;
4079 Py_DECREF(value);
4080 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004081failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 Py_XDECREF(value);
4083 Py_XDECREF(result);
4084 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004085}
4086
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004087PyObject*
4088ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004089{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004090 alias_ty o = (alias_ty)_o;
4091 PyObject *result = NULL, *value = NULL;
4092 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004093 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004094 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004095
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004096 result = PyType_GenericNew(alias_type, NULL, NULL);
4097 if (!result) return NULL;
4098 value = ast2obj_identifier(o->name);
4099 if (!value) goto failed;
4100 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
4101 goto failed;
4102 Py_DECREF(value);
4103 value = ast2obj_identifier(o->asname);
4104 if (!value) goto failed;
4105 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
4106 goto failed;
4107 Py_DECREF(value);
4108 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004109failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004110 Py_XDECREF(value);
4111 Py_XDECREF(result);
4112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004113}
4114
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004115PyObject*
4116ast2obj_withitem(void* _o)
4117{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004118 withitem_ty o = (withitem_ty)_o;
4119 PyObject *result = NULL, *value = NULL;
4120 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004121 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004122 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004123
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004124 result = PyType_GenericNew(withitem_type, NULL, NULL);
4125 if (!result) return NULL;
4126 value = ast2obj_expr(o->context_expr);
4127 if (!value) goto failed;
4128 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
4129 goto failed;
4130 Py_DECREF(value);
4131 value = ast2obj_expr(o->optional_vars);
4132 if (!value) goto failed;
4133 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
4134 goto failed;
4135 Py_DECREF(value);
4136 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004137failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004138 Py_XDECREF(value);
4139 Py_XDECREF(result);
4140 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004141}
4142
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004143PyObject*
4144ast2obj_type_ignore(void* _o)
4145{
4146 type_ignore_ty o = (type_ignore_ty)_o;
4147 PyObject *result = NULL, *value = NULL;
4148 if (!o) {
4149 Py_RETURN_NONE;
4150 }
4151
4152 switch (o->kind) {
4153 case TypeIgnore_kind:
4154 result = PyType_GenericNew(TypeIgnore_type, NULL, NULL);
4155 if (!result) goto failed;
4156 value = ast2obj_int(o->v.TypeIgnore.lineno);
4157 if (!value) goto failed;
4158 if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1)
4159 goto failed;
4160 Py_DECREF(value);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07004161 value = ast2obj_string(o->v.TypeIgnore.tag);
4162 if (!value) goto failed;
4163 if (_PyObject_SetAttrId(result, &PyId_tag, value) == -1)
4164 goto failed;
4165 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004166 break;
4167 }
4168 return result;
4169failed:
4170 Py_XDECREF(value);
4171 Py_XDECREF(result);
4172 return NULL;
4173}
4174
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004175
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004176int
4177obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
4178{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004179 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004180
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004181 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004182
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004183 if (obj == Py_None) {
4184 *out = NULL;
4185 return 0;
4186 }
4187 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
4188 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004189 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004190 }
4191 if (isinstance) {
4192 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004193 asdl_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004194
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004195 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4196 return 1;
4197 }
4198 if (tmp == NULL) {
4199 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4200 return 1;
4201 }
4202 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004203 int res;
4204 Py_ssize_t len;
4205 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004206 if (!PyList_Check(tmp)) {
4207 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4208 goto failed;
4209 }
4210 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004211 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004212 if (body == NULL) goto failed;
4213 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004214 stmt_ty val;
4215 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004216 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004217 if (len != PyList_GET_SIZE(tmp)) {
4218 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
4219 goto failed;
4220 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004221 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004222 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004223 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004224 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004225 if (_PyObject_LookupAttrId(obj, &PyId_type_ignores, &tmp) < 0) {
4226 return 1;
4227 }
4228 if (tmp == NULL) {
4229 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
4230 return 1;
4231 }
4232 else {
4233 int res;
4234 Py_ssize_t len;
4235 Py_ssize_t i;
4236 if (!PyList_Check(tmp)) {
4237 PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4238 goto failed;
4239 }
4240 len = PyList_GET_SIZE(tmp);
4241 type_ignores = _Py_asdl_seq_new(len, arena);
4242 if (type_ignores == NULL) goto failed;
4243 for (i = 0; i < len; i++) {
4244 type_ignore_ty val;
4245 res = obj2ast_type_ignore(PyList_GET_ITEM(tmp, i), &val, arena);
4246 if (res != 0) goto failed;
4247 if (len != PyList_GET_SIZE(tmp)) {
4248 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
4249 goto failed;
4250 }
4251 asdl_seq_SET(type_ignores, i, val);
4252 }
4253 Py_CLEAR(tmp);
4254 }
4255 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004256 if (*out == NULL) goto failed;
4257 return 0;
4258 }
4259 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
4260 if (isinstance == -1) {
4261 return 1;
4262 }
4263 if (isinstance) {
4264 asdl_seq* body;
4265
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004266 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4267 return 1;
4268 }
4269 if (tmp == NULL) {
4270 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4271 return 1;
4272 }
4273 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004274 int res;
4275 Py_ssize_t len;
4276 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004277 if (!PyList_Check(tmp)) {
4278 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4279 goto failed;
4280 }
4281 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004282 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004283 if (body == NULL) goto failed;
4284 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004285 stmt_ty val;
4286 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004287 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004288 if (len != PyList_GET_SIZE(tmp)) {
4289 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4290 goto failed;
4291 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004292 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004293 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004294 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004295 }
4296 *out = Interactive(body, arena);
4297 if (*out == NULL) goto failed;
4298 return 0;
4299 }
4300 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4301 if (isinstance == -1) {
4302 return 1;
4303 }
4304 if (isinstance) {
4305 expr_ty body;
4306
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004307 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4308 return 1;
4309 }
4310 if (tmp == NULL) {
4311 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4312 return 1;
4313 }
4314 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004315 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004316 res = obj2ast_expr(tmp, &body, arena);
4317 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004318 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004319 }
4320 *out = Expression(body, arena);
4321 if (*out == NULL) goto failed;
4322 return 0;
4323 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004324 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionType_type);
4325 if (isinstance == -1) {
4326 return 1;
4327 }
4328 if (isinstance) {
4329 asdl_seq* argtypes;
4330 expr_ty returns;
4331
4332 if (_PyObject_LookupAttrId(obj, &PyId_argtypes, &tmp) < 0) {
4333 return 1;
4334 }
4335 if (tmp == NULL) {
4336 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
4337 return 1;
4338 }
4339 else {
4340 int res;
4341 Py_ssize_t len;
4342 Py_ssize_t i;
4343 if (!PyList_Check(tmp)) {
4344 PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4345 goto failed;
4346 }
4347 len = PyList_GET_SIZE(tmp);
4348 argtypes = _Py_asdl_seq_new(len, arena);
4349 if (argtypes == NULL) goto failed;
4350 for (i = 0; i < len; i++) {
4351 expr_ty val;
4352 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
4353 if (res != 0) goto failed;
4354 if (len != PyList_GET_SIZE(tmp)) {
4355 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
4356 goto failed;
4357 }
4358 asdl_seq_SET(argtypes, i, val);
4359 }
4360 Py_CLEAR(tmp);
4361 }
4362 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
4363 return 1;
4364 }
4365 if (tmp == NULL) {
4366 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
4367 return 1;
4368 }
4369 else {
4370 int res;
4371 res = obj2ast_expr(tmp, &returns, arena);
4372 if (res != 0) goto failed;
4373 Py_CLEAR(tmp);
4374 }
4375 *out = FunctionType(argtypes, returns, arena);
4376 if (*out == NULL) goto failed;
4377 return 0;
4378 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004379 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4380 if (isinstance == -1) {
4381 return 1;
4382 }
4383 if (isinstance) {
4384 asdl_seq* body;
4385
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004386 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4387 return 1;
4388 }
4389 if (tmp == NULL) {
4390 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4391 return 1;
4392 }
4393 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004394 int res;
4395 Py_ssize_t len;
4396 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004397 if (!PyList_Check(tmp)) {
4398 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4399 goto failed;
4400 }
4401 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004402 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004403 if (body == NULL) goto failed;
4404 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004405 stmt_ty val;
4406 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004407 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004408 if (len != PyList_GET_SIZE(tmp)) {
4409 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4410 goto failed;
4411 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004412 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004413 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004414 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004415 }
4416 *out = Suite(body, arena);
4417 if (*out == NULL) goto failed;
4418 return 0;
4419 }
4420
4421 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4422 failed:
4423 Py_XDECREF(tmp);
4424 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004425}
4426
4427int
4428obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4429{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004430 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004431
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004432 PyObject *tmp = NULL;
4433 int lineno;
4434 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004435 int end_lineno;
4436 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004437
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004438 if (obj == Py_None) {
4439 *out = NULL;
4440 return 0;
4441 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004442 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4443 return 1;
4444 }
4445 if (tmp == NULL) {
4446 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4447 return 1;
4448 }
4449 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004450 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004451 res = obj2ast_int(tmp, &lineno, arena);
4452 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004453 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004454 }
4455 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004456 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004457 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004458 if (tmp == NULL) {
4459 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4460 return 1;
4461 }
4462 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004463 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004464 res = obj2ast_int(tmp, &col_offset, arena);
4465 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004466 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004467 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004468 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
4469 return 1;
4470 }
4471 if (tmp == NULL || tmp == Py_None) {
4472 Py_CLEAR(tmp);
4473 end_lineno = 0;
4474 }
4475 else {
4476 int res;
4477 res = obj2ast_int(tmp, &end_lineno, arena);
4478 if (res != 0) goto failed;
4479 Py_CLEAR(tmp);
4480 }
4481 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
4482 return 1;
4483 }
4484 if (tmp == NULL || tmp == Py_None) {
4485 Py_CLEAR(tmp);
4486 end_col_offset = 0;
4487 }
4488 else {
4489 int res;
4490 res = obj2ast_int(tmp, &end_col_offset, arena);
4491 if (res != 0) goto failed;
4492 Py_CLEAR(tmp);
4493 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004494 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4495 if (isinstance == -1) {
4496 return 1;
4497 }
4498 if (isinstance) {
4499 identifier name;
4500 arguments_ty args;
4501 asdl_seq* body;
4502 asdl_seq* decorator_list;
4503 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004504 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004505
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004506 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4507 return 1;
4508 }
4509 if (tmp == NULL) {
4510 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4511 return 1;
4512 }
4513 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004514 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004515 res = obj2ast_identifier(tmp, &name, arena);
4516 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004517 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004518 }
4519 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004520 return 1;
4521 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004522 if (tmp == NULL) {
4523 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4524 return 1;
4525 }
4526 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004527 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004528 res = obj2ast_arguments(tmp, &args, arena);
4529 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004530 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004531 }
4532 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004533 return 1;
4534 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004535 if (tmp == NULL) {
4536 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4537 return 1;
4538 }
4539 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004540 int res;
4541 Py_ssize_t len;
4542 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004543 if (!PyList_Check(tmp)) {
4544 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4545 goto failed;
4546 }
4547 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004548 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004549 if (body == NULL) goto failed;
4550 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004551 stmt_ty val;
4552 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004553 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004554 if (len != PyList_GET_SIZE(tmp)) {
4555 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4556 goto failed;
4557 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004558 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004559 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004560 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004561 }
4562 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004563 return 1;
4564 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004565 if (tmp == NULL) {
4566 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4567 return 1;
4568 }
4569 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004570 int res;
4571 Py_ssize_t len;
4572 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004573 if (!PyList_Check(tmp)) {
4574 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4575 goto failed;
4576 }
4577 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004578 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004579 if (decorator_list == NULL) goto failed;
4580 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004581 expr_ty val;
4582 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004583 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004584 if (len != PyList_GET_SIZE(tmp)) {
4585 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4586 goto failed;
4587 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004588 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004589 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004590 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004591 }
4592 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004593 return 1;
4594 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004595 if (tmp == NULL || tmp == Py_None) {
4596 Py_CLEAR(tmp);
4597 returns = NULL;
4598 }
4599 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004600 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004601 res = obj2ast_expr(tmp, &returns, arena);
4602 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004603 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004604 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004605 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4606 return 1;
4607 }
4608 if (tmp == NULL || tmp == Py_None) {
4609 Py_CLEAR(tmp);
4610 type_comment = NULL;
4611 }
4612 else {
4613 int res;
4614 res = obj2ast_string(tmp, &type_comment, arena);
4615 if (res != 0) goto failed;
4616 Py_CLEAR(tmp);
4617 }
4618 *out = FunctionDef(name, args, body, decorator_list, returns,
4619 type_comment, lineno, col_offset, end_lineno,
4620 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004621 if (*out == NULL) goto failed;
4622 return 0;
4623 }
Yury Selivanov75445082015-05-11 22:57:16 -04004624 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4625 if (isinstance == -1) {
4626 return 1;
4627 }
4628 if (isinstance) {
4629 identifier name;
4630 arguments_ty args;
4631 asdl_seq* body;
4632 asdl_seq* decorator_list;
4633 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004634 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04004635
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004636 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4637 return 1;
4638 }
4639 if (tmp == NULL) {
4640 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4641 return 1;
4642 }
4643 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004644 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004645 res = obj2ast_identifier(tmp, &name, arena);
4646 if (res != 0) goto failed;
4647 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004648 }
4649 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004650 return 1;
4651 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004652 if (tmp == NULL) {
4653 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4654 return 1;
4655 }
4656 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004657 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004658 res = obj2ast_arguments(tmp, &args, arena);
4659 if (res != 0) goto failed;
4660 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004661 }
4662 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004663 return 1;
4664 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004665 if (tmp == NULL) {
4666 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4667 return 1;
4668 }
4669 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004670 int res;
4671 Py_ssize_t len;
4672 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004673 if (!PyList_Check(tmp)) {
4674 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4675 goto failed;
4676 }
4677 len = PyList_GET_SIZE(tmp);
4678 body = _Py_asdl_seq_new(len, arena);
4679 if (body == NULL) goto failed;
4680 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004681 stmt_ty val;
4682 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004683 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004684 if (len != PyList_GET_SIZE(tmp)) {
4685 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4686 goto failed;
4687 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004688 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004689 }
4690 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004691 }
4692 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004693 return 1;
4694 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004695 if (tmp == NULL) {
4696 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4697 return 1;
4698 }
4699 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004700 int res;
4701 Py_ssize_t len;
4702 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004703 if (!PyList_Check(tmp)) {
4704 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4705 goto failed;
4706 }
4707 len = PyList_GET_SIZE(tmp);
4708 decorator_list = _Py_asdl_seq_new(len, arena);
4709 if (decorator_list == NULL) goto failed;
4710 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004711 expr_ty val;
4712 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004713 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004714 if (len != PyList_GET_SIZE(tmp)) {
4715 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4716 goto failed;
4717 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004718 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004719 }
4720 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004721 }
4722 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004723 return 1;
4724 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004725 if (tmp == NULL || tmp == Py_None) {
4726 Py_CLEAR(tmp);
4727 returns = NULL;
4728 }
4729 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004730 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004731 res = obj2ast_expr(tmp, &returns, arena);
4732 if (res != 0) goto failed;
4733 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004734 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004735 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4736 return 1;
4737 }
4738 if (tmp == NULL || tmp == Py_None) {
4739 Py_CLEAR(tmp);
4740 type_comment = NULL;
4741 }
4742 else {
4743 int res;
4744 res = obj2ast_string(tmp, &type_comment, arena);
4745 if (res != 0) goto failed;
4746 Py_CLEAR(tmp);
4747 }
Yury Selivanov75445082015-05-11 22:57:16 -04004748 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004749 type_comment, lineno, col_offset, end_lineno,
4750 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004751 if (*out == NULL) goto failed;
4752 return 0;
4753 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004754 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4755 if (isinstance == -1) {
4756 return 1;
4757 }
4758 if (isinstance) {
4759 identifier name;
4760 asdl_seq* bases;
4761 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004762 asdl_seq* body;
4763 asdl_seq* decorator_list;
4764
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004765 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4766 return 1;
4767 }
4768 if (tmp == NULL) {
4769 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4770 return 1;
4771 }
4772 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004774 res = obj2ast_identifier(tmp, &name, arena);
4775 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004776 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004777 }
4778 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004779 return 1;
4780 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004781 if (tmp == NULL) {
4782 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4783 return 1;
4784 }
4785 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004786 int res;
4787 Py_ssize_t len;
4788 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004789 if (!PyList_Check(tmp)) {
4790 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4791 goto failed;
4792 }
4793 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004794 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004795 if (bases == NULL) goto failed;
4796 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004797 expr_ty val;
4798 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004799 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004800 if (len != PyList_GET_SIZE(tmp)) {
4801 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4802 goto failed;
4803 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004804 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004805 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004806 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004807 }
4808 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004809 return 1;
4810 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004811 if (tmp == NULL) {
4812 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4813 return 1;
4814 }
4815 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004816 int res;
4817 Py_ssize_t len;
4818 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004819 if (!PyList_Check(tmp)) {
4820 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4821 goto failed;
4822 }
4823 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004824 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004825 if (keywords == NULL) goto failed;
4826 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004827 keyword_ty val;
4828 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004829 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004830 if (len != PyList_GET_SIZE(tmp)) {
4831 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4832 goto failed;
4833 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004834 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004835 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004836 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004837 }
4838 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004839 return 1;
4840 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004841 if (tmp == NULL) {
4842 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4843 return 1;
4844 }
4845 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004846 int res;
4847 Py_ssize_t len;
4848 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004849 if (!PyList_Check(tmp)) {
4850 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4851 goto failed;
4852 }
4853 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004854 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004855 if (body == NULL) goto failed;
4856 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004857 stmt_ty val;
4858 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004859 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004860 if (len != PyList_GET_SIZE(tmp)) {
4861 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4862 goto failed;
4863 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004864 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004865 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004866 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004867 }
4868 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004869 return 1;
4870 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004871 if (tmp == NULL) {
4872 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4873 return 1;
4874 }
4875 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004876 int res;
4877 Py_ssize_t len;
4878 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004879 if (!PyList_Check(tmp)) {
4880 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4881 goto failed;
4882 }
4883 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004884 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004885 if (decorator_list == NULL) goto failed;
4886 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004887 expr_ty val;
4888 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004889 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004890 if (len != PyList_GET_SIZE(tmp)) {
4891 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4892 goto failed;
4893 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004894 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004895 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004896 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004897 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004898 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004899 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004900 if (*out == NULL) goto failed;
4901 return 0;
4902 }
4903 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4904 if (isinstance == -1) {
4905 return 1;
4906 }
4907 if (isinstance) {
4908 expr_ty value;
4909
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004910 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4911 return 1;
4912 }
4913 if (tmp == NULL || tmp == Py_None) {
4914 Py_CLEAR(tmp);
4915 value = NULL;
4916 }
4917 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004918 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004919 res = obj2ast_expr(tmp, &value, arena);
4920 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004921 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004922 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004923 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
4924 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004925 if (*out == NULL) goto failed;
4926 return 0;
4927 }
4928 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4929 if (isinstance == -1) {
4930 return 1;
4931 }
4932 if (isinstance) {
4933 asdl_seq* targets;
4934
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004935 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4936 return 1;
4937 }
4938 if (tmp == NULL) {
4939 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4940 return 1;
4941 }
4942 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004943 int res;
4944 Py_ssize_t len;
4945 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004946 if (!PyList_Check(tmp)) {
4947 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4948 goto failed;
4949 }
4950 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004951 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004952 if (targets == NULL) goto failed;
4953 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004954 expr_ty val;
4955 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004956 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004957 if (len != PyList_GET_SIZE(tmp)) {
4958 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4959 goto failed;
4960 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004961 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004962 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004963 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004964 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004965 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
4966 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004967 if (*out == NULL) goto failed;
4968 return 0;
4969 }
4970 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4971 if (isinstance == -1) {
4972 return 1;
4973 }
4974 if (isinstance) {
4975 asdl_seq* targets;
4976 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004977 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004978
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004979 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4980 return 1;
4981 }
4982 if (tmp == NULL) {
4983 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4984 return 1;
4985 }
4986 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004987 int res;
4988 Py_ssize_t len;
4989 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004990 if (!PyList_Check(tmp)) {
4991 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4992 goto failed;
4993 }
4994 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004995 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004996 if (targets == NULL) goto failed;
4997 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004998 expr_ty val;
4999 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005000 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005001 if (len != PyList_GET_SIZE(tmp)) {
5002 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
5003 goto failed;
5004 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005005 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005006 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005007 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005008 }
5009 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005010 return 1;
5011 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005012 if (tmp == NULL) {
5013 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
5014 return 1;
5015 }
5016 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005017 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005018 res = obj2ast_expr(tmp, &value, arena);
5019 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005020 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005021 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005022 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5023 return 1;
5024 }
5025 if (tmp == NULL || tmp == Py_None) {
5026 Py_CLEAR(tmp);
5027 type_comment = NULL;
5028 }
5029 else {
5030 int res;
5031 res = obj2ast_string(tmp, &type_comment, arena);
5032 if (res != 0) goto failed;
5033 Py_CLEAR(tmp);
5034 }
5035 *out = Assign(targets, value, type_comment, lineno, col_offset,
5036 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005037 if (*out == NULL) goto failed;
5038 return 0;
5039 }
5040 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
5041 if (isinstance == -1) {
5042 return 1;
5043 }
5044 if (isinstance) {
5045 expr_ty target;
5046 operator_ty op;
5047 expr_ty value;
5048
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005049 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5050 return 1;
5051 }
5052 if (tmp == NULL) {
5053 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
5054 return 1;
5055 }
5056 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005057 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005058 res = obj2ast_expr(tmp, &target, arena);
5059 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005060 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005061 }
5062 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005063 return 1;
5064 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005065 if (tmp == NULL) {
5066 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
5067 return 1;
5068 }
5069 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005070 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005071 res = obj2ast_operator(tmp, &op, arena);
5072 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005073 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005074 }
5075 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005076 return 1;
5077 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005078 if (tmp == NULL) {
5079 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
5080 return 1;
5081 }
5082 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005083 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005084 res = obj2ast_expr(tmp, &value, arena);
5085 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005086 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005087 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005088 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
5089 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005090 if (*out == NULL) goto failed;
5091 return 0;
5092 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005093 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
5094 if (isinstance == -1) {
5095 return 1;
5096 }
5097 if (isinstance) {
5098 expr_ty target;
5099 expr_ty annotation;
5100 expr_ty value;
5101 int simple;
5102
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005103 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5104 return 1;
5105 }
5106 if (tmp == NULL) {
5107 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
5108 return 1;
5109 }
5110 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005111 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005112 res = obj2ast_expr(tmp, &target, arena);
5113 if (res != 0) goto failed;
5114 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005115 }
5116 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005117 return 1;
5118 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005119 if (tmp == NULL) {
5120 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
5121 return 1;
5122 }
5123 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005124 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005125 res = obj2ast_expr(tmp, &annotation, arena);
5126 if (res != 0) goto failed;
5127 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005128 }
5129 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005130 return 1;
5131 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005132 if (tmp == NULL || tmp == Py_None) {
5133 Py_CLEAR(tmp);
5134 value = NULL;
5135 }
5136 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005137 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005138 res = obj2ast_expr(tmp, &value, arena);
5139 if (res != 0) goto failed;
5140 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005141 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005142 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
5143 return 1;
5144 }
5145 if (tmp == NULL) {
5146 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
5147 return 1;
5148 }
5149 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005150 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005151 res = obj2ast_int(tmp, &simple, arena);
5152 if (res != 0) goto failed;
5153 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005154 }
5155 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005156 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005157 if (*out == NULL) goto failed;
5158 return 0;
5159 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005160 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
5161 if (isinstance == -1) {
5162 return 1;
5163 }
5164 if (isinstance) {
5165 expr_ty target;
5166 expr_ty iter;
5167 asdl_seq* body;
5168 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005169 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005170
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005171 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5172 return 1;
5173 }
5174 if (tmp == NULL) {
5175 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
5176 return 1;
5177 }
5178 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005179 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005180 res = obj2ast_expr(tmp, &target, arena);
5181 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005182 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005183 }
5184 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005185 return 1;
5186 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005187 if (tmp == NULL) {
5188 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
5189 return 1;
5190 }
5191 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005192 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005193 res = obj2ast_expr(tmp, &iter, arena);
5194 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005195 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005196 }
5197 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005198 return 1;
5199 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005200 if (tmp == NULL) {
5201 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
5202 return 1;
5203 }
5204 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005205 int res;
5206 Py_ssize_t len;
5207 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005208 if (!PyList_Check(tmp)) {
5209 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5210 goto failed;
5211 }
5212 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005213 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005214 if (body == NULL) goto failed;
5215 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005216 stmt_ty val;
5217 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005218 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005219 if (len != PyList_GET_SIZE(tmp)) {
5220 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
5221 goto failed;
5222 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005223 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005224 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005225 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005226 }
5227 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005228 return 1;
5229 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005230 if (tmp == NULL) {
5231 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
5232 return 1;
5233 }
5234 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005235 int res;
5236 Py_ssize_t len;
5237 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005238 if (!PyList_Check(tmp)) {
5239 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5240 goto failed;
5241 }
5242 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005243 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005244 if (orelse == NULL) goto failed;
5245 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005246 stmt_ty val;
5247 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005248 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005249 if (len != PyList_GET_SIZE(tmp)) {
5250 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
5251 goto failed;
5252 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005253 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005254 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005255 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005256 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005257 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5258 return 1;
5259 }
5260 if (tmp == NULL || tmp == Py_None) {
5261 Py_CLEAR(tmp);
5262 type_comment = NULL;
5263 }
5264 else {
5265 int res;
5266 res = obj2ast_string(tmp, &type_comment, arena);
5267 if (res != 0) goto failed;
5268 Py_CLEAR(tmp);
5269 }
5270 *out = For(target, iter, body, orelse, type_comment, lineno,
5271 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005272 if (*out == NULL) goto failed;
5273 return 0;
5274 }
Yury Selivanov75445082015-05-11 22:57:16 -04005275 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
5276 if (isinstance == -1) {
5277 return 1;
5278 }
5279 if (isinstance) {
5280 expr_ty target;
5281 expr_ty iter;
5282 asdl_seq* body;
5283 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005284 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005285
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005286 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5287 return 1;
5288 }
5289 if (tmp == NULL) {
5290 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
5291 return 1;
5292 }
5293 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005294 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04005295 res = obj2ast_expr(tmp, &target, arena);
5296 if (res != 0) goto failed;
5297 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005298 }
5299 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005300 return 1;
5301 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005302 if (tmp == NULL) {
5303 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
5304 return 1;
5305 }
5306 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005307 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04005308 res = obj2ast_expr(tmp, &iter, arena);
5309 if (res != 0) goto failed;
5310 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005311 }
5312 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005313 return 1;
5314 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005315 if (tmp == NULL) {
5316 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
5317 return 1;
5318 }
5319 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005320 int res;
5321 Py_ssize_t len;
5322 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005323 if (!PyList_Check(tmp)) {
5324 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5325 goto failed;
5326 }
5327 len = PyList_GET_SIZE(tmp);
5328 body = _Py_asdl_seq_new(len, arena);
5329 if (body == NULL) goto failed;
5330 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005331 stmt_ty val;
5332 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005333 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005334 if (len != PyList_GET_SIZE(tmp)) {
5335 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
5336 goto failed;
5337 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005338 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005339 }
5340 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005341 }
5342 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005343 return 1;
5344 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005345 if (tmp == NULL) {
5346 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
5347 return 1;
5348 }
5349 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005350 int res;
5351 Py_ssize_t len;
5352 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005353 if (!PyList_Check(tmp)) {
5354 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5355 goto failed;
5356 }
5357 len = PyList_GET_SIZE(tmp);
5358 orelse = _Py_asdl_seq_new(len, arena);
5359 if (orelse == NULL) goto failed;
5360 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005361 stmt_ty val;
5362 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005363 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005364 if (len != PyList_GET_SIZE(tmp)) {
5365 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
5366 goto failed;
5367 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005368 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005369 }
5370 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005371 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005372 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5373 return 1;
5374 }
5375 if (tmp == NULL || tmp == Py_None) {
5376 Py_CLEAR(tmp);
5377 type_comment = NULL;
5378 }
5379 else {
5380 int res;
5381 res = obj2ast_string(tmp, &type_comment, arena);
5382 if (res != 0) goto failed;
5383 Py_CLEAR(tmp);
5384 }
5385 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
5386 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005387 if (*out == NULL) goto failed;
5388 return 0;
5389 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005390 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
5391 if (isinstance == -1) {
5392 return 1;
5393 }
5394 if (isinstance) {
5395 expr_ty test;
5396 asdl_seq* body;
5397 asdl_seq* orelse;
5398
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005399 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5400 return 1;
5401 }
5402 if (tmp == NULL) {
5403 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
5404 return 1;
5405 }
5406 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005407 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005408 res = obj2ast_expr(tmp, &test, arena);
5409 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005410 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005411 }
5412 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005413 return 1;
5414 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005415 if (tmp == NULL) {
5416 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
5417 return 1;
5418 }
5419 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005420 int res;
5421 Py_ssize_t len;
5422 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005423 if (!PyList_Check(tmp)) {
5424 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5425 goto failed;
5426 }
5427 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005428 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005429 if (body == NULL) goto failed;
5430 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005431 stmt_ty val;
5432 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005433 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005434 if (len != PyList_GET_SIZE(tmp)) {
5435 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5436 goto failed;
5437 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005438 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005439 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005440 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005441 }
5442 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005443 return 1;
5444 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005445 if (tmp == NULL) {
5446 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5447 return 1;
5448 }
5449 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005450 int res;
5451 Py_ssize_t len;
5452 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005453 if (!PyList_Check(tmp)) {
5454 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5455 goto failed;
5456 }
5457 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005458 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005459 if (orelse == NULL) goto failed;
5460 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005461 stmt_ty val;
5462 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005463 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005464 if (len != PyList_GET_SIZE(tmp)) {
5465 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5466 goto failed;
5467 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005468 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005469 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005470 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005471 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005472 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
5473 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005474 if (*out == NULL) goto failed;
5475 return 0;
5476 }
5477 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5478 if (isinstance == -1) {
5479 return 1;
5480 }
5481 if (isinstance) {
5482 expr_ty test;
5483 asdl_seq* body;
5484 asdl_seq* orelse;
5485
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005486 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5487 return 1;
5488 }
5489 if (tmp == NULL) {
5490 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5491 return 1;
5492 }
5493 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005494 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005495 res = obj2ast_expr(tmp, &test, arena);
5496 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005497 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005498 }
5499 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005500 return 1;
5501 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005502 if (tmp == NULL) {
5503 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5504 return 1;
5505 }
5506 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005507 int res;
5508 Py_ssize_t len;
5509 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005510 if (!PyList_Check(tmp)) {
5511 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5512 goto failed;
5513 }
5514 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005515 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005516 if (body == NULL) goto failed;
5517 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005518 stmt_ty val;
5519 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005520 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005521 if (len != PyList_GET_SIZE(tmp)) {
5522 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5523 goto failed;
5524 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005525 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005526 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005527 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005528 }
5529 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005530 return 1;
5531 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005532 if (tmp == NULL) {
5533 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5534 return 1;
5535 }
5536 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005537 int res;
5538 Py_ssize_t len;
5539 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005540 if (!PyList_Check(tmp)) {
5541 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5542 goto failed;
5543 }
5544 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005545 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005546 if (orelse == NULL) goto failed;
5547 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005548 stmt_ty val;
5549 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005550 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005551 if (len != PyList_GET_SIZE(tmp)) {
5552 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5553 goto failed;
5554 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005555 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005556 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005557 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005558 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005559 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
5560 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005561 if (*out == NULL) goto failed;
5562 return 0;
5563 }
5564 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5565 if (isinstance == -1) {
5566 return 1;
5567 }
5568 if (isinstance) {
5569 asdl_seq* items;
5570 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005571 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005572
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005573 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5574 return 1;
5575 }
5576 if (tmp == NULL) {
5577 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5578 return 1;
5579 }
5580 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005581 int res;
5582 Py_ssize_t len;
5583 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005584 if (!PyList_Check(tmp)) {
5585 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5586 goto failed;
5587 }
5588 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005589 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005590 if (items == NULL) goto failed;
5591 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005592 withitem_ty val;
5593 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005594 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005595 if (len != PyList_GET_SIZE(tmp)) {
5596 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5597 goto failed;
5598 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005599 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005600 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005601 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005602 }
5603 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005604 return 1;
5605 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005606 if (tmp == NULL) {
5607 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5608 return 1;
5609 }
5610 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005611 int res;
5612 Py_ssize_t len;
5613 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005614 if (!PyList_Check(tmp)) {
5615 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5616 goto failed;
5617 }
5618 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005619 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005620 if (body == NULL) goto failed;
5621 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005622 stmt_ty val;
5623 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005624 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005625 if (len != PyList_GET_SIZE(tmp)) {
5626 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5627 goto failed;
5628 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005629 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005630 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005631 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005632 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005633 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5634 return 1;
5635 }
5636 if (tmp == NULL || tmp == Py_None) {
5637 Py_CLEAR(tmp);
5638 type_comment = NULL;
5639 }
5640 else {
5641 int res;
5642 res = obj2ast_string(tmp, &type_comment, arena);
5643 if (res != 0) goto failed;
5644 Py_CLEAR(tmp);
5645 }
5646 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005647 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005648 if (*out == NULL) goto failed;
5649 return 0;
5650 }
Yury Selivanov75445082015-05-11 22:57:16 -04005651 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5652 if (isinstance == -1) {
5653 return 1;
5654 }
5655 if (isinstance) {
5656 asdl_seq* items;
5657 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005658 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005659
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005660 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5661 return 1;
5662 }
5663 if (tmp == NULL) {
5664 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5665 return 1;
5666 }
5667 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005668 int res;
5669 Py_ssize_t len;
5670 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005671 if (!PyList_Check(tmp)) {
5672 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5673 goto failed;
5674 }
5675 len = PyList_GET_SIZE(tmp);
5676 items = _Py_asdl_seq_new(len, arena);
5677 if (items == NULL) goto failed;
5678 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005679 withitem_ty val;
5680 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005681 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005682 if (len != PyList_GET_SIZE(tmp)) {
5683 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5684 goto failed;
5685 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005686 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005687 }
5688 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005689 }
5690 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005691 return 1;
5692 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005693 if (tmp == NULL) {
5694 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5695 return 1;
5696 }
5697 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005698 int res;
5699 Py_ssize_t len;
5700 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005701 if (!PyList_Check(tmp)) {
5702 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5703 goto failed;
5704 }
5705 len = PyList_GET_SIZE(tmp);
5706 body = _Py_asdl_seq_new(len, arena);
5707 if (body == NULL) goto failed;
5708 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005709 stmt_ty val;
5710 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005711 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005712 if (len != PyList_GET_SIZE(tmp)) {
5713 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5714 goto failed;
5715 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005716 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005717 }
5718 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005719 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005720 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5721 return 1;
5722 }
5723 if (tmp == NULL || tmp == Py_None) {
5724 Py_CLEAR(tmp);
5725 type_comment = NULL;
5726 }
5727 else {
5728 int res;
5729 res = obj2ast_string(tmp, &type_comment, arena);
5730 if (res != 0) goto failed;
5731 Py_CLEAR(tmp);
5732 }
5733 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
5734 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005735 if (*out == NULL) goto failed;
5736 return 0;
5737 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005738 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5739 if (isinstance == -1) {
5740 return 1;
5741 }
5742 if (isinstance) {
5743 expr_ty exc;
5744 expr_ty cause;
5745
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005746 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5747 return 1;
5748 }
5749 if (tmp == NULL || tmp == Py_None) {
5750 Py_CLEAR(tmp);
5751 exc = NULL;
5752 }
5753 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005754 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005755 res = obj2ast_expr(tmp, &exc, arena);
5756 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005757 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005758 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005759 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5760 return 1;
5761 }
5762 if (tmp == NULL || tmp == Py_None) {
5763 Py_CLEAR(tmp);
5764 cause = NULL;
5765 }
5766 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005767 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005768 res = obj2ast_expr(tmp, &cause, arena);
5769 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005770 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005771 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005772 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
5773 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005774 if (*out == NULL) goto failed;
5775 return 0;
5776 }
5777 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5778 if (isinstance == -1) {
5779 return 1;
5780 }
5781 if (isinstance) {
5782 asdl_seq* body;
5783 asdl_seq* handlers;
5784 asdl_seq* orelse;
5785 asdl_seq* finalbody;
5786
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005787 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5788 return 1;
5789 }
5790 if (tmp == NULL) {
5791 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5792 return 1;
5793 }
5794 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005795 int res;
5796 Py_ssize_t len;
5797 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005798 if (!PyList_Check(tmp)) {
5799 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5800 goto failed;
5801 }
5802 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005803 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005804 if (body == NULL) goto failed;
5805 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005806 stmt_ty val;
5807 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005808 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005809 if (len != PyList_GET_SIZE(tmp)) {
5810 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5811 goto failed;
5812 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005813 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005814 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005815 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005816 }
5817 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005818 return 1;
5819 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005820 if (tmp == NULL) {
5821 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5822 return 1;
5823 }
5824 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005825 int res;
5826 Py_ssize_t len;
5827 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005828 if (!PyList_Check(tmp)) {
5829 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5830 goto failed;
5831 }
5832 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005833 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005834 if (handlers == NULL) goto failed;
5835 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005836 excepthandler_ty val;
5837 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005838 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005839 if (len != PyList_GET_SIZE(tmp)) {
5840 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5841 goto failed;
5842 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005843 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005844 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005845 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005846 }
5847 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005848 return 1;
5849 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005850 if (tmp == NULL) {
5851 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5852 return 1;
5853 }
5854 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005855 int res;
5856 Py_ssize_t len;
5857 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005858 if (!PyList_Check(tmp)) {
5859 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5860 goto failed;
5861 }
5862 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005863 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005864 if (orelse == NULL) goto failed;
5865 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005866 stmt_ty val;
5867 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005868 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005869 if (len != PyList_GET_SIZE(tmp)) {
5870 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5871 goto failed;
5872 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005873 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005874 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005875 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005876 }
5877 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005878 return 1;
5879 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005880 if (tmp == NULL) {
5881 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5882 return 1;
5883 }
5884 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005885 int res;
5886 Py_ssize_t len;
5887 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005888 if (!PyList_Check(tmp)) {
5889 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5890 goto failed;
5891 }
5892 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005893 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005894 if (finalbody == NULL) goto failed;
5895 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005896 stmt_ty val;
5897 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005898 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005899 if (len != PyList_GET_SIZE(tmp)) {
5900 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5901 goto failed;
5902 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005903 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005904 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005905 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005906 }
5907 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005908 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005909 if (*out == NULL) goto failed;
5910 return 0;
5911 }
5912 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5913 if (isinstance == -1) {
5914 return 1;
5915 }
5916 if (isinstance) {
5917 expr_ty test;
5918 expr_ty msg;
5919
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005920 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5921 return 1;
5922 }
5923 if (tmp == NULL) {
5924 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5925 return 1;
5926 }
5927 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005928 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005929 res = obj2ast_expr(tmp, &test, arena);
5930 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005931 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005932 }
5933 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005934 return 1;
5935 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005936 if (tmp == NULL || tmp == Py_None) {
5937 Py_CLEAR(tmp);
5938 msg = NULL;
5939 }
5940 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005941 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005942 res = obj2ast_expr(tmp, &msg, arena);
5943 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005944 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005945 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005946 *out = Assert(test, msg, lineno, col_offset, end_lineno,
5947 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005948 if (*out == NULL) goto failed;
5949 return 0;
5950 }
5951 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5952 if (isinstance == -1) {
5953 return 1;
5954 }
5955 if (isinstance) {
5956 asdl_seq* names;
5957
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005958 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5959 return 1;
5960 }
5961 if (tmp == NULL) {
5962 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5963 return 1;
5964 }
5965 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005966 int res;
5967 Py_ssize_t len;
5968 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005969 if (!PyList_Check(tmp)) {
5970 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5971 goto failed;
5972 }
5973 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005974 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005975 if (names == NULL) goto failed;
5976 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005977 alias_ty val;
5978 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005979 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005980 if (len != PyList_GET_SIZE(tmp)) {
5981 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5982 goto failed;
5983 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005984 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005985 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005986 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005987 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005988 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
5989 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005990 if (*out == NULL) goto failed;
5991 return 0;
5992 }
5993 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5994 if (isinstance == -1) {
5995 return 1;
5996 }
5997 if (isinstance) {
5998 identifier module;
5999 asdl_seq* names;
6000 int level;
6001
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006002 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
6003 return 1;
6004 }
6005 if (tmp == NULL || tmp == Py_None) {
6006 Py_CLEAR(tmp);
6007 module = NULL;
6008 }
6009 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006010 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006011 res = obj2ast_identifier(tmp, &module, arena);
6012 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006013 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006014 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006015 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6016 return 1;
6017 }
6018 if (tmp == NULL) {
6019 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
6020 return 1;
6021 }
6022 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006023 int res;
6024 Py_ssize_t len;
6025 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006026 if (!PyList_Check(tmp)) {
6027 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6028 goto failed;
6029 }
6030 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006031 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006032 if (names == NULL) goto failed;
6033 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006034 alias_ty val;
6035 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006036 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006037 if (len != PyList_GET_SIZE(tmp)) {
6038 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
6039 goto failed;
6040 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006041 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006042 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006043 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006044 }
6045 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006046 return 1;
6047 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006048 if (tmp == NULL || tmp == Py_None) {
6049 Py_CLEAR(tmp);
6050 level = 0;
6051 }
6052 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006053 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006054 res = obj2ast_int(tmp, &level, arena);
6055 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006056 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006057 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006058 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
6059 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006060 if (*out == NULL) goto failed;
6061 return 0;
6062 }
6063 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
6064 if (isinstance == -1) {
6065 return 1;
6066 }
6067 if (isinstance) {
6068 asdl_seq* names;
6069
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006070 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6071 return 1;
6072 }
6073 if (tmp == NULL) {
6074 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
6075 return 1;
6076 }
6077 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006078 int res;
6079 Py_ssize_t len;
6080 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006081 if (!PyList_Check(tmp)) {
6082 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6083 goto failed;
6084 }
6085 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006086 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006087 if (names == NULL) goto failed;
6088 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006089 identifier val;
6090 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006091 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006092 if (len != PyList_GET_SIZE(tmp)) {
6093 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
6094 goto failed;
6095 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006096 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006097 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006098 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006099 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006100 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
6101 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006102 if (*out == NULL) goto failed;
6103 return 0;
6104 }
6105 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
6106 if (isinstance == -1) {
6107 return 1;
6108 }
6109 if (isinstance) {
6110 asdl_seq* names;
6111
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006112 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6113 return 1;
6114 }
6115 if (tmp == NULL) {
6116 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
6117 return 1;
6118 }
6119 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006120 int res;
6121 Py_ssize_t len;
6122 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006123 if (!PyList_Check(tmp)) {
6124 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6125 goto failed;
6126 }
6127 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006128 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006129 if (names == NULL) goto failed;
6130 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006131 identifier val;
6132 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006133 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006134 if (len != PyList_GET_SIZE(tmp)) {
6135 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
6136 goto failed;
6137 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006138 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006139 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006140 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006141 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006142 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
6143 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006144 if (*out == NULL) goto failed;
6145 return 0;
6146 }
6147 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
6148 if (isinstance == -1) {
6149 return 1;
6150 }
6151 if (isinstance) {
6152 expr_ty value;
6153
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006154 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6155 return 1;
6156 }
6157 if (tmp == NULL) {
6158 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
6159 return 1;
6160 }
6161 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006162 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006163 res = obj2ast_expr(tmp, &value, arena);
6164 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006165 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006166 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006167 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
6168 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006169 if (*out == NULL) goto failed;
6170 return 0;
6171 }
6172 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
6173 if (isinstance == -1) {
6174 return 1;
6175 }
6176 if (isinstance) {
6177
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006178 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006179 if (*out == NULL) goto failed;
6180 return 0;
6181 }
6182 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
6183 if (isinstance == -1) {
6184 return 1;
6185 }
6186 if (isinstance) {
6187
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006188 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006189 if (*out == NULL) goto failed;
6190 return 0;
6191 }
6192 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
6193 if (isinstance == -1) {
6194 return 1;
6195 }
6196 if (isinstance) {
6197
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006198 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006199 if (*out == NULL) goto failed;
6200 return 0;
6201 }
6202
6203 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
6204 failed:
6205 Py_XDECREF(tmp);
6206 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006207}
6208
6209int
6210obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
6211{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006212 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006213
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006214 PyObject *tmp = NULL;
6215 int lineno;
6216 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006217 int end_lineno;
6218 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006219
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006220 if (obj == Py_None) {
6221 *out = NULL;
6222 return 0;
6223 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006224 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
6225 return 1;
6226 }
6227 if (tmp == NULL) {
6228 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
6229 return 1;
6230 }
6231 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006232 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006233 res = obj2ast_int(tmp, &lineno, arena);
6234 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006235 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006236 }
6237 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006238 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006239 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006240 if (tmp == NULL) {
6241 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
6242 return 1;
6243 }
6244 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006245 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006246 res = obj2ast_int(tmp, &col_offset, arena);
6247 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006248 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006249 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006250 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
6251 return 1;
6252 }
6253 if (tmp == NULL || tmp == Py_None) {
6254 Py_CLEAR(tmp);
6255 end_lineno = 0;
6256 }
6257 else {
6258 int res;
6259 res = obj2ast_int(tmp, &end_lineno, arena);
6260 if (res != 0) goto failed;
6261 Py_CLEAR(tmp);
6262 }
6263 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
6264 return 1;
6265 }
6266 if (tmp == NULL || tmp == Py_None) {
6267 Py_CLEAR(tmp);
6268 end_col_offset = 0;
6269 }
6270 else {
6271 int res;
6272 res = obj2ast_int(tmp, &end_col_offset, arena);
6273 if (res != 0) goto failed;
6274 Py_CLEAR(tmp);
6275 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006276 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
6277 if (isinstance == -1) {
6278 return 1;
6279 }
6280 if (isinstance) {
6281 boolop_ty op;
6282 asdl_seq* values;
6283
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006284 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6285 return 1;
6286 }
6287 if (tmp == NULL) {
6288 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
6289 return 1;
6290 }
6291 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006292 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006293 res = obj2ast_boolop(tmp, &op, arena);
6294 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006295 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006296 }
6297 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006298 return 1;
6299 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006300 if (tmp == NULL) {
6301 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
6302 return 1;
6303 }
6304 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006305 int res;
6306 Py_ssize_t len;
6307 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006308 if (!PyList_Check(tmp)) {
6309 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6310 goto failed;
6311 }
6312 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006313 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006314 if (values == NULL) goto failed;
6315 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006316 expr_ty val;
6317 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006318 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006319 if (len != PyList_GET_SIZE(tmp)) {
6320 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
6321 goto failed;
6322 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006323 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006324 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006325 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006326 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006327 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
6328 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006329 if (*out == NULL) goto failed;
6330 return 0;
6331 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07006332 isinstance = PyObject_IsInstance(obj, (PyObject*)NamedExpr_type);
6333 if (isinstance == -1) {
6334 return 1;
6335 }
6336 if (isinstance) {
6337 expr_ty target;
6338 expr_ty value;
6339
6340 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
6341 return 1;
6342 }
6343 if (tmp == NULL) {
6344 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
6345 return 1;
6346 }
6347 else {
6348 int res;
6349 res = obj2ast_expr(tmp, &target, arena);
6350 if (res != 0) goto failed;
6351 Py_CLEAR(tmp);
6352 }
6353 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6354 return 1;
6355 }
6356 if (tmp == NULL) {
6357 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
6358 return 1;
6359 }
6360 else {
6361 int res;
6362 res = obj2ast_expr(tmp, &value, arena);
6363 if (res != 0) goto failed;
6364 Py_CLEAR(tmp);
6365 }
6366 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
6367 end_col_offset, arena);
6368 if (*out == NULL) goto failed;
6369 return 0;
6370 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006371 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
6372 if (isinstance == -1) {
6373 return 1;
6374 }
6375 if (isinstance) {
6376 expr_ty left;
6377 operator_ty op;
6378 expr_ty right;
6379
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006380 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6381 return 1;
6382 }
6383 if (tmp == NULL) {
6384 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
6385 return 1;
6386 }
6387 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006388 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006389 res = obj2ast_expr(tmp, &left, arena);
6390 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006391 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006392 }
6393 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006394 return 1;
6395 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006396 if (tmp == NULL) {
6397 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
6398 return 1;
6399 }
6400 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006401 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006402 res = obj2ast_operator(tmp, &op, arena);
6403 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006404 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006405 }
6406 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006407 return 1;
6408 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006409 if (tmp == NULL) {
6410 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
6411 return 1;
6412 }
6413 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006414 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006415 res = obj2ast_expr(tmp, &right, arena);
6416 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006417 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006418 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006419 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
6420 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006421 if (*out == NULL) goto failed;
6422 return 0;
6423 }
6424 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
6425 if (isinstance == -1) {
6426 return 1;
6427 }
6428 if (isinstance) {
6429 unaryop_ty op;
6430 expr_ty operand;
6431
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006432 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6433 return 1;
6434 }
6435 if (tmp == NULL) {
6436 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
6437 return 1;
6438 }
6439 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006440 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006441 res = obj2ast_unaryop(tmp, &op, arena);
6442 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006443 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006444 }
6445 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006446 return 1;
6447 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006448 if (tmp == NULL) {
6449 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
6450 return 1;
6451 }
6452 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006453 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006454 res = obj2ast_expr(tmp, &operand, arena);
6455 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006456 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006457 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006458 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
6459 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006460 if (*out == NULL) goto failed;
6461 return 0;
6462 }
6463 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
6464 if (isinstance == -1) {
6465 return 1;
6466 }
6467 if (isinstance) {
6468 arguments_ty args;
6469 expr_ty body;
6470
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006471 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
6472 return 1;
6473 }
6474 if (tmp == NULL) {
6475 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
6476 return 1;
6477 }
6478 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006479 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006480 res = obj2ast_arguments(tmp, &args, arena);
6481 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006482 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006483 }
6484 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006485 return 1;
6486 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006487 if (tmp == NULL) {
6488 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
6489 return 1;
6490 }
6491 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006492 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006493 res = obj2ast_expr(tmp, &body, arena);
6494 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006495 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006496 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006497 *out = Lambda(args, body, lineno, col_offset, end_lineno,
6498 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006499 if (*out == NULL) goto failed;
6500 return 0;
6501 }
6502 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
6503 if (isinstance == -1) {
6504 return 1;
6505 }
6506 if (isinstance) {
6507 expr_ty test;
6508 expr_ty body;
6509 expr_ty orelse;
6510
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006511 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
6512 return 1;
6513 }
6514 if (tmp == NULL) {
6515 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
6516 return 1;
6517 }
6518 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006519 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006520 res = obj2ast_expr(tmp, &test, arena);
6521 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006522 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006523 }
6524 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006525 return 1;
6526 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006527 if (tmp == NULL) {
6528 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
6529 return 1;
6530 }
6531 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006532 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006533 res = obj2ast_expr(tmp, &body, arena);
6534 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006535 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006536 }
6537 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006538 return 1;
6539 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006540 if (tmp == NULL) {
6541 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6542 return 1;
6543 }
6544 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006545 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006546 res = obj2ast_expr(tmp, &orelse, arena);
6547 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006548 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006549 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006550 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
6551 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006552 if (*out == NULL) goto failed;
6553 return 0;
6554 }
6555 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6556 if (isinstance == -1) {
6557 return 1;
6558 }
6559 if (isinstance) {
6560 asdl_seq* keys;
6561 asdl_seq* values;
6562
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006563 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6564 return 1;
6565 }
6566 if (tmp == NULL) {
6567 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6568 return 1;
6569 }
6570 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006571 int res;
6572 Py_ssize_t len;
6573 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006574 if (!PyList_Check(tmp)) {
6575 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6576 goto failed;
6577 }
6578 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006579 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006580 if (keys == NULL) goto failed;
6581 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006582 expr_ty val;
6583 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006584 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006585 if (len != PyList_GET_SIZE(tmp)) {
6586 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6587 goto failed;
6588 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006589 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006590 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006591 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006592 }
6593 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006594 return 1;
6595 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006596 if (tmp == NULL) {
6597 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6598 return 1;
6599 }
6600 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006601 int res;
6602 Py_ssize_t len;
6603 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006604 if (!PyList_Check(tmp)) {
6605 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6606 goto failed;
6607 }
6608 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006609 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006610 if (values == NULL) goto failed;
6611 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006612 expr_ty val;
6613 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006614 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006615 if (len != PyList_GET_SIZE(tmp)) {
6616 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6617 goto failed;
6618 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006619 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006620 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006621 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006622 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006623 *out = Dict(keys, values, lineno, col_offset, end_lineno,
6624 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006625 if (*out == NULL) goto failed;
6626 return 0;
6627 }
6628 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6629 if (isinstance == -1) {
6630 return 1;
6631 }
6632 if (isinstance) {
6633 asdl_seq* elts;
6634
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006635 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6636 return 1;
6637 }
6638 if (tmp == NULL) {
6639 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6640 return 1;
6641 }
6642 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006643 int res;
6644 Py_ssize_t len;
6645 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006646 if (!PyList_Check(tmp)) {
6647 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6648 goto failed;
6649 }
6650 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006651 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006652 if (elts == NULL) goto failed;
6653 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006654 expr_ty val;
6655 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006656 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006657 if (len != PyList_GET_SIZE(tmp)) {
6658 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6659 goto failed;
6660 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006661 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006662 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006663 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006664 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006665 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006666 if (*out == NULL) goto failed;
6667 return 0;
6668 }
6669 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6670 if (isinstance == -1) {
6671 return 1;
6672 }
6673 if (isinstance) {
6674 expr_ty elt;
6675 asdl_seq* generators;
6676
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006677 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6678 return 1;
6679 }
6680 if (tmp == NULL) {
6681 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6682 return 1;
6683 }
6684 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006685 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006686 res = obj2ast_expr(tmp, &elt, arena);
6687 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006688 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006689 }
6690 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006691 return 1;
6692 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006693 if (tmp == NULL) {
6694 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6695 return 1;
6696 }
6697 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006698 int res;
6699 Py_ssize_t len;
6700 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006701 if (!PyList_Check(tmp)) {
6702 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6703 goto failed;
6704 }
6705 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006706 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006707 if (generators == NULL) goto failed;
6708 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006709 comprehension_ty val;
6710 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006711 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006712 if (len != PyList_GET_SIZE(tmp)) {
6713 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6714 goto failed;
6715 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006716 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006717 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006718 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006719 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006720 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
6721 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006722 if (*out == NULL) goto failed;
6723 return 0;
6724 }
6725 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6726 if (isinstance == -1) {
6727 return 1;
6728 }
6729 if (isinstance) {
6730 expr_ty elt;
6731 asdl_seq* generators;
6732
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006733 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6734 return 1;
6735 }
6736 if (tmp == NULL) {
6737 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6738 return 1;
6739 }
6740 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006741 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006742 res = obj2ast_expr(tmp, &elt, arena);
6743 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006744 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006745 }
6746 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006747 return 1;
6748 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006749 if (tmp == NULL) {
6750 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6751 return 1;
6752 }
6753 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006754 int res;
6755 Py_ssize_t len;
6756 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006757 if (!PyList_Check(tmp)) {
6758 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6759 goto failed;
6760 }
6761 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006762 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006763 if (generators == NULL) goto failed;
6764 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006765 comprehension_ty val;
6766 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006767 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006768 if (len != PyList_GET_SIZE(tmp)) {
6769 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6770 goto failed;
6771 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006772 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006773 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006774 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006775 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006776 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
6777 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006778 if (*out == NULL) goto failed;
6779 return 0;
6780 }
6781 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6782 if (isinstance == -1) {
6783 return 1;
6784 }
6785 if (isinstance) {
6786 expr_ty key;
6787 expr_ty value;
6788 asdl_seq* generators;
6789
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006790 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6791 return 1;
6792 }
6793 if (tmp == NULL) {
6794 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6795 return 1;
6796 }
6797 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006798 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006799 res = obj2ast_expr(tmp, &key, arena);
6800 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006801 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006802 }
6803 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006804 return 1;
6805 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006806 if (tmp == NULL) {
6807 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6808 return 1;
6809 }
6810 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006811 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006812 res = obj2ast_expr(tmp, &value, arena);
6813 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006814 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006815 }
6816 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006817 return 1;
6818 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006819 if (tmp == NULL) {
6820 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6821 return 1;
6822 }
6823 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006824 int res;
6825 Py_ssize_t len;
6826 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006827 if (!PyList_Check(tmp)) {
6828 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6829 goto failed;
6830 }
6831 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006832 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006833 if (generators == NULL) goto failed;
6834 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006835 comprehension_ty val;
6836 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006837 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006838 if (len != PyList_GET_SIZE(tmp)) {
6839 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6840 goto failed;
6841 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006842 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006843 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006844 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006845 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006846 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
6847 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006848 if (*out == NULL) goto failed;
6849 return 0;
6850 }
6851 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6852 if (isinstance == -1) {
6853 return 1;
6854 }
6855 if (isinstance) {
6856 expr_ty elt;
6857 asdl_seq* generators;
6858
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006859 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6860 return 1;
6861 }
6862 if (tmp == NULL) {
6863 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6864 return 1;
6865 }
6866 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006867 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006868 res = obj2ast_expr(tmp, &elt, arena);
6869 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006870 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006871 }
6872 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006873 return 1;
6874 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006875 if (tmp == NULL) {
6876 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6877 return 1;
6878 }
6879 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006880 int res;
6881 Py_ssize_t len;
6882 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006883 if (!PyList_Check(tmp)) {
6884 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6885 goto failed;
6886 }
6887 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006888 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006889 if (generators == NULL) goto failed;
6890 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006891 comprehension_ty val;
6892 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006893 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006894 if (len != PyList_GET_SIZE(tmp)) {
6895 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6896 goto failed;
6897 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006898 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006899 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006900 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006901 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006902 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
6903 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006904 if (*out == NULL) goto failed;
6905 return 0;
6906 }
Yury Selivanov75445082015-05-11 22:57:16 -04006907 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6908 if (isinstance == -1) {
6909 return 1;
6910 }
6911 if (isinstance) {
6912 expr_ty value;
6913
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006914 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6915 return 1;
6916 }
6917 if (tmp == NULL) {
6918 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6919 return 1;
6920 }
6921 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006922 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006923 res = obj2ast_expr(tmp, &value, arena);
6924 if (res != 0) goto failed;
6925 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006926 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006927 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
6928 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006929 if (*out == NULL) goto failed;
6930 return 0;
6931 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006932 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6933 if (isinstance == -1) {
6934 return 1;
6935 }
6936 if (isinstance) {
6937 expr_ty value;
6938
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006939 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6940 return 1;
6941 }
6942 if (tmp == NULL || tmp == Py_None) {
6943 Py_CLEAR(tmp);
6944 value = NULL;
6945 }
6946 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006947 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006948 res = obj2ast_expr(tmp, &value, arena);
6949 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006950 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006951 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006952 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
6953 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006954 if (*out == NULL) goto failed;
6955 return 0;
6956 }
6957 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6958 if (isinstance == -1) {
6959 return 1;
6960 }
6961 if (isinstance) {
6962 expr_ty value;
6963
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006964 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6965 return 1;
6966 }
6967 if (tmp == NULL) {
6968 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6969 return 1;
6970 }
6971 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006972 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006973 res = obj2ast_expr(tmp, &value, arena);
6974 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006975 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006976 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006977 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
6978 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006979 if (*out == NULL) goto failed;
6980 return 0;
6981 }
6982 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6983 if (isinstance == -1) {
6984 return 1;
6985 }
6986 if (isinstance) {
6987 expr_ty left;
6988 asdl_int_seq* ops;
6989 asdl_seq* comparators;
6990
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006991 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6992 return 1;
6993 }
6994 if (tmp == NULL) {
6995 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6996 return 1;
6997 }
6998 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006999 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007000 res = obj2ast_expr(tmp, &left, arena);
7001 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007002 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007003 }
7004 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007005 return 1;
7006 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007007 if (tmp == NULL) {
7008 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
7009 return 1;
7010 }
7011 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007012 int res;
7013 Py_ssize_t len;
7014 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007015 if (!PyList_Check(tmp)) {
7016 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7017 goto failed;
7018 }
7019 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007020 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007021 if (ops == NULL) goto failed;
7022 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007023 cmpop_ty val;
7024 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007025 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007026 if (len != PyList_GET_SIZE(tmp)) {
7027 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
7028 goto failed;
7029 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007030 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007031 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007032 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007033 }
7034 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007035 return 1;
7036 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007037 if (tmp == NULL) {
7038 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
7039 return 1;
7040 }
7041 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007042 int res;
7043 Py_ssize_t len;
7044 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007045 if (!PyList_Check(tmp)) {
7046 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7047 goto failed;
7048 }
7049 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007050 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007051 if (comparators == NULL) goto failed;
7052 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007053 expr_ty val;
7054 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007055 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007056 if (len != PyList_GET_SIZE(tmp)) {
7057 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
7058 goto failed;
7059 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007060 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007061 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007062 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007063 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007064 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
7065 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007066 if (*out == NULL) goto failed;
7067 return 0;
7068 }
7069 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
7070 if (isinstance == -1) {
7071 return 1;
7072 }
7073 if (isinstance) {
7074 expr_ty func;
7075 asdl_seq* args;
7076 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007077
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007078 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
7079 return 1;
7080 }
7081 if (tmp == NULL) {
7082 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
7083 return 1;
7084 }
7085 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007086 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007087 res = obj2ast_expr(tmp, &func, arena);
7088 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007089 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007090 }
7091 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007092 return 1;
7093 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007094 if (tmp == NULL) {
7095 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
7096 return 1;
7097 }
7098 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007099 int res;
7100 Py_ssize_t len;
7101 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007102 if (!PyList_Check(tmp)) {
7103 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7104 goto failed;
7105 }
7106 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007107 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007108 if (args == NULL) goto failed;
7109 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007110 expr_ty val;
7111 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007112 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007113 if (len != PyList_GET_SIZE(tmp)) {
7114 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
7115 goto failed;
7116 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007117 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007118 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007119 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007120 }
7121 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007122 return 1;
7123 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007124 if (tmp == NULL) {
7125 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
7126 return 1;
7127 }
7128 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007129 int res;
7130 Py_ssize_t len;
7131 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007132 if (!PyList_Check(tmp)) {
7133 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7134 goto failed;
7135 }
7136 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007137 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007138 if (keywords == NULL) goto failed;
7139 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007140 keyword_ty val;
7141 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007142 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007143 if (len != PyList_GET_SIZE(tmp)) {
7144 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
7145 goto failed;
7146 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007147 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007148 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007149 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007150 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007151 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
7152 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007153 if (*out == NULL) goto failed;
7154 return 0;
7155 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04007156 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
7157 if (isinstance == -1) {
7158 return 1;
7159 }
7160 if (isinstance) {
7161 expr_ty value;
7162 int conversion;
7163 expr_ty format_spec;
7164
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007165 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7166 return 1;
7167 }
7168 if (tmp == NULL) {
7169 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
7170 return 1;
7171 }
7172 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007173 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007174 res = obj2ast_expr(tmp, &value, arena);
7175 if (res != 0) goto failed;
7176 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007177 }
7178 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007179 return 1;
7180 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007181 if (tmp == NULL || tmp == Py_None) {
7182 Py_CLEAR(tmp);
7183 conversion = 0;
7184 }
7185 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007186 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007187 res = obj2ast_int(tmp, &conversion, arena);
7188 if (res != 0) goto failed;
7189 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007190 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007191 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
7192 return 1;
7193 }
7194 if (tmp == NULL || tmp == Py_None) {
7195 Py_CLEAR(tmp);
7196 format_spec = NULL;
7197 }
7198 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007199 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007200 res = obj2ast_expr(tmp, &format_spec, arena);
7201 if (res != 0) goto failed;
7202 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007203 }
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04007204 *out = FormattedValue(value, conversion, format_spec, lineno,
7205 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007206 if (*out == NULL) goto failed;
7207 return 0;
7208 }
7209 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
7210 if (isinstance == -1) {
7211 return 1;
7212 }
7213 if (isinstance) {
7214 asdl_seq* values;
7215
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007216 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
7217 return 1;
7218 }
7219 if (tmp == NULL) {
7220 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
7221 return 1;
7222 }
7223 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007224 int res;
7225 Py_ssize_t len;
7226 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007227 if (!PyList_Check(tmp)) {
7228 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7229 goto failed;
7230 }
7231 len = PyList_GET_SIZE(tmp);
7232 values = _Py_asdl_seq_new(len, arena);
7233 if (values == NULL) goto failed;
7234 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007235 expr_ty val;
7236 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007237 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03007238 if (len != PyList_GET_SIZE(tmp)) {
7239 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
7240 goto failed;
7241 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007242 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007243 }
7244 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007245 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007246 *out = JoinedStr(values, lineno, col_offset, end_lineno,
7247 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007248 if (*out == NULL) goto failed;
7249 return 0;
7250 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007251 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
7252 if (isinstance == -1) {
7253 return 1;
7254 }
7255 if (isinstance) {
7256 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007257 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007258
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007259 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7260 return 1;
7261 }
7262 if (tmp == NULL) {
7263 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
7264 return 1;
7265 }
7266 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007267 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007268 res = obj2ast_constant(tmp, &value, arena);
7269 if (res != 0) goto failed;
7270 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007271 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007272 if (_PyObject_LookupAttrId(obj, &PyId_kind, &tmp) < 0) {
7273 return 1;
7274 }
7275 if (tmp == NULL || tmp == Py_None) {
7276 Py_CLEAR(tmp);
7277 kind = NULL;
7278 }
7279 else {
7280 int res;
7281 res = obj2ast_string(tmp, &kind, arena);
7282 if (res != 0) goto failed;
7283 Py_CLEAR(tmp);
7284 }
7285 *out = Constant(value, kind, lineno, col_offset, end_lineno,
7286 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007287 if (*out == NULL) goto failed;
7288 return 0;
7289 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007290 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
7291 if (isinstance == -1) {
7292 return 1;
7293 }
7294 if (isinstance) {
7295 expr_ty value;
7296 identifier attr;
7297 expr_context_ty ctx;
7298
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007299 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7300 return 1;
7301 }
7302 if (tmp == NULL) {
7303 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
7304 return 1;
7305 }
7306 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007307 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007308 res = obj2ast_expr(tmp, &value, arena);
7309 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007310 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007311 }
7312 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007313 return 1;
7314 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007315 if (tmp == NULL) {
7316 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
7317 return 1;
7318 }
7319 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007320 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007321 res = obj2ast_identifier(tmp, &attr, arena);
7322 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007323 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007324 }
7325 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007326 return 1;
7327 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007328 if (tmp == NULL) {
7329 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
7330 return 1;
7331 }
7332 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007333 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007334 res = obj2ast_expr_context(tmp, &ctx, arena);
7335 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007336 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007337 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007338 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
7339 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007340 if (*out == NULL) goto failed;
7341 return 0;
7342 }
7343 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
7344 if (isinstance == -1) {
7345 return 1;
7346 }
7347 if (isinstance) {
7348 expr_ty value;
7349 slice_ty slice;
7350 expr_context_ty ctx;
7351
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007352 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7353 return 1;
7354 }
7355 if (tmp == NULL) {
7356 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
7357 return 1;
7358 }
7359 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007360 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007361 res = obj2ast_expr(tmp, &value, arena);
7362 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007363 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007364 }
7365 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007366 return 1;
7367 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007368 if (tmp == NULL) {
7369 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
7370 return 1;
7371 }
7372 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007373 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007374 res = obj2ast_slice(tmp, &slice, arena);
7375 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007376 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007377 }
7378 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007379 return 1;
7380 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007381 if (tmp == NULL) {
7382 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
7383 return 1;
7384 }
7385 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007386 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007387 res = obj2ast_expr_context(tmp, &ctx, arena);
7388 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007389 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007390 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007391 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
7392 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007393 if (*out == NULL) goto failed;
7394 return 0;
7395 }
7396 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
7397 if (isinstance == -1) {
7398 return 1;
7399 }
7400 if (isinstance) {
7401 expr_ty value;
7402 expr_context_ty ctx;
7403
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007404 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7405 return 1;
7406 }
7407 if (tmp == NULL) {
7408 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
7409 return 1;
7410 }
7411 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007412 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007413 res = obj2ast_expr(tmp, &value, arena);
7414 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007415 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007416 }
7417 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007418 return 1;
7419 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007420 if (tmp == NULL) {
7421 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
7422 return 1;
7423 }
7424 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007425 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007426 res = obj2ast_expr_context(tmp, &ctx, arena);
7427 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007428 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007429 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007430 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
7431 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007432 if (*out == NULL) goto failed;
7433 return 0;
7434 }
7435 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
7436 if (isinstance == -1) {
7437 return 1;
7438 }
7439 if (isinstance) {
7440 identifier id;
7441 expr_context_ty ctx;
7442
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007443 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
7444 return 1;
7445 }
7446 if (tmp == NULL) {
7447 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
7448 return 1;
7449 }
7450 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007451 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007452 res = obj2ast_identifier(tmp, &id, arena);
7453 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007454 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007455 }
7456 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007457 return 1;
7458 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007459 if (tmp == NULL) {
7460 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
7461 return 1;
7462 }
7463 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007464 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007465 res = obj2ast_expr_context(tmp, &ctx, arena);
7466 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007467 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007468 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007469 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
7470 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007471 if (*out == NULL) goto failed;
7472 return 0;
7473 }
7474 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7475 if (isinstance == -1) {
7476 return 1;
7477 }
7478 if (isinstance) {
7479 asdl_seq* elts;
7480 expr_context_ty ctx;
7481
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007482 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7483 return 1;
7484 }
7485 if (tmp == NULL) {
7486 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7487 return 1;
7488 }
7489 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007490 int res;
7491 Py_ssize_t len;
7492 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007493 if (!PyList_Check(tmp)) {
7494 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7495 goto failed;
7496 }
7497 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007498 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007499 if (elts == NULL) goto failed;
7500 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007501 expr_ty val;
7502 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007503 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007504 if (len != PyList_GET_SIZE(tmp)) {
7505 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7506 goto failed;
7507 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007508 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007509 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007510 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007511 }
7512 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007513 return 1;
7514 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007515 if (tmp == NULL) {
7516 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7517 return 1;
7518 }
7519 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007520 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007521 res = obj2ast_expr_context(tmp, &ctx, arena);
7522 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007523 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007524 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007525 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7526 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007527 if (*out == NULL) goto failed;
7528 return 0;
7529 }
7530 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7531 if (isinstance == -1) {
7532 return 1;
7533 }
7534 if (isinstance) {
7535 asdl_seq* elts;
7536 expr_context_ty ctx;
7537
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007538 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7539 return 1;
7540 }
7541 if (tmp == NULL) {
7542 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7543 return 1;
7544 }
7545 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007546 int res;
7547 Py_ssize_t len;
7548 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007549 if (!PyList_Check(tmp)) {
7550 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7551 goto failed;
7552 }
7553 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007554 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007555 if (elts == NULL) goto failed;
7556 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007557 expr_ty val;
7558 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007559 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007560 if (len != PyList_GET_SIZE(tmp)) {
7561 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7562 goto failed;
7563 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007564 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007565 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007566 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007567 }
7568 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007569 return 1;
7570 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007571 if (tmp == NULL) {
7572 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7573 return 1;
7574 }
7575 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007576 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007577 res = obj2ast_expr_context(tmp, &ctx, arena);
7578 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007579 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007580 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007581 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7582 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007583 if (*out == NULL) goto failed;
7584 return 0;
7585 }
7586
7587 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7588 failed:
7589 Py_XDECREF(tmp);
7590 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007591}
7592
7593int
7594obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7595{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007596 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007597
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007598 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7599 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007600 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007601 }
7602 if (isinstance) {
7603 *out = Load;
7604 return 0;
7605 }
7606 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7607 if (isinstance == -1) {
7608 return 1;
7609 }
7610 if (isinstance) {
7611 *out = Store;
7612 return 0;
7613 }
7614 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7615 if (isinstance == -1) {
7616 return 1;
7617 }
7618 if (isinstance) {
7619 *out = Del;
7620 return 0;
7621 }
7622 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7623 if (isinstance == -1) {
7624 return 1;
7625 }
7626 if (isinstance) {
7627 *out = AugLoad;
7628 return 0;
7629 }
7630 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7631 if (isinstance == -1) {
7632 return 1;
7633 }
7634 if (isinstance) {
7635 *out = AugStore;
7636 return 0;
7637 }
7638 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7639 if (isinstance == -1) {
7640 return 1;
7641 }
7642 if (isinstance) {
7643 *out = Param;
7644 return 0;
7645 }
7646
7647 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7648 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007649}
7650
7651int
7652obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7653{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007654 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007655
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007656 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007657
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007658 if (obj == Py_None) {
7659 *out = NULL;
7660 return 0;
7661 }
7662 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7663 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007664 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007665 }
7666 if (isinstance) {
7667 expr_ty lower;
7668 expr_ty upper;
7669 expr_ty step;
7670
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007671 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7672 return 1;
7673 }
7674 if (tmp == NULL || tmp == Py_None) {
7675 Py_CLEAR(tmp);
7676 lower = NULL;
7677 }
7678 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007679 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007680 res = obj2ast_expr(tmp, &lower, arena);
7681 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007682 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007683 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007684 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7685 return 1;
7686 }
7687 if (tmp == NULL || tmp == Py_None) {
7688 Py_CLEAR(tmp);
7689 upper = NULL;
7690 }
7691 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007692 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007693 res = obj2ast_expr(tmp, &upper, arena);
7694 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007695 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007696 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007697 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
7698 return 1;
7699 }
7700 if (tmp == NULL || tmp == Py_None) {
7701 Py_CLEAR(tmp);
7702 step = NULL;
7703 }
7704 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007705 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007706 res = obj2ast_expr(tmp, &step, arena);
7707 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007708 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007709 }
7710 *out = Slice(lower, upper, step, arena);
7711 if (*out == NULL) goto failed;
7712 return 0;
7713 }
7714 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7715 if (isinstance == -1) {
7716 return 1;
7717 }
7718 if (isinstance) {
7719 asdl_seq* dims;
7720
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007721 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7722 return 1;
7723 }
7724 if (tmp == NULL) {
7725 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7726 return 1;
7727 }
7728 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007729 int res;
7730 Py_ssize_t len;
7731 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007732 if (!PyList_Check(tmp)) {
7733 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7734 goto failed;
7735 }
7736 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007737 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007738 if (dims == NULL) goto failed;
7739 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007740 slice_ty val;
7741 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007742 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007743 if (len != PyList_GET_SIZE(tmp)) {
7744 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7745 goto failed;
7746 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007747 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007748 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007749 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007750 }
7751 *out = ExtSlice(dims, arena);
7752 if (*out == NULL) goto failed;
7753 return 0;
7754 }
7755 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7756 if (isinstance == -1) {
7757 return 1;
7758 }
7759 if (isinstance) {
7760 expr_ty value;
7761
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007762 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7763 return 1;
7764 }
7765 if (tmp == NULL) {
7766 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7767 return 1;
7768 }
7769 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007770 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007771 res = obj2ast_expr(tmp, &value, arena);
7772 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007773 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007774 }
7775 *out = Index(value, arena);
7776 if (*out == NULL) goto failed;
7777 return 0;
7778 }
7779
7780 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7781 failed:
7782 Py_XDECREF(tmp);
7783 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007784}
7785
7786int
7787obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7788{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007789 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007790
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007791 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7792 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007793 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007794 }
7795 if (isinstance) {
7796 *out = And;
7797 return 0;
7798 }
7799 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7800 if (isinstance == -1) {
7801 return 1;
7802 }
7803 if (isinstance) {
7804 *out = Or;
7805 return 0;
7806 }
7807
7808 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7809 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007810}
7811
7812int
7813obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7814{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007815 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007816
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007817 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7818 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007819 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007820 }
7821 if (isinstance) {
7822 *out = Add;
7823 return 0;
7824 }
7825 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7826 if (isinstance == -1) {
7827 return 1;
7828 }
7829 if (isinstance) {
7830 *out = Sub;
7831 return 0;
7832 }
7833 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7834 if (isinstance == -1) {
7835 return 1;
7836 }
7837 if (isinstance) {
7838 *out = Mult;
7839 return 0;
7840 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007841 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7842 if (isinstance == -1) {
7843 return 1;
7844 }
7845 if (isinstance) {
7846 *out = MatMult;
7847 return 0;
7848 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007849 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7850 if (isinstance == -1) {
7851 return 1;
7852 }
7853 if (isinstance) {
7854 *out = Div;
7855 return 0;
7856 }
7857 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7858 if (isinstance == -1) {
7859 return 1;
7860 }
7861 if (isinstance) {
7862 *out = Mod;
7863 return 0;
7864 }
7865 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7866 if (isinstance == -1) {
7867 return 1;
7868 }
7869 if (isinstance) {
7870 *out = Pow;
7871 return 0;
7872 }
7873 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7874 if (isinstance == -1) {
7875 return 1;
7876 }
7877 if (isinstance) {
7878 *out = LShift;
7879 return 0;
7880 }
7881 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7882 if (isinstance == -1) {
7883 return 1;
7884 }
7885 if (isinstance) {
7886 *out = RShift;
7887 return 0;
7888 }
7889 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7890 if (isinstance == -1) {
7891 return 1;
7892 }
7893 if (isinstance) {
7894 *out = BitOr;
7895 return 0;
7896 }
7897 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7898 if (isinstance == -1) {
7899 return 1;
7900 }
7901 if (isinstance) {
7902 *out = BitXor;
7903 return 0;
7904 }
7905 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7906 if (isinstance == -1) {
7907 return 1;
7908 }
7909 if (isinstance) {
7910 *out = BitAnd;
7911 return 0;
7912 }
7913 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7914 if (isinstance == -1) {
7915 return 1;
7916 }
7917 if (isinstance) {
7918 *out = FloorDiv;
7919 return 0;
7920 }
7921
7922 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7923 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007924}
7925
7926int
7927obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7928{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007929 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007930
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007931 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7932 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007933 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007934 }
7935 if (isinstance) {
7936 *out = Invert;
7937 return 0;
7938 }
7939 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7940 if (isinstance == -1) {
7941 return 1;
7942 }
7943 if (isinstance) {
7944 *out = Not;
7945 return 0;
7946 }
7947 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7948 if (isinstance == -1) {
7949 return 1;
7950 }
7951 if (isinstance) {
7952 *out = UAdd;
7953 return 0;
7954 }
7955 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7956 if (isinstance == -1) {
7957 return 1;
7958 }
7959 if (isinstance) {
7960 *out = USub;
7961 return 0;
7962 }
7963
7964 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7965 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007966}
7967
7968int
7969obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7970{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007971 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007972
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007973 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7974 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007975 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007976 }
7977 if (isinstance) {
7978 *out = Eq;
7979 return 0;
7980 }
7981 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7982 if (isinstance == -1) {
7983 return 1;
7984 }
7985 if (isinstance) {
7986 *out = NotEq;
7987 return 0;
7988 }
7989 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7990 if (isinstance == -1) {
7991 return 1;
7992 }
7993 if (isinstance) {
7994 *out = Lt;
7995 return 0;
7996 }
7997 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7998 if (isinstance == -1) {
7999 return 1;
8000 }
8001 if (isinstance) {
8002 *out = LtE;
8003 return 0;
8004 }
8005 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
8006 if (isinstance == -1) {
8007 return 1;
8008 }
8009 if (isinstance) {
8010 *out = Gt;
8011 return 0;
8012 }
8013 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
8014 if (isinstance == -1) {
8015 return 1;
8016 }
8017 if (isinstance) {
8018 *out = GtE;
8019 return 0;
8020 }
8021 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
8022 if (isinstance == -1) {
8023 return 1;
8024 }
8025 if (isinstance) {
8026 *out = Is;
8027 return 0;
8028 }
8029 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
8030 if (isinstance == -1) {
8031 return 1;
8032 }
8033 if (isinstance) {
8034 *out = IsNot;
8035 return 0;
8036 }
8037 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
8038 if (isinstance == -1) {
8039 return 1;
8040 }
8041 if (isinstance) {
8042 *out = In;
8043 return 0;
8044 }
8045 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
8046 if (isinstance == -1) {
8047 return 1;
8048 }
8049 if (isinstance) {
8050 *out = NotIn;
8051 return 0;
8052 }
8053
8054 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
8055 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008056}
8057
8058int
8059obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
8060{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008061 PyObject* tmp = NULL;
8062 expr_ty target;
8063 expr_ty iter;
8064 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008065 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008066
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008067 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
8068 return 1;
8069 }
8070 if (tmp == NULL) {
8071 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
8072 return 1;
8073 }
8074 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008075 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008076 res = obj2ast_expr(tmp, &target, arena);
8077 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008078 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008079 }
8080 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008081 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008082 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008083 if (tmp == NULL) {
8084 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
8085 return 1;
8086 }
8087 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008088 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008089 res = obj2ast_expr(tmp, &iter, arena);
8090 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008091 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008092 }
8093 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008094 return 1;
8095 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008096 if (tmp == NULL) {
8097 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
8098 return 1;
8099 }
8100 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008101 int res;
8102 Py_ssize_t len;
8103 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008104 if (!PyList_Check(tmp)) {
8105 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8106 goto failed;
8107 }
8108 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008109 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008110 if (ifs == NULL) goto failed;
8111 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008112 expr_ty val;
8113 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008114 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008115 if (len != PyList_GET_SIZE(tmp)) {
8116 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
8117 goto failed;
8118 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008119 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008120 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008121 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008122 }
8123 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008124 return 1;
8125 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008126 if (tmp == NULL) {
8127 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
8128 return 1;
8129 }
8130 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008131 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008132 res = obj2ast_int(tmp, &is_async, arena);
8133 if (res != 0) goto failed;
8134 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008135 }
8136 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008137 return 0;
8138failed:
8139 Py_XDECREF(tmp);
8140 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008141}
8142
8143int
8144obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
8145{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008146 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00008147
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008148 PyObject *tmp = NULL;
8149 int lineno;
8150 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008151 int end_lineno;
8152 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008153
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008154 if (obj == Py_None) {
8155 *out = NULL;
8156 return 0;
8157 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008158 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8159 return 1;
8160 }
8161 if (tmp == NULL) {
8162 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
8163 return 1;
8164 }
8165 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008166 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008167 res = obj2ast_int(tmp, &lineno, arena);
8168 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008169 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008170 }
8171 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008172 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008173 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008174 if (tmp == NULL) {
8175 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
8176 return 1;
8177 }
8178 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008179 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008180 res = obj2ast_int(tmp, &col_offset, arena);
8181 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008182 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008183 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008184 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8185 return 1;
8186 }
8187 if (tmp == NULL || tmp == Py_None) {
8188 Py_CLEAR(tmp);
8189 end_lineno = 0;
8190 }
8191 else {
8192 int res;
8193 res = obj2ast_int(tmp, &end_lineno, arena);
8194 if (res != 0) goto failed;
8195 Py_CLEAR(tmp);
8196 }
8197 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8198 return 1;
8199 }
8200 if (tmp == NULL || tmp == Py_None) {
8201 Py_CLEAR(tmp);
8202 end_col_offset = 0;
8203 }
8204 else {
8205 int res;
8206 res = obj2ast_int(tmp, &end_col_offset, arena);
8207 if (res != 0) goto failed;
8208 Py_CLEAR(tmp);
8209 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008210 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
8211 if (isinstance == -1) {
8212 return 1;
8213 }
8214 if (isinstance) {
8215 expr_ty type;
8216 identifier name;
8217 asdl_seq* body;
8218
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008219 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
8220 return 1;
8221 }
8222 if (tmp == NULL || tmp == Py_None) {
8223 Py_CLEAR(tmp);
8224 type = NULL;
8225 }
8226 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008227 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008228 res = obj2ast_expr(tmp, &type, arena);
8229 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008230 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008231 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008232 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8233 return 1;
8234 }
8235 if (tmp == NULL || tmp == Py_None) {
8236 Py_CLEAR(tmp);
8237 name = NULL;
8238 }
8239 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008240 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008241 res = obj2ast_identifier(tmp, &name, arena);
8242 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008243 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008244 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008245 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
8246 return 1;
8247 }
8248 if (tmp == NULL) {
8249 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
8250 return 1;
8251 }
8252 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008253 int res;
8254 Py_ssize_t len;
8255 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008256 if (!PyList_Check(tmp)) {
8257 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8258 goto failed;
8259 }
8260 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008261 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008262 if (body == NULL) goto failed;
8263 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008264 stmt_ty val;
8265 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008266 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008267 if (len != PyList_GET_SIZE(tmp)) {
8268 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
8269 goto failed;
8270 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008271 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008272 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008273 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008274 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008275 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
8276 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008277 if (*out == NULL) goto failed;
8278 return 0;
8279 }
8280
8281 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
8282 failed:
8283 Py_XDECREF(tmp);
8284 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008285}
8286
8287int
8288obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
8289{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008290 PyObject* tmp = NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008291 asdl_seq* posonlyargs;
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07008292 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008293 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008294 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008295 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008296 arg_ty kwarg;
8297 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008298
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008299 if (_PyObject_LookupAttrId(obj, &PyId_posonlyargs, &tmp) < 0) {
8300 return 1;
8301 }
8302 if (tmp == NULL) {
8303 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
8304 return 1;
8305 }
8306 else {
8307 int res;
8308 Py_ssize_t len;
8309 Py_ssize_t i;
8310 if (!PyList_Check(tmp)) {
8311 PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8312 goto failed;
8313 }
8314 len = PyList_GET_SIZE(tmp);
8315 posonlyargs = _Py_asdl_seq_new(len, arena);
8316 if (posonlyargs == NULL) goto failed;
8317 for (i = 0; i < len; i++) {
8318 arg_ty val;
8319 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
8320 if (res != 0) goto failed;
8321 if (len != PyList_GET_SIZE(tmp)) {
8322 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
8323 goto failed;
8324 }
8325 asdl_seq_SET(posonlyargs, i, val);
8326 }
8327 Py_CLEAR(tmp);
8328 }
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07008329 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
8330 return 1;
8331 }
8332 if (tmp == NULL) {
8333 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
8334 return 1;
8335 }
8336 else {
8337 int res;
8338 Py_ssize_t len;
8339 Py_ssize_t i;
8340 if (!PyList_Check(tmp)) {
8341 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8342 goto failed;
8343 }
8344 len = PyList_GET_SIZE(tmp);
8345 args = _Py_asdl_seq_new(len, arena);
8346 if (args == NULL) goto failed;
8347 for (i = 0; i < len; i++) {
8348 arg_ty val;
8349 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
8350 if (res != 0) goto failed;
8351 if (len != PyList_GET_SIZE(tmp)) {
8352 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
8353 goto failed;
8354 }
8355 asdl_seq_SET(args, i, val);
8356 }
8357 Py_CLEAR(tmp);
8358 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008359 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008360 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008361 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008362 if (tmp == NULL || tmp == Py_None) {
8363 Py_CLEAR(tmp);
8364 vararg = NULL;
8365 }
8366 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008367 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008368 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008369 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008370 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008371 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008372 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
8373 return 1;
8374 }
8375 if (tmp == NULL) {
8376 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
8377 return 1;
8378 }
8379 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008380 int res;
8381 Py_ssize_t len;
8382 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008383 if (!PyList_Check(tmp)) {
8384 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8385 goto failed;
8386 }
8387 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008388 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008389 if (kwonlyargs == NULL) goto failed;
8390 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008391 arg_ty val;
8392 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008393 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008394 if (len != PyList_GET_SIZE(tmp)) {
8395 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
8396 goto failed;
8397 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008398 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008399 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008400 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008401 }
8402 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008403 return 1;
8404 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008405 if (tmp == NULL) {
8406 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
8407 return 1;
8408 }
8409 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008410 int res;
8411 Py_ssize_t len;
8412 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008413 if (!PyList_Check(tmp)) {
8414 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8415 goto failed;
8416 }
8417 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008418 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008419 if (kw_defaults == NULL) goto failed;
8420 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008421 expr_ty val;
8422 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008423 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008424 if (len != PyList_GET_SIZE(tmp)) {
8425 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
8426 goto failed;
8427 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008428 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008429 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008430 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008431 }
8432 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008433 return 1;
8434 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008435 if (tmp == NULL || tmp == Py_None) {
8436 Py_CLEAR(tmp);
8437 kwarg = NULL;
8438 }
8439 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008440 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008441 res = obj2ast_arg(tmp, &kwarg, arena);
8442 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02008443 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008444 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008445 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
8446 return 1;
8447 }
8448 if (tmp == NULL) {
8449 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
8450 return 1;
8451 }
8452 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008453 int res;
8454 Py_ssize_t len;
8455 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008456 if (!PyList_Check(tmp)) {
8457 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8458 goto failed;
8459 }
8460 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008461 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008462 if (defaults == NULL) goto failed;
8463 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008464 expr_ty val;
8465 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008466 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008467 if (len != PyList_GET_SIZE(tmp)) {
8468 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
8469 goto failed;
8470 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008471 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008472 }
Victor Stinnerb3189902013-07-27 00:04:42 +02008473 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008474 }
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07008475 *out = arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg,
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008476 defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008477 return 0;
8478failed:
8479 Py_XDECREF(tmp);
8480 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008481}
8482
8483int
8484obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
8485{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008486 PyObject* tmp = NULL;
8487 identifier arg;
8488 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008489 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01008490 int lineno;
8491 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008492 int end_lineno;
8493 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008494
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008495 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8496 return 1;
8497 }
8498 if (tmp == NULL) {
8499 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
8500 return 1;
8501 }
8502 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008503 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008504 res = obj2ast_identifier(tmp, &arg, arena);
8505 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008506 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008507 }
8508 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008509 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008510 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008511 if (tmp == NULL || tmp == Py_None) {
8512 Py_CLEAR(tmp);
8513 annotation = NULL;
8514 }
8515 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008516 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008517 res = obj2ast_expr(tmp, &annotation, arena);
8518 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008519 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008520 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008521 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
8522 return 1;
8523 }
8524 if (tmp == NULL || tmp == Py_None) {
8525 Py_CLEAR(tmp);
8526 type_comment = NULL;
8527 }
8528 else {
8529 int res;
8530 res = obj2ast_string(tmp, &type_comment, arena);
8531 if (res != 0) goto failed;
8532 Py_CLEAR(tmp);
8533 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008534 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8535 return 1;
8536 }
8537 if (tmp == NULL) {
8538 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
8539 return 1;
8540 }
8541 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008542 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008543 res = obj2ast_int(tmp, &lineno, arena);
8544 if (res != 0) goto failed;
8545 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008546 }
8547 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008548 return 1;
8549 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008550 if (tmp == NULL) {
8551 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
8552 return 1;
8553 }
8554 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008555 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008556 res = obj2ast_int(tmp, &col_offset, arena);
8557 if (res != 0) goto failed;
8558 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008559 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008560 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8561 return 1;
8562 }
8563 if (tmp == NULL || tmp == Py_None) {
8564 Py_CLEAR(tmp);
8565 end_lineno = 0;
8566 }
8567 else {
8568 int res;
8569 res = obj2ast_int(tmp, &end_lineno, arena);
8570 if (res != 0) goto failed;
8571 Py_CLEAR(tmp);
8572 }
8573 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8574 return 1;
8575 }
8576 if (tmp == NULL || tmp == Py_None) {
8577 Py_CLEAR(tmp);
8578 end_col_offset = 0;
8579 }
8580 else {
8581 int res;
8582 res = obj2ast_int(tmp, &end_col_offset, arena);
8583 if (res != 0) goto failed;
8584 Py_CLEAR(tmp);
8585 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008586 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
8587 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008588 return 0;
8589failed:
8590 Py_XDECREF(tmp);
8591 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008592}
8593
8594int
8595obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8596{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008597 PyObject* tmp = NULL;
8598 identifier arg;
8599 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008600
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008601 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8602 return 1;
8603 }
8604 if (tmp == NULL || tmp == Py_None) {
8605 Py_CLEAR(tmp);
8606 arg = 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, &arg, 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 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008614 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8615 return 1;
8616 }
8617 if (tmp == NULL) {
8618 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8619 return 1;
8620 }
8621 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008622 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008623 res = obj2ast_expr(tmp, &value, arena);
8624 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008625 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008626 }
8627 *out = keyword(arg, value, arena);
8628 return 0;
8629failed:
8630 Py_XDECREF(tmp);
8631 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008632}
8633
8634int
8635obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8636{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008637 PyObject* tmp = NULL;
8638 identifier name;
8639 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008640
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008641 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8642 return 1;
8643 }
8644 if (tmp == NULL) {
8645 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8646 return 1;
8647 }
8648 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008649 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008650 res = obj2ast_identifier(tmp, &name, arena);
8651 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008652 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008653 }
8654 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008655 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008656 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008657 if (tmp == NULL || tmp == Py_None) {
8658 Py_CLEAR(tmp);
8659 asname = NULL;
8660 }
8661 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008662 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008663 res = obj2ast_identifier(tmp, &asname, arena);
8664 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008665 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008666 }
8667 *out = alias(name, asname, arena);
8668 return 0;
8669failed:
8670 Py_XDECREF(tmp);
8671 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008672}
8673
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008674int
8675obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8676{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008677 PyObject* tmp = NULL;
8678 expr_ty context_expr;
8679 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008680
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008681 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8682 return 1;
8683 }
8684 if (tmp == NULL) {
8685 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8686 return 1;
8687 }
8688 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008689 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008690 res = obj2ast_expr(tmp, &context_expr, arena);
8691 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008692 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008693 }
8694 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008695 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008696 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008697 if (tmp == NULL || tmp == Py_None) {
8698 Py_CLEAR(tmp);
8699 optional_vars = NULL;
8700 }
8701 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008702 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008703 res = obj2ast_expr(tmp, &optional_vars, arena);
8704 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008705 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008706 }
8707 *out = withitem(context_expr, optional_vars, arena);
8708 return 0;
8709failed:
8710 Py_XDECREF(tmp);
8711 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008712}
8713
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008714int
8715obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena)
8716{
8717 int isinstance;
8718
8719 PyObject *tmp = NULL;
8720
8721 if (obj == Py_None) {
8722 *out = NULL;
8723 return 0;
8724 }
8725 isinstance = PyObject_IsInstance(obj, (PyObject*)TypeIgnore_type);
8726 if (isinstance == -1) {
8727 return 1;
8728 }
8729 if (isinstance) {
8730 int lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07008731 string tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008732
8733 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8734 return 1;
8735 }
8736 if (tmp == NULL) {
8737 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
8738 return 1;
8739 }
8740 else {
8741 int res;
8742 res = obj2ast_int(tmp, &lineno, arena);
8743 if (res != 0) goto failed;
8744 Py_CLEAR(tmp);
8745 }
Michael J. Sullivan933e1502019-05-22 07:54:20 -07008746 if (_PyObject_LookupAttrId(obj, &PyId_tag, &tmp) < 0) {
8747 return 1;
8748 }
8749 if (tmp == NULL) {
8750 PyErr_SetString(PyExc_TypeError, "required field \"tag\" missing from TypeIgnore");
8751 return 1;
8752 }
8753 else {
8754 int res;
8755 res = obj2ast_string(tmp, &tag, arena);
8756 if (res != 0) goto failed;
8757 Py_CLEAR(tmp);
8758 }
8759 *out = TypeIgnore(lineno, tag, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008760 if (*out == NULL) goto failed;
8761 return 0;
8762 }
8763
8764 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
8765 failed:
8766 Py_XDECREF(tmp);
8767 return 1;
8768}
8769
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008770
Martin v. Löwis1a214512008-06-11 05:26:20 +00008771static struct PyModuleDef _astmodule = {
8772 PyModuleDef_HEAD_INIT, "_ast"
8773};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008774PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008775PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008776{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008777 PyObject *m, *d;
8778 if (!init_types()) return NULL;
8779 m = PyModule_Create(&_astmodule);
8780 if (!m) return NULL;
8781 d = PyModule_GetDict(m);
8782 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07008783 if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0)
8784 return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008785 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008786 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008787 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)
8788 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008789 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8790 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8791 NULL;
8792 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8793 0) return NULL;
8794 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8795 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008796 if (PyDict_SetItemString(d, "FunctionType", (PyObject*)FunctionType_type) <
8797 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008798 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8799 NULL;
8800 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8801 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8802 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008803 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8804 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008805 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8806 return NULL;
8807 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8808 NULL;
8809 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8810 NULL;
8811 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8812 NULL;
8813 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8814 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008815 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8816 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008817 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008818 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8819 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008820 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8821 NULL;
8822 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8823 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008824 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8825 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008826 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8827 NULL;
8828 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8829 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8830 NULL;
8831 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8832 NULL;
8833 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8834 return NULL;
8835 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8836 NULL;
8837 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8838 return NULL;
8839 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8840 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8841 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8842 NULL;
8843 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8844 return NULL;
8845 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8846 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8847 NULL;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07008848 if (PyDict_SetItemString(d, "NamedExpr", (PyObject*)NamedExpr_type) < 0)
8849 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008850 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8851 NULL;
8852 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8853 NULL;
8854 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8855 NULL;
8856 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8857 NULL;
8858 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8859 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8860 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8861 return NULL;
8862 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8863 NULL;
8864 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8865 return NULL;
8866 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8867 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008868 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8869 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008870 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8871 NULL;
8872 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8873 return NULL;
8874 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8875 NULL;
8876 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008877 if (PyDict_SetItemString(d, "FormattedValue",
8878 (PyObject*)FormattedValue_type) < 0) return NULL;
8879 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8880 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008881 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8882 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008883 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8884 return NULL;
8885 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8886 return NULL;
8887 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8888 NULL;
8889 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8890 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8891 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8892 NULL;
8893 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8894 0) return NULL;
8895 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8896 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8897 NULL;
8898 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8899 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8900 NULL;
8901 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8902 return NULL;
8903 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8904 NULL;
8905 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8906 NULL;
8907 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8908 NULL;
8909 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8910 return NULL;
8911 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8912 NULL;
8913 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8914 NULL;
8915 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8916 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8917 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8918 return NULL;
8919 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8920 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8921 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008922 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8923 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008924 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8925 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8926 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8927 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8928 NULL;
8929 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8930 NULL;
8931 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8932 NULL;
8933 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8934 NULL;
8935 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8936 NULL;
8937 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8938 return NULL;
8939 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8940 NULL;
8941 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8942 NULL;
8943 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8944 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8945 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8946 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8947 NULL;
8948 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8949 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8950 NULL;
8951 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8952 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8953 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8954 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8955 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8956 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8957 NULL;
8958 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8959 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8960 NULL;
8961 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8962 < 0) return NULL;
8963 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8964 < 0) return NULL;
8965 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8966 < 0) return NULL;
8967 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8968 return NULL;
8969 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8970 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8971 NULL;
8972 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8973 NULL;
8974 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8975 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008976 if (PyDict_SetItemString(d, "type_ignore", (PyObject*)type_ignore_type) <
8977 0) return NULL;
8978 if (PyDict_SetItemString(d, "TypeIgnore", (PyObject*)TypeIgnore_type) < 0)
8979 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008980 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008981}
8982
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008983
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008984PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008985{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008986 if (!init_types())
8987 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008988 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008989}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008990
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008991/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8992mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008993{
8994 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008995 PyObject *req_type[3];
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08008996 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008997 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008998
Steve Dowerb82e17e2019-05-23 08:45:22 -07008999 if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
9000 return NULL;
9001 }
9002
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05009003 req_type[0] = (PyObject*)Module_type;
9004 req_type[1] = (PyObject*)Expression_type;
9005 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05009006
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08009007 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +00009008
Victor Stinnerbdf630c2013-07-17 00:17:15 +02009009 if (!init_types())
9010 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00009011
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00009012 isinstance = PyObject_IsInstance(ast, req_type[mode]);
9013 if (isinstance == -1)
9014 return NULL;
9015 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00009016 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
9017 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009018 return NULL;
9019 }
9020 if (obj2ast_mod(ast, &res, arena) != 0)
9021 return NULL;
9022 else
9023 return res;
9024}
9025
9026int PyAST_Check(PyObject* obj)
9027{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02009028 if (!init_types())
9029 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00009030 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009031}
9032
Martin v. Löwis5b222132007-06-10 09:51:05 +00009033