blob: 6c8488f8fe680ae5ee2c94aaeb5b2473b480274b [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[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200479 "args",
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100480 "posonlyargs",
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;
525static char *TypeIgnore_fields[]={
526 "lineno",
527};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000528
529
INADA Naokifc489082017-01-25 22:33:43 +0900530_Py_IDENTIFIER(_fields);
531_Py_IDENTIFIER(_attributes);
532
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700533typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100534 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700535 PyObject *dict;
536} AST_object;
537
Benjamin Peterson1767e022012-03-14 21:50:29 -0500538static void
539ast_dealloc(AST_object *self)
540{
INADA Naokia6296d32017-08-24 14:55:17 +0900541 /* bpo-31095: UnTrack is needed before calling any callbacks */
542 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500543 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200544 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500545}
546
Neal Norwitz207c9f32008-03-31 04:42:11 +0000547static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700548ast_traverse(AST_object *self, visitproc visit, void *arg)
549{
550 Py_VISIT(self->dict);
551 return 0;
552}
553
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300554static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700555ast_clear(AST_object *self)
556{
557 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300558 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700559}
560
561static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000562ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
563{
564 Py_ssize_t i, numfields = 0;
565 int res = -1;
566 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200567 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
568 goto cleanup;
569 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000570 if (fields) {
571 numfields = PySequence_Size(fields);
572 if (numfields == -1)
573 goto cleanup;
574 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900575
Neal Norwitz207c9f32008-03-31 04:42:11 +0000576 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900577 if (numfields < PyTuple_GET_SIZE(args)) {
578 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
579 "%zd positional argument%s",
580 Py_TYPE(self)->tp_name,
581 numfields, numfields == 1 ? "" : "s");
582 res = -1;
583 goto cleanup;
584 }
585 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
586 /* cannot be reached when fields is NULL */
587 PyObject *name = PySequence_GetItem(fields, i);
588 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000589 res = -1;
590 goto cleanup;
591 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900592 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
593 Py_DECREF(name);
594 if (res < 0)
595 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000596 }
597 if (kw) {
598 i = 0; /* needed by PyDict_Next */
599 while (PyDict_Next(kw, &i, &key, &value)) {
600 res = PyObject_SetAttr(self, key, value);
601 if (res < 0)
602 goto cleanup;
603 }
604 }
605 cleanup:
606 Py_XDECREF(fields);
607 return res;
608}
609
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000610/* Pickling support */
611static PyObject *
612ast_type_reduce(PyObject *self, PyObject *unused)
613{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200614 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200615 PyObject *dict;
616 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
617 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000618 }
619 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200620 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000621 }
622 return Py_BuildValue("O()", Py_TYPE(self));
623}
624
625static PyMethodDef ast_type_methods[] = {
626 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
627 {NULL}
628};
629
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700630static PyGetSetDef ast_type_getsets[] = {
631 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
632 {NULL}
633};
634
Neal Norwitz207c9f32008-03-31 04:42:11 +0000635static PyTypeObject AST_type = {
636 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000637 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700638 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000639 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500640 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000641 0, /* tp_print */
642 0, /* tp_getattr */
643 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000644 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000645 0, /* tp_repr */
646 0, /* tp_as_number */
647 0, /* tp_as_sequence */
648 0, /* tp_as_mapping */
649 0, /* tp_hash */
650 0, /* tp_call */
651 0, /* tp_str */
652 PyObject_GenericGetAttr, /* tp_getattro */
653 PyObject_GenericSetAttr, /* tp_setattro */
654 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700655 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000656 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700657 (traverseproc)ast_traverse, /* tp_traverse */
658 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000659 0, /* tp_richcompare */
660 0, /* tp_weaklistoffset */
661 0, /* tp_iter */
662 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000663 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000664 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700665 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000666 0, /* tp_base */
667 0, /* tp_dict */
668 0, /* tp_descr_get */
669 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700670 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000671 (initproc)ast_type_init, /* tp_init */
672 PyType_GenericAlloc, /* tp_alloc */
673 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700674 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000675};
676
677
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000678static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
679{
INADA Naokifc489082017-01-25 22:33:43 +0900680 _Py_IDENTIFIER(__module__);
681 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000682 PyObject *fnames, *result;
683 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000684 fnames = PyTuple_New(num_fields);
685 if (!fnames) return NULL;
686 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000687 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000688 if (!field) {
689 Py_DECREF(fnames);
690 return NULL;
691 }
692 PyTuple_SET_ITEM(fnames, i, field);
693 }
INADA Naokifc489082017-01-25 22:33:43 +0900694 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
695 type, base,
696 _PyUnicode_FromId(&PyId__fields), fnames,
697 _PyUnicode_FromId(&PyId___module__),
698 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000699 Py_DECREF(fnames);
700 return (PyTypeObject*)result;
701}
702
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000703static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
704{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000705 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000706 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000707 if (!l)
708 return 0;
709 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000710 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000711 if (!s) {
712 Py_DECREF(l);
713 return 0;
714 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000715 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000716 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200717 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000718 Py_DECREF(l);
719 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000720}
721
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000722/* Conversion AST -> Python */
723
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000724static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
725{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700726 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000727 PyObject *result = PyList_New(n);
728 PyObject *value;
729 if (!result)
730 return NULL;
731 for (i = 0; i < n; i++) {
732 value = func(asdl_seq_GET(seq, i));
733 if (!value) {
734 Py_DECREF(result);
735 return NULL;
736 }
737 PyList_SET_ITEM(result, i, value);
738 }
739 return result;
740}
741
742static PyObject* ast2obj_object(void *o)
743{
744 if (!o)
745 o = Py_None;
746 Py_INCREF((PyObject*)o);
747 return (PyObject*)o;
748}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500749#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100750#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000751#define ast2obj_identifier ast2obj_object
752#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500753#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000754
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000755static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000756{
Christian Heimes217cfd12007-12-02 14:31:20 +0000757 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000758}
759
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000760/* Conversion Python -> AST */
761
762static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
763{
764 if (obj == Py_None)
765 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200766 if (obj) {
767 if (PyArena_AddPyObject(arena, obj) < 0) {
768 *out = NULL;
769 return -1;
770 }
771 Py_INCREF(obj);
772 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000773 *out = obj;
774 return 0;
775}
776
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100777static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
778{
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300779 if (PyArena_AddPyObject(arena, obj) < 0) {
780 *out = NULL;
781 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100782 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300783 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100784 *out = obj;
785 return 0;
786}
787
Benjamin Peterson180e6352011-07-22 11:09:07 -0500788static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500789{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500790 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
791 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500792 return 1;
793 }
794 return obj2ast_object(obj, out, arena);
795}
796
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800797static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
798{
799 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
800 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
801 return 1;
802 }
803 return obj2ast_object(obj, out, arena);
804}
805
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000806static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
807{
808 int i;
809 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100810 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000811 return 1;
812 }
813
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300814 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000815 if (i == -1 && PyErr_Occurred())
816 return 1;
817 *out = i;
818 return 0;
819}
820
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000821static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000822{
823 PyObject *empty_tuple, *d;
824 if (PyType_Ready(&AST_type) < 0)
825 return -1;
826 d = AST_type.tp_dict;
827 empty_tuple = PyTuple_New(0);
828 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900829 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
830 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000831 Py_XDECREF(empty_tuple);
832 return -1;
833 }
834 Py_DECREF(empty_tuple);
835 return 0;
836}
837
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000838
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000839static int init_types(void)
840{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200841 static int initialized;
842 if (initialized) return 1;
843 if (add_ast_fields() < 0) return 0;
844 mod_type = make_type("mod", &AST_type, NULL, 0);
845 if (!mod_type) return 0;
846 if (!add_attributes(mod_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800847 Module_type = make_type("Module", mod_type, Module_fields, 2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200848 if (!Module_type) return 0;
849 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
850 1);
851 if (!Interactive_type) return 0;
852 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
853 if (!Expression_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800854 FunctionType_type = make_type("FunctionType", mod_type,
855 FunctionType_fields, 2);
856 if (!FunctionType_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200857 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
858 if (!Suite_type) return 0;
859 stmt_type = make_type("stmt", &AST_type, NULL, 0);
860 if (!stmt_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000861 if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200862 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800863 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200864 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400865 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800866 AsyncFunctionDef_fields, 6);
Yury Selivanov75445082015-05-11 22:57:16 -0400867 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300868 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200869 if (!ClassDef_type) return 0;
870 Return_type = make_type("Return", stmt_type, Return_fields, 1);
871 if (!Return_type) return 0;
872 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
873 if (!Delete_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800874 Assign_type = make_type("Assign", stmt_type, Assign_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200875 if (!Assign_type) return 0;
876 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
877 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700878 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
879 if (!AnnAssign_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800880 For_type = make_type("For", stmt_type, For_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200881 if (!For_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800882 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400883 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200884 While_type = make_type("While", stmt_type, While_fields, 3);
885 if (!While_type) return 0;
886 If_type = make_type("If", stmt_type, If_fields, 3);
887 if (!If_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800888 With_type = make_type("With", stmt_type, With_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200889 if (!With_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800890 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 3);
Yury Selivanov75445082015-05-11 22:57:16 -0400891 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200892 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
893 if (!Raise_type) return 0;
894 Try_type = make_type("Try", stmt_type, Try_fields, 4);
895 if (!Try_type) return 0;
896 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
897 if (!Assert_type) return 0;
898 Import_type = make_type("Import", stmt_type, Import_fields, 1);
899 if (!Import_type) return 0;
900 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
901 if (!ImportFrom_type) return 0;
902 Global_type = make_type("Global", stmt_type, Global_fields, 1);
903 if (!Global_type) return 0;
904 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
905 if (!Nonlocal_type) return 0;
906 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
907 if (!Expr_type) return 0;
908 Pass_type = make_type("Pass", stmt_type, NULL, 0);
909 if (!Pass_type) return 0;
910 Break_type = make_type("Break", stmt_type, NULL, 0);
911 if (!Break_type) return 0;
912 Continue_type = make_type("Continue", stmt_type, NULL, 0);
913 if (!Continue_type) return 0;
914 expr_type = make_type("expr", &AST_type, NULL, 0);
915 if (!expr_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000916 if (!add_attributes(expr_type, expr_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200917 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
918 if (!BoolOp_type) return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700919 NamedExpr_type = make_type("NamedExpr", expr_type, NamedExpr_fields, 2);
920 if (!NamedExpr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200921 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
922 if (!BinOp_type) return 0;
923 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
924 if (!UnaryOp_type) return 0;
925 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
926 if (!Lambda_type) return 0;
927 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
928 if (!IfExp_type) return 0;
929 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
930 if (!Dict_type) return 0;
931 Set_type = make_type("Set", expr_type, Set_fields, 1);
932 if (!Set_type) return 0;
933 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
934 if (!ListComp_type) return 0;
935 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
936 if (!SetComp_type) return 0;
937 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
938 if (!DictComp_type) return 0;
939 GeneratorExp_type = make_type("GeneratorExp", expr_type,
940 GeneratorExp_fields, 2);
941 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400942 Await_type = make_type("Await", expr_type, Await_fields, 1);
943 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200944 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
945 if (!Yield_type) return 0;
946 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
947 if (!YieldFrom_type) return 0;
948 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
949 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400950 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200951 if (!Call_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400952 FormattedValue_type = make_type("FormattedValue", expr_type,
953 FormattedValue_fields, 3);
954 if (!FormattedValue_type) return 0;
955 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
956 if (!JoinedStr_type) return 0;
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700957 Constant_type = make_type("Constant", expr_type, Constant_fields, 2);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100958 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200959 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
960 if (!Attribute_type) return 0;
961 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
962 if (!Subscript_type) return 0;
963 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
964 if (!Starred_type) return 0;
965 Name_type = make_type("Name", expr_type, Name_fields, 2);
966 if (!Name_type) return 0;
967 List_type = make_type("List", expr_type, List_fields, 2);
968 if (!List_type) return 0;
969 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
970 if (!Tuple_type) return 0;
971 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
972 if (!expr_context_type) return 0;
973 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
974 Load_type = make_type("Load", expr_context_type, NULL, 0);
975 if (!Load_type) return 0;
976 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
977 if (!Load_singleton) return 0;
978 Store_type = make_type("Store", expr_context_type, NULL, 0);
979 if (!Store_type) return 0;
980 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
981 if (!Store_singleton) return 0;
982 Del_type = make_type("Del", expr_context_type, NULL, 0);
983 if (!Del_type) return 0;
984 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
985 if (!Del_singleton) return 0;
986 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
987 if (!AugLoad_type) return 0;
988 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
989 if (!AugLoad_singleton) return 0;
990 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
991 if (!AugStore_type) return 0;
992 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
993 if (!AugStore_singleton) return 0;
994 Param_type = make_type("Param", expr_context_type, NULL, 0);
995 if (!Param_type) return 0;
996 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
997 if (!Param_singleton) return 0;
998 slice_type = make_type("slice", &AST_type, NULL, 0);
999 if (!slice_type) return 0;
1000 if (!add_attributes(slice_type, NULL, 0)) return 0;
1001 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1002 if (!Slice_type) return 0;
1003 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1004 if (!ExtSlice_type) return 0;
1005 Index_type = make_type("Index", slice_type, Index_fields, 1);
1006 if (!Index_type) return 0;
1007 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1008 if (!boolop_type) return 0;
1009 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1010 And_type = make_type("And", boolop_type, NULL, 0);
1011 if (!And_type) return 0;
1012 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1013 if (!And_singleton) return 0;
1014 Or_type = make_type("Or", boolop_type, NULL, 0);
1015 if (!Or_type) return 0;
1016 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1017 if (!Or_singleton) return 0;
1018 operator_type = make_type("operator", &AST_type, NULL, 0);
1019 if (!operator_type) return 0;
1020 if (!add_attributes(operator_type, NULL, 0)) return 0;
1021 Add_type = make_type("Add", operator_type, NULL, 0);
1022 if (!Add_type) return 0;
1023 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1024 if (!Add_singleton) return 0;
1025 Sub_type = make_type("Sub", operator_type, NULL, 0);
1026 if (!Sub_type) return 0;
1027 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1028 if (!Sub_singleton) return 0;
1029 Mult_type = make_type("Mult", operator_type, NULL, 0);
1030 if (!Mult_type) return 0;
1031 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1032 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001033 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1034 if (!MatMult_type) return 0;
1035 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1036 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001037 Div_type = make_type("Div", operator_type, NULL, 0);
1038 if (!Div_type) return 0;
1039 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1040 if (!Div_singleton) return 0;
1041 Mod_type = make_type("Mod", operator_type, NULL, 0);
1042 if (!Mod_type) return 0;
1043 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1044 if (!Mod_singleton) return 0;
1045 Pow_type = make_type("Pow", operator_type, NULL, 0);
1046 if (!Pow_type) return 0;
1047 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1048 if (!Pow_singleton) return 0;
1049 LShift_type = make_type("LShift", operator_type, NULL, 0);
1050 if (!LShift_type) return 0;
1051 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1052 if (!LShift_singleton) return 0;
1053 RShift_type = make_type("RShift", operator_type, NULL, 0);
1054 if (!RShift_type) return 0;
1055 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1056 if (!RShift_singleton) return 0;
1057 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1058 if (!BitOr_type) return 0;
1059 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1060 if (!BitOr_singleton) return 0;
1061 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1062 if (!BitXor_type) return 0;
1063 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1064 if (!BitXor_singleton) return 0;
1065 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1066 if (!BitAnd_type) return 0;
1067 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1068 if (!BitAnd_singleton) return 0;
1069 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1070 if (!FloorDiv_type) return 0;
1071 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1072 if (!FloorDiv_singleton) return 0;
1073 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1074 if (!unaryop_type) return 0;
1075 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1076 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1077 if (!Invert_type) return 0;
1078 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1079 if (!Invert_singleton) return 0;
1080 Not_type = make_type("Not", unaryop_type, NULL, 0);
1081 if (!Not_type) return 0;
1082 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1083 if (!Not_singleton) return 0;
1084 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1085 if (!UAdd_type) return 0;
1086 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1087 if (!UAdd_singleton) return 0;
1088 USub_type = make_type("USub", unaryop_type, NULL, 0);
1089 if (!USub_type) return 0;
1090 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1091 if (!USub_singleton) return 0;
1092 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1093 if (!cmpop_type) return 0;
1094 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1095 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1096 if (!Eq_type) return 0;
1097 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1098 if (!Eq_singleton) return 0;
1099 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1100 if (!NotEq_type) return 0;
1101 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1102 if (!NotEq_singleton) return 0;
1103 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1104 if (!Lt_type) return 0;
1105 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1106 if (!Lt_singleton) return 0;
1107 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1108 if (!LtE_type) return 0;
1109 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1110 if (!LtE_singleton) return 0;
1111 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1112 if (!Gt_type) return 0;
1113 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1114 if (!Gt_singleton) return 0;
1115 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1116 if (!GtE_type) return 0;
1117 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1118 if (!GtE_singleton) return 0;
1119 Is_type = make_type("Is", cmpop_type, NULL, 0);
1120 if (!Is_type) return 0;
1121 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1122 if (!Is_singleton) return 0;
1123 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1124 if (!IsNot_type) return 0;
1125 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1126 if (!IsNot_singleton) return 0;
1127 In_type = make_type("In", cmpop_type, NULL, 0);
1128 if (!In_type) return 0;
1129 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1130 if (!In_singleton) return 0;
1131 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1132 if (!NotIn_type) return 0;
1133 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1134 if (!NotIn_singleton) return 0;
1135 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001136 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001137 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001138 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001139 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1140 if (!excepthandler_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001141 if (!add_attributes(excepthandler_type, excepthandler_attributes, 4))
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001142 return 0;
1143 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1144 ExceptHandler_fields, 3);
1145 if (!ExceptHandler_type) return 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001146 arguments_type = make_type("arguments", &AST_type, arguments_fields, 7);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001147 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001148 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001149 arg_type = make_type("arg", &AST_type, arg_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001150 if (!arg_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001151 if (!add_attributes(arg_type, arg_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001152 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1153 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001154 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001155 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1156 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001157 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001158 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1159 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001160 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001161 type_ignore_type = make_type("type_ignore", &AST_type, NULL, 0);
1162 if (!type_ignore_type) return 0;
1163 if (!add_attributes(type_ignore_type, NULL, 0)) return 0;
1164 TypeIgnore_type = make_type("TypeIgnore", type_ignore_type,
1165 TypeIgnore_fields, 1);
1166 if (!TypeIgnore_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001167 initialized = 1;
1168 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001169}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001170
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001171static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1172static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1173static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1174static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1175 arena);
1176static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1177static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1178static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1179static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1180static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1181static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1182 arena);
1183static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1184 arena);
1185static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1186static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1187static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1188static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001189static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001190static int obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena*
1191 arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001192
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001194Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001196 mod_ty p;
1197 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1198 if (!p)
1199 return NULL;
1200 p->kind = Module_kind;
1201 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001202 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001203 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204}
1205
1206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001209 mod_ty p;
1210 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1211 if (!p)
1212 return NULL;
1213 p->kind = Interactive_kind;
1214 p->v.Interactive.body = body;
1215 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216}
1217
1218mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001219Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001221 mod_ty p;
1222 if (!body) {
1223 PyErr_SetString(PyExc_ValueError,
1224 "field body is required for Expression");
1225 return NULL;
1226 }
1227 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1228 if (!p)
1229 return NULL;
1230 p->kind = Expression_kind;
1231 p->v.Expression.body = body;
1232 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233}
1234
1235mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001236FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena)
1237{
1238 mod_ty p;
1239 if (!returns) {
1240 PyErr_SetString(PyExc_ValueError,
1241 "field returns is required for FunctionType");
1242 return NULL;
1243 }
1244 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1245 if (!p)
1246 return NULL;
1247 p->kind = FunctionType_kind;
1248 p->v.FunctionType.argtypes = argtypes;
1249 p->v.FunctionType.returns = returns;
1250 return p;
1251}
1252
1253mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001254Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001256 mod_ty p;
1257 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1258 if (!p)
1259 return NULL;
1260 p->kind = Suite_kind;
1261 p->v.Suite.body = body;
1262 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263}
1264
1265stmt_ty
1266FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001267 decorator_list, expr_ty returns, string type_comment, int lineno,
1268 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001270 stmt_ty p;
1271 if (!name) {
1272 PyErr_SetString(PyExc_ValueError,
1273 "field name is required for FunctionDef");
1274 return NULL;
1275 }
1276 if (!args) {
1277 PyErr_SetString(PyExc_ValueError,
1278 "field args is required for FunctionDef");
1279 return NULL;
1280 }
1281 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1282 if (!p)
1283 return NULL;
1284 p->kind = FunctionDef_kind;
1285 p->v.FunctionDef.name = name;
1286 p->v.FunctionDef.args = args;
1287 p->v.FunctionDef.body = body;
1288 p->v.FunctionDef.decorator_list = decorator_list;
1289 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001290 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001291 p->lineno = lineno;
1292 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001293 p->end_lineno = end_lineno;
1294 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001295 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296}
1297
1298stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001299AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001300 * decorator_list, expr_ty returns, string type_comment, int
1301 lineno, int col_offset, int end_lineno, int end_col_offset,
1302 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001303{
1304 stmt_ty p;
1305 if (!name) {
1306 PyErr_SetString(PyExc_ValueError,
1307 "field name is required for AsyncFunctionDef");
1308 return NULL;
1309 }
1310 if (!args) {
1311 PyErr_SetString(PyExc_ValueError,
1312 "field args is required for AsyncFunctionDef");
1313 return NULL;
1314 }
1315 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1316 if (!p)
1317 return NULL;
1318 p->kind = AsyncFunctionDef_kind;
1319 p->v.AsyncFunctionDef.name = name;
1320 p->v.AsyncFunctionDef.args = args;
1321 p->v.AsyncFunctionDef.body = body;
1322 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1323 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001324 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001325 p->lineno = lineno;
1326 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001327 p->end_lineno = end_lineno;
1328 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001329 return p;
1330}
1331
1332stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001333ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001334 body, asdl_seq * decorator_list, int lineno, int col_offset, int
1335 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001337 stmt_ty p;
1338 if (!name) {
1339 PyErr_SetString(PyExc_ValueError,
1340 "field name is required for ClassDef");
1341 return NULL;
1342 }
1343 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1344 if (!p)
1345 return NULL;
1346 p->kind = ClassDef_kind;
1347 p->v.ClassDef.name = name;
1348 p->v.ClassDef.bases = bases;
1349 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001350 p->v.ClassDef.body = body;
1351 p->v.ClassDef.decorator_list = decorator_list;
1352 p->lineno = lineno;
1353 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001354 p->end_lineno = end_lineno;
1355 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001356 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357}
1358
1359stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001360Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
1361 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001363 stmt_ty p;
1364 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1365 if (!p)
1366 return NULL;
1367 p->kind = Return_kind;
1368 p->v.Return.value = value;
1369 p->lineno = lineno;
1370 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001371 p->end_lineno = end_lineno;
1372 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001373 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374}
1375
1376stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001377Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int
1378 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001380 stmt_ty p;
1381 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1382 if (!p)
1383 return NULL;
1384 p->kind = Delete_kind;
1385 p->v.Delete.targets = targets;
1386 p->lineno = lineno;
1387 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001388 p->end_lineno = end_lineno;
1389 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001390 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391}
1392
1393stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001394Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int
1395 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001397 stmt_ty p;
1398 if (!value) {
1399 PyErr_SetString(PyExc_ValueError,
1400 "field value is required for Assign");
1401 return NULL;
1402 }
1403 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1404 if (!p)
1405 return NULL;
1406 p->kind = Assign_kind;
1407 p->v.Assign.targets = targets;
1408 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001409 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001410 p->lineno = lineno;
1411 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001412 p->end_lineno = end_lineno;
1413 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001414 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415}
1416
1417stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001418AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001419 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001421 stmt_ty p;
1422 if (!target) {
1423 PyErr_SetString(PyExc_ValueError,
1424 "field target is required for AugAssign");
1425 return NULL;
1426 }
1427 if (!op) {
1428 PyErr_SetString(PyExc_ValueError,
1429 "field op is required for AugAssign");
1430 return NULL;
1431 }
1432 if (!value) {
1433 PyErr_SetString(PyExc_ValueError,
1434 "field value is required for AugAssign");
1435 return NULL;
1436 }
1437 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1438 if (!p)
1439 return NULL;
1440 p->kind = AugAssign_kind;
1441 p->v.AugAssign.target = target;
1442 p->v.AugAssign.op = op;
1443 p->v.AugAssign.value = value;
1444 p->lineno = lineno;
1445 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001446 p->end_lineno = end_lineno;
1447 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001448 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449}
1450
1451stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001452AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001453 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1454 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001455{
1456 stmt_ty p;
1457 if (!target) {
1458 PyErr_SetString(PyExc_ValueError,
1459 "field target is required for AnnAssign");
1460 return NULL;
1461 }
1462 if (!annotation) {
1463 PyErr_SetString(PyExc_ValueError,
1464 "field annotation is required for AnnAssign");
1465 return NULL;
1466 }
1467 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1468 if (!p)
1469 return NULL;
1470 p->kind = AnnAssign_kind;
1471 p->v.AnnAssign.target = target;
1472 p->v.AnnAssign.annotation = annotation;
1473 p->v.AnnAssign.value = value;
1474 p->v.AnnAssign.simple = simple;
1475 p->lineno = lineno;
1476 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001477 p->end_lineno = end_lineno;
1478 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001479 return p;
1480}
1481
1482stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001483For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string
1484 type_comment, int lineno, int col_offset, int end_lineno, int
1485 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001487 stmt_ty p;
1488 if (!target) {
1489 PyErr_SetString(PyExc_ValueError,
1490 "field target is required for For");
1491 return NULL;
1492 }
1493 if (!iter) {
1494 PyErr_SetString(PyExc_ValueError,
1495 "field iter is required for For");
1496 return NULL;
1497 }
1498 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1499 if (!p)
1500 return NULL;
1501 p->kind = For_kind;
1502 p->v.For.target = target;
1503 p->v.For.iter = iter;
1504 p->v.For.body = body;
1505 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001506 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001507 p->lineno = lineno;
1508 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001509 p->end_lineno = end_lineno;
1510 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001511 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512}
1513
1514stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001515AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse,
1516 string type_comment, int lineno, int col_offset, int end_lineno, int
1517 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001518{
1519 stmt_ty p;
1520 if (!target) {
1521 PyErr_SetString(PyExc_ValueError,
1522 "field target is required for AsyncFor");
1523 return NULL;
1524 }
1525 if (!iter) {
1526 PyErr_SetString(PyExc_ValueError,
1527 "field iter is required for AsyncFor");
1528 return NULL;
1529 }
1530 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1531 if (!p)
1532 return NULL;
1533 p->kind = AsyncFor_kind;
1534 p->v.AsyncFor.target = target;
1535 p->v.AsyncFor.iter = iter;
1536 p->v.AsyncFor.body = body;
1537 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001538 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001539 p->lineno = lineno;
1540 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001541 p->end_lineno = end_lineno;
1542 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001543 return p;
1544}
1545
1546stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001547While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001548 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001550 stmt_ty p;
1551 if (!test) {
1552 PyErr_SetString(PyExc_ValueError,
1553 "field test is required for While");
1554 return NULL;
1555 }
1556 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1557 if (!p)
1558 return NULL;
1559 p->kind = While_kind;
1560 p->v.While.test = test;
1561 p->v.While.body = body;
1562 p->v.While.orelse = orelse;
1563 p->lineno = lineno;
1564 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001565 p->end_lineno = end_lineno;
1566 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001567 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568}
1569
1570stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001571If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001572 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001574 stmt_ty p;
1575 if (!test) {
1576 PyErr_SetString(PyExc_ValueError,
1577 "field test is required for If");
1578 return NULL;
1579 }
1580 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1581 if (!p)
1582 return NULL;
1583 p->kind = If_kind;
1584 p->v.If.test = test;
1585 p->v.If.body = body;
1586 p->v.If.orelse = orelse;
1587 p->lineno = lineno;
1588 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001589 p->end_lineno = end_lineno;
1590 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001591 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592}
1593
1594stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001595With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int
1596 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001597{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001598 stmt_ty p;
1599 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1600 if (!p)
1601 return NULL;
1602 p->kind = With_kind;
1603 p->v.With.items = items;
1604 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001605 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001606 p->lineno = lineno;
1607 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001608 p->end_lineno = end_lineno;
1609 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001610 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001611}
1612
1613stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001614AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno,
1615 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001616{
1617 stmt_ty p;
1618 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1619 if (!p)
1620 return NULL;
1621 p->kind = AsyncWith_kind;
1622 p->v.AsyncWith.items = items;
1623 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001624 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001625 p->lineno = lineno;
1626 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001627 p->end_lineno = end_lineno;
1628 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001629 return p;
1630}
1631
1632stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001633Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
1634 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001635{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001636 stmt_ty p;
1637 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1638 if (!p)
1639 return NULL;
1640 p->kind = Raise_kind;
1641 p->v.Raise.exc = exc;
1642 p->v.Raise.cause = cause;
1643 p->lineno = lineno;
1644 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001645 p->end_lineno = end_lineno;
1646 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001647 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648}
1649
1650stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001651Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001652 finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset,
1653 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001655 stmt_ty p;
1656 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1657 if (!p)
1658 return NULL;
1659 p->kind = Try_kind;
1660 p->v.Try.body = body;
1661 p->v.Try.handlers = handlers;
1662 p->v.Try.orelse = orelse;
1663 p->v.Try.finalbody = finalbody;
1664 p->lineno = lineno;
1665 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001666 p->end_lineno = end_lineno;
1667 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001668 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669}
1670
1671stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001672Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
1673 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001675 stmt_ty p;
1676 if (!test) {
1677 PyErr_SetString(PyExc_ValueError,
1678 "field test is required for Assert");
1679 return NULL;
1680 }
1681 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1682 if (!p)
1683 return NULL;
1684 p->kind = Assert_kind;
1685 p->v.Assert.test = test;
1686 p->v.Assert.msg = msg;
1687 p->lineno = lineno;
1688 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001689 p->end_lineno = end_lineno;
1690 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001691 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692}
1693
1694stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001695Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1696 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001698 stmt_ty p;
1699 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1700 if (!p)
1701 return NULL;
1702 p->kind = Import_kind;
1703 p->v.Import.names = names;
1704 p->lineno = lineno;
1705 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001706 p->end_lineno = end_lineno;
1707 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001708 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709}
1710
1711stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001712ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001713 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001715 stmt_ty p;
1716 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1717 if (!p)
1718 return NULL;
1719 p->kind = ImportFrom_kind;
1720 p->v.ImportFrom.module = module;
1721 p->v.ImportFrom.names = names;
1722 p->v.ImportFrom.level = level;
1723 p->lineno = lineno;
1724 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001725 p->end_lineno = end_lineno;
1726 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001727 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728}
1729
1730stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001731Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1732 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001733{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001734 stmt_ty p;
1735 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1736 if (!p)
1737 return NULL;
1738 p->kind = Global_kind;
1739 p->v.Global.names = names;
1740 p->lineno = lineno;
1741 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001742 p->end_lineno = end_lineno;
1743 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001744 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001745}
1746
1747stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001748Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1749 end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00001750{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001751 stmt_ty p;
1752 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1753 if (!p)
1754 return NULL;
1755 p->kind = Nonlocal_kind;
1756 p->v.Nonlocal.names = names;
1757 p->lineno = lineno;
1758 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001759 p->end_lineno = end_lineno;
1760 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001761 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001762}
1763
1764stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001765Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
1766 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001767{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001768 stmt_ty p;
1769 if (!value) {
1770 PyErr_SetString(PyExc_ValueError,
1771 "field value is required for Expr");
1772 return NULL;
1773 }
1774 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1775 if (!p)
1776 return NULL;
1777 p->kind = Expr_kind;
1778 p->v.Expr.value = value;
1779 p->lineno = lineno;
1780 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001781 p->end_lineno = end_lineno;
1782 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001783 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001784}
1785
1786stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001787Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1788 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001789{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001790 stmt_ty p;
1791 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1792 if (!p)
1793 return NULL;
1794 p->kind = Pass_kind;
1795 p->lineno = lineno;
1796 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001797 p->end_lineno = end_lineno;
1798 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001799 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800}
1801
1802stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001803Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1804 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001806 stmt_ty p;
1807 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1808 if (!p)
1809 return NULL;
1810 p->kind = Break_kind;
1811 p->lineno = lineno;
1812 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001813 p->end_lineno = end_lineno;
1814 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001815 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816}
1817
1818stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001819Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
1820 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001822 stmt_ty p;
1823 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1824 if (!p)
1825 return NULL;
1826 p->kind = Continue_kind;
1827 p->lineno = lineno;
1828 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001829 p->end_lineno = end_lineno;
1830 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001831 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832}
1833
1834expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001835BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int
1836 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001838 expr_ty p;
1839 if (!op) {
1840 PyErr_SetString(PyExc_ValueError,
1841 "field op is required for BoolOp");
1842 return NULL;
1843 }
1844 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1845 if (!p)
1846 return NULL;
1847 p->kind = BoolOp_kind;
1848 p->v.BoolOp.op = op;
1849 p->v.BoolOp.values = values;
1850 p->lineno = lineno;
1851 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001852 p->end_lineno = end_lineno;
1853 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001854 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855}
1856
1857expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001858NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
1859 end_lineno, int end_col_offset, PyArena *arena)
1860{
1861 expr_ty p;
1862 if (!target) {
1863 PyErr_SetString(PyExc_ValueError,
1864 "field target is required for NamedExpr");
1865 return NULL;
1866 }
1867 if (!value) {
1868 PyErr_SetString(PyExc_ValueError,
1869 "field value is required for NamedExpr");
1870 return NULL;
1871 }
1872 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1873 if (!p)
1874 return NULL;
1875 p->kind = NamedExpr_kind;
1876 p->v.NamedExpr.target = target;
1877 p->v.NamedExpr.value = value;
1878 p->lineno = lineno;
1879 p->col_offset = col_offset;
1880 p->end_lineno = end_lineno;
1881 p->end_col_offset = end_col_offset;
1882 return p;
1883}
1884
1885expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001886BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001887 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001889 expr_ty p;
1890 if (!left) {
1891 PyErr_SetString(PyExc_ValueError,
1892 "field left is required for BinOp");
1893 return NULL;
1894 }
1895 if (!op) {
1896 PyErr_SetString(PyExc_ValueError,
1897 "field op is required for BinOp");
1898 return NULL;
1899 }
1900 if (!right) {
1901 PyErr_SetString(PyExc_ValueError,
1902 "field right is required for BinOp");
1903 return NULL;
1904 }
1905 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1906 if (!p)
1907 return NULL;
1908 p->kind = BinOp_kind;
1909 p->v.BinOp.left = left;
1910 p->v.BinOp.op = op;
1911 p->v.BinOp.right = right;
1912 p->lineno = lineno;
1913 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001914 p->end_lineno = end_lineno;
1915 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001916 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917}
1918
1919expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001920UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
1921 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001923 expr_ty p;
1924 if (!op) {
1925 PyErr_SetString(PyExc_ValueError,
1926 "field op is required for UnaryOp");
1927 return NULL;
1928 }
1929 if (!operand) {
1930 PyErr_SetString(PyExc_ValueError,
1931 "field operand is required for UnaryOp");
1932 return NULL;
1933 }
1934 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1935 if (!p)
1936 return NULL;
1937 p->kind = UnaryOp_kind;
1938 p->v.UnaryOp.op = op;
1939 p->v.UnaryOp.operand = operand;
1940 p->lineno = lineno;
1941 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001942 p->end_lineno = end_lineno;
1943 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001944 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945}
1946
1947expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001948Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
1949 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001950{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001951 expr_ty p;
1952 if (!args) {
1953 PyErr_SetString(PyExc_ValueError,
1954 "field args is required for Lambda");
1955 return NULL;
1956 }
1957 if (!body) {
1958 PyErr_SetString(PyExc_ValueError,
1959 "field body is required for Lambda");
1960 return NULL;
1961 }
1962 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1963 if (!p)
1964 return NULL;
1965 p->kind = Lambda_kind;
1966 p->v.Lambda.args = args;
1967 p->v.Lambda.body = body;
1968 p->lineno = lineno;
1969 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001970 p->end_lineno = end_lineno;
1971 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001972 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973}
1974
1975expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001976IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001977 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001978{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001979 expr_ty p;
1980 if (!test) {
1981 PyErr_SetString(PyExc_ValueError,
1982 "field test is required for IfExp");
1983 return NULL;
1984 }
1985 if (!body) {
1986 PyErr_SetString(PyExc_ValueError,
1987 "field body is required for IfExp");
1988 return NULL;
1989 }
1990 if (!orelse) {
1991 PyErr_SetString(PyExc_ValueError,
1992 "field orelse is required for IfExp");
1993 return NULL;
1994 }
1995 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1996 if (!p)
1997 return NULL;
1998 p->kind = IfExp_kind;
1999 p->v.IfExp.test = test;
2000 p->v.IfExp.body = body;
2001 p->v.IfExp.orelse = orelse;
2002 p->lineno = lineno;
2003 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002004 p->end_lineno = end_lineno;
2005 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002006 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002007}
2008
2009expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002010Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int
2011 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002013 expr_ty p;
2014 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2015 if (!p)
2016 return NULL;
2017 p->kind = Dict_kind;
2018 p->v.Dict.keys = keys;
2019 p->v.Dict.values = values;
2020 p->lineno = lineno;
2021 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002022 p->end_lineno = end_lineno;
2023 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002024 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025}
2026
2027expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002028Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int
2029 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002030{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002031 expr_ty p;
2032 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2033 if (!p)
2034 return NULL;
2035 p->kind = Set_kind;
2036 p->v.Set.elts = elts;
2037 p->lineno = lineno;
2038 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002039 p->end_lineno = end_lineno;
2040 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002041 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002042}
2043
2044expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002045ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2046 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002048 expr_ty p;
2049 if (!elt) {
2050 PyErr_SetString(PyExc_ValueError,
2051 "field elt is required for ListComp");
2052 return NULL;
2053 }
2054 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2055 if (!p)
2056 return NULL;
2057 p->kind = ListComp_kind;
2058 p->v.ListComp.elt = elt;
2059 p->v.ListComp.generators = generators;
2060 p->lineno = lineno;
2061 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002062 p->end_lineno = end_lineno;
2063 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002064 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065}
2066
2067expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002068SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2069 end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002070{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002071 expr_ty p;
2072 if (!elt) {
2073 PyErr_SetString(PyExc_ValueError,
2074 "field elt is required for SetComp");
2075 return NULL;
2076 }
2077 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2078 if (!p)
2079 return NULL;
2080 p->kind = SetComp_kind;
2081 p->v.SetComp.elt = elt;
2082 p->v.SetComp.generators = generators;
2083 p->lineno = lineno;
2084 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002085 p->end_lineno = end_lineno;
2086 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002087 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002088}
2089
2090expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00002091DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002092 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002093{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002094 expr_ty p;
2095 if (!key) {
2096 PyErr_SetString(PyExc_ValueError,
2097 "field key is required for DictComp");
2098 return NULL;
2099 }
2100 if (!value) {
2101 PyErr_SetString(PyExc_ValueError,
2102 "field value is required for DictComp");
2103 return NULL;
2104 }
2105 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2106 if (!p)
2107 return NULL;
2108 p->kind = DictComp_kind;
2109 p->v.DictComp.key = key;
2110 p->v.DictComp.value = value;
2111 p->v.DictComp.generators = generators;
2112 p->lineno = lineno;
2113 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002114 p->end_lineno = end_lineno;
2115 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002116 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002117}
2118
2119expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002120GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002121 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002123 expr_ty p;
2124 if (!elt) {
2125 PyErr_SetString(PyExc_ValueError,
2126 "field elt is required for GeneratorExp");
2127 return NULL;
2128 }
2129 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2130 if (!p)
2131 return NULL;
2132 p->kind = GeneratorExp_kind;
2133 p->v.GeneratorExp.elt = elt;
2134 p->v.GeneratorExp.generators = generators;
2135 p->lineno = lineno;
2136 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002137 p->end_lineno = end_lineno;
2138 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002139 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140}
2141
2142expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002143Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2144 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002145{
2146 expr_ty p;
2147 if (!value) {
2148 PyErr_SetString(PyExc_ValueError,
2149 "field value is required for Await");
2150 return NULL;
2151 }
2152 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2153 if (!p)
2154 return NULL;
2155 p->kind = Await_kind;
2156 p->v.Await.value = value;
2157 p->lineno = lineno;
2158 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002159 p->end_lineno = end_lineno;
2160 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002161 return p;
2162}
2163
2164expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002165Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
2166 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002168 expr_ty p;
2169 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2170 if (!p)
2171 return NULL;
2172 p->kind = Yield_kind;
2173 p->v.Yield.value = value;
2174 p->lineno = lineno;
2175 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002176 p->end_lineno = end_lineno;
2177 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002178 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179}
2180
2181expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002182YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
2183 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05002184{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002185 expr_ty p;
2186 if (!value) {
2187 PyErr_SetString(PyExc_ValueError,
2188 "field value is required for YieldFrom");
2189 return NULL;
2190 }
2191 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2192 if (!p)
2193 return NULL;
2194 p->kind = YieldFrom_kind;
2195 p->v.YieldFrom.value = value;
2196 p->lineno = lineno;
2197 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002198 p->end_lineno = end_lineno;
2199 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002200 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002201}
2202
2203expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002204Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002205 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002207 expr_ty p;
2208 if (!left) {
2209 PyErr_SetString(PyExc_ValueError,
2210 "field left is required for Compare");
2211 return NULL;
2212 }
2213 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2214 if (!p)
2215 return NULL;
2216 p->kind = Compare_kind;
2217 p->v.Compare.left = left;
2218 p->v.Compare.ops = ops;
2219 p->v.Compare.comparators = comparators;
2220 p->lineno = lineno;
2221 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002222 p->end_lineno = end_lineno;
2223 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002224 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002225}
2226
2227expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002228Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002229 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002231 expr_ty p;
2232 if (!func) {
2233 PyErr_SetString(PyExc_ValueError,
2234 "field func is required for Call");
2235 return NULL;
2236 }
2237 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2238 if (!p)
2239 return NULL;
2240 p->kind = Call_kind;
2241 p->v.Call.func = func;
2242 p->v.Call.args = args;
2243 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002244 p->lineno = lineno;
2245 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002246 p->end_lineno = end_lineno;
2247 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002248 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249}
2250
2251expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002252FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002253 int col_offset, int end_lineno, int end_col_offset, PyArena
2254 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002255{
2256 expr_ty p;
2257 if (!value) {
2258 PyErr_SetString(PyExc_ValueError,
2259 "field value is required for FormattedValue");
2260 return NULL;
2261 }
2262 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2263 if (!p)
2264 return NULL;
2265 p->kind = FormattedValue_kind;
2266 p->v.FormattedValue.value = value;
2267 p->v.FormattedValue.conversion = conversion;
2268 p->v.FormattedValue.format_spec = format_spec;
2269 p->lineno = lineno;
2270 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002271 p->end_lineno = end_lineno;
2272 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002273 return p;
2274}
2275
2276expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002277JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int
2278 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002279{
2280 expr_ty p;
2281 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2282 if (!p)
2283 return NULL;
2284 p->kind = JoinedStr_kind;
2285 p->v.JoinedStr.values = values;
2286 p->lineno = lineno;
2287 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002288 p->end_lineno = end_lineno;
2289 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002290 return p;
2291}
2292
2293expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002294Constant(constant value, string kind, int lineno, int col_offset, int
2295 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002296{
2297 expr_ty p;
2298 if (!value) {
2299 PyErr_SetString(PyExc_ValueError,
2300 "field value is required for Constant");
2301 return NULL;
2302 }
2303 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2304 if (!p)
2305 return NULL;
2306 p->kind = Constant_kind;
2307 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002308 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002309 p->lineno = lineno;
2310 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002311 p->end_lineno = end_lineno;
2312 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002313 return p;
2314}
2315
2316expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002317Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002318 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002320 expr_ty p;
2321 if (!value) {
2322 PyErr_SetString(PyExc_ValueError,
2323 "field value is required for Attribute");
2324 return NULL;
2325 }
2326 if (!attr) {
2327 PyErr_SetString(PyExc_ValueError,
2328 "field attr is required for Attribute");
2329 return NULL;
2330 }
2331 if (!ctx) {
2332 PyErr_SetString(PyExc_ValueError,
2333 "field ctx is required for Attribute");
2334 return NULL;
2335 }
2336 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2337 if (!p)
2338 return NULL;
2339 p->kind = Attribute_kind;
2340 p->v.Attribute.value = value;
2341 p->v.Attribute.attr = attr;
2342 p->v.Attribute.ctx = ctx;
2343 p->lineno = lineno;
2344 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002345 p->end_lineno = end_lineno;
2346 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002347 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348}
2349
2350expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002351Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002352 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002354 expr_ty p;
2355 if (!value) {
2356 PyErr_SetString(PyExc_ValueError,
2357 "field value is required for Subscript");
2358 return NULL;
2359 }
2360 if (!slice) {
2361 PyErr_SetString(PyExc_ValueError,
2362 "field slice is required for Subscript");
2363 return NULL;
2364 }
2365 if (!ctx) {
2366 PyErr_SetString(PyExc_ValueError,
2367 "field ctx is required for Subscript");
2368 return NULL;
2369 }
2370 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2371 if (!p)
2372 return NULL;
2373 p->kind = Subscript_kind;
2374 p->v.Subscript.value = value;
2375 p->v.Subscript.slice = slice;
2376 p->v.Subscript.ctx = ctx;
2377 p->lineno = lineno;
2378 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002379 p->end_lineno = end_lineno;
2380 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002381 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002382}
2383
2384expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002385Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
2386 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00002387{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002388 expr_ty p;
2389 if (!value) {
2390 PyErr_SetString(PyExc_ValueError,
2391 "field value is required for Starred");
2392 return NULL;
2393 }
2394 if (!ctx) {
2395 PyErr_SetString(PyExc_ValueError,
2396 "field ctx is required for Starred");
2397 return NULL;
2398 }
2399 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2400 if (!p)
2401 return NULL;
2402 p->kind = Starred_kind;
2403 p->v.Starred.value = value;
2404 p->v.Starred.ctx = ctx;
2405 p->lineno = lineno;
2406 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002407 p->end_lineno = end_lineno;
2408 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002409 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002410}
2411
2412expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002413Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
2414 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002416 expr_ty p;
2417 if (!id) {
2418 PyErr_SetString(PyExc_ValueError,
2419 "field id is required for Name");
2420 return NULL;
2421 }
2422 if (!ctx) {
2423 PyErr_SetString(PyExc_ValueError,
2424 "field ctx is required for Name");
2425 return NULL;
2426 }
2427 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2428 if (!p)
2429 return NULL;
2430 p->kind = Name_kind;
2431 p->v.Name.id = id;
2432 p->v.Name.ctx = ctx;
2433 p->lineno = lineno;
2434 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002435 p->end_lineno = end_lineno;
2436 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002437 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002438}
2439
2440expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002441List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2442 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002444 expr_ty p;
2445 if (!ctx) {
2446 PyErr_SetString(PyExc_ValueError,
2447 "field ctx is required for List");
2448 return NULL;
2449 }
2450 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2451 if (!p)
2452 return NULL;
2453 p->kind = List_kind;
2454 p->v.List.elts = elts;
2455 p->v.List.ctx = ctx;
2456 p->lineno = lineno;
2457 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002458 p->end_lineno = end_lineno;
2459 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002460 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461}
2462
2463expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002464Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2465 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002467 expr_ty p;
2468 if (!ctx) {
2469 PyErr_SetString(PyExc_ValueError,
2470 "field ctx is required for Tuple");
2471 return NULL;
2472 }
2473 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2474 if (!p)
2475 return NULL;
2476 p->kind = Tuple_kind;
2477 p->v.Tuple.elts = elts;
2478 p->v.Tuple.ctx = ctx;
2479 p->lineno = lineno;
2480 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002481 p->end_lineno = end_lineno;
2482 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002483 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002484}
2485
2486slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002487Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002489 slice_ty p;
2490 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2491 if (!p)
2492 return NULL;
2493 p->kind = Slice_kind;
2494 p->v.Slice.lower = lower;
2495 p->v.Slice.upper = upper;
2496 p->v.Slice.step = step;
2497 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498}
2499
2500slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002501ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002503 slice_ty p;
2504 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2505 if (!p)
2506 return NULL;
2507 p->kind = ExtSlice_kind;
2508 p->v.ExtSlice.dims = dims;
2509 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510}
2511
2512slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002513Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002515 slice_ty p;
2516 if (!value) {
2517 PyErr_SetString(PyExc_ValueError,
2518 "field value is required for Index");
2519 return NULL;
2520 }
2521 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2522 if (!p)
2523 return NULL;
2524 p->kind = Index_kind;
2525 p->v.Index.value = value;
2526 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002527}
2528
2529comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002530comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2531 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002533 comprehension_ty p;
2534 if (!target) {
2535 PyErr_SetString(PyExc_ValueError,
2536 "field target is required for comprehension");
2537 return NULL;
2538 }
2539 if (!iter) {
2540 PyErr_SetString(PyExc_ValueError,
2541 "field iter is required for comprehension");
2542 return NULL;
2543 }
2544 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2545 if (!p)
2546 return NULL;
2547 p->target = target;
2548 p->iter = iter;
2549 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002550 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002551 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552}
2553
2554excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002555ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002556 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002558 excepthandler_ty p;
2559 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2560 if (!p)
2561 return NULL;
2562 p->kind = ExceptHandler_kind;
2563 p->v.ExceptHandler.type = type;
2564 p->v.ExceptHandler.name = name;
2565 p->v.ExceptHandler.body = body;
2566 p->lineno = lineno;
2567 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002568 p->end_lineno = end_lineno;
2569 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002570 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571}
2572
2573arguments_ty
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002574arguments(asdl_seq * args, asdl_seq * posonlyargs, arg_ty vararg, asdl_seq *
2575 kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, asdl_seq *
2576 defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002578 arguments_ty p;
2579 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2580 if (!p)
2581 return NULL;
2582 p->args = args;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002583 p->posonlyargs = posonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002584 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002585 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002586 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002587 p->kwarg = kwarg;
2588 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002589 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590}
2591
Neal Norwitzc1505362006-12-28 06:47:50 +00002592arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002593arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
2594 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002595{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002596 arg_ty p;
2597 if (!arg) {
2598 PyErr_SetString(PyExc_ValueError,
2599 "field arg is required for arg");
2600 return NULL;
2601 }
2602 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2603 if (!p)
2604 return NULL;
2605 p->arg = arg;
2606 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002607 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01002608 p->lineno = lineno;
2609 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002610 p->end_lineno = end_lineno;
2611 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002612 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002613}
2614
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002616keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002618 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002619 if (!value) {
2620 PyErr_SetString(PyExc_ValueError,
2621 "field value is required for keyword");
2622 return NULL;
2623 }
2624 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2625 if (!p)
2626 return NULL;
2627 p->arg = arg;
2628 p->value = value;
2629 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630}
2631
2632alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002633alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002635 alias_ty p;
2636 if (!name) {
2637 PyErr_SetString(PyExc_ValueError,
2638 "field name is required for alias");
2639 return NULL;
2640 }
2641 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2642 if (!p)
2643 return NULL;
2644 p->name = name;
2645 p->asname = asname;
2646 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647}
2648
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002649withitem_ty
2650withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2651{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002652 withitem_ty p;
2653 if (!context_expr) {
2654 PyErr_SetString(PyExc_ValueError,
2655 "field context_expr is required for withitem");
2656 return NULL;
2657 }
2658 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2659 if (!p)
2660 return NULL;
2661 p->context_expr = context_expr;
2662 p->optional_vars = optional_vars;
2663 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002664}
2665
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002666type_ignore_ty
2667TypeIgnore(int lineno, PyArena *arena)
2668{
2669 type_ignore_ty p;
2670 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
2671 if (!p)
2672 return NULL;
2673 p->kind = TypeIgnore_kind;
2674 p->v.TypeIgnore.lineno = lineno;
2675 return p;
2676}
2677
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002678
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002679PyObject*
2680ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002681{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002682 mod_ty o = (mod_ty)_o;
2683 PyObject *result = NULL, *value = NULL;
2684 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002685 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002686 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002687
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002688 switch (o->kind) {
2689 case Module_kind:
2690 result = PyType_GenericNew(Module_type, NULL, NULL);
2691 if (!result) goto failed;
2692 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2693 if (!value) goto failed;
2694 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2695 goto failed;
2696 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002697 value = ast2obj_list(o->v.Module.type_ignores, ast2obj_type_ignore);
2698 if (!value) goto failed;
2699 if (_PyObject_SetAttrId(result, &PyId_type_ignores, value) == -1)
2700 goto failed;
2701 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002702 break;
2703 case Interactive_kind:
2704 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2705 if (!result) goto failed;
2706 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2707 if (!value) goto failed;
2708 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2709 goto failed;
2710 Py_DECREF(value);
2711 break;
2712 case Expression_kind:
2713 result = PyType_GenericNew(Expression_type, NULL, NULL);
2714 if (!result) goto failed;
2715 value = ast2obj_expr(o->v.Expression.body);
2716 if (!value) goto failed;
2717 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2718 goto failed;
2719 Py_DECREF(value);
2720 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002721 case FunctionType_kind:
2722 result = PyType_GenericNew(FunctionType_type, NULL, NULL);
2723 if (!result) goto failed;
2724 value = ast2obj_list(o->v.FunctionType.argtypes, ast2obj_expr);
2725 if (!value) goto failed;
2726 if (_PyObject_SetAttrId(result, &PyId_argtypes, value) == -1)
2727 goto failed;
2728 Py_DECREF(value);
2729 value = ast2obj_expr(o->v.FunctionType.returns);
2730 if (!value) goto failed;
2731 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2732 goto failed;
2733 Py_DECREF(value);
2734 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002735 case Suite_kind:
2736 result = PyType_GenericNew(Suite_type, NULL, NULL);
2737 if (!result) goto failed;
2738 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2739 if (!value) goto failed;
2740 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2741 goto failed;
2742 Py_DECREF(value);
2743 break;
2744 }
2745 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002746failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002747 Py_XDECREF(value);
2748 Py_XDECREF(result);
2749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750}
2751
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002752PyObject*
2753ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002755 stmt_ty o = (stmt_ty)_o;
2756 PyObject *result = NULL, *value = NULL;
2757 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002758 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002759 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002760
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002761 switch (o->kind) {
2762 case FunctionDef_kind:
2763 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2764 if (!result) goto failed;
2765 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002766 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002767 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2768 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002769 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002770 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002771 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002772 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2773 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002774 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002775 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2776 if (!value) goto failed;
2777 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2778 goto failed;
2779 Py_DECREF(value);
2780 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2781 if (!value) goto failed;
2782 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2783 goto failed;
2784 Py_DECREF(value);
2785 value = ast2obj_expr(o->v.FunctionDef.returns);
2786 if (!value) goto failed;
2787 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2788 goto failed;
2789 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002790 value = ast2obj_string(o->v.FunctionDef.type_comment);
2791 if (!value) goto failed;
2792 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2793 goto failed;
2794 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002795 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002796 case AsyncFunctionDef_kind:
2797 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2798 if (!result) goto failed;
2799 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2800 if (!value) goto failed;
2801 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2802 goto failed;
2803 Py_DECREF(value);
2804 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2805 if (!value) goto failed;
2806 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2807 goto failed;
2808 Py_DECREF(value);
2809 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2810 if (!value) goto failed;
2811 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2812 goto failed;
2813 Py_DECREF(value);
2814 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2815 ast2obj_expr);
2816 if (!value) goto failed;
2817 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2818 goto failed;
2819 Py_DECREF(value);
2820 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2821 if (!value) goto failed;
2822 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2823 goto failed;
2824 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002825 value = ast2obj_string(o->v.AsyncFunctionDef.type_comment);
2826 if (!value) goto failed;
2827 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2828 goto failed;
2829 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002830 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002831 case ClassDef_kind:
2832 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2833 if (!result) goto failed;
2834 value = ast2obj_identifier(o->v.ClassDef.name);
2835 if (!value) goto failed;
2836 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2837 goto failed;
2838 Py_DECREF(value);
2839 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2840 if (!value) goto failed;
2841 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2842 goto failed;
2843 Py_DECREF(value);
2844 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2845 if (!value) goto failed;
2846 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2847 goto failed;
2848 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002849 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2850 if (!value) goto failed;
2851 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2852 goto failed;
2853 Py_DECREF(value);
2854 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2855 if (!value) goto failed;
2856 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2857 goto failed;
2858 Py_DECREF(value);
2859 break;
2860 case Return_kind:
2861 result = PyType_GenericNew(Return_type, NULL, NULL);
2862 if (!result) goto failed;
2863 value = ast2obj_expr(o->v.Return.value);
2864 if (!value) goto failed;
2865 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2866 goto failed;
2867 Py_DECREF(value);
2868 break;
2869 case Delete_kind:
2870 result = PyType_GenericNew(Delete_type, NULL, NULL);
2871 if (!result) goto failed;
2872 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2873 if (!value) goto failed;
2874 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2875 goto failed;
2876 Py_DECREF(value);
2877 break;
2878 case Assign_kind:
2879 result = PyType_GenericNew(Assign_type, NULL, NULL);
2880 if (!result) goto failed;
2881 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2882 if (!value) goto failed;
2883 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2884 goto failed;
2885 Py_DECREF(value);
2886 value = ast2obj_expr(o->v.Assign.value);
2887 if (!value) goto failed;
2888 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2889 goto failed;
2890 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002891 value = ast2obj_string(o->v.Assign.type_comment);
2892 if (!value) goto failed;
2893 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2894 goto failed;
2895 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002896 break;
2897 case AugAssign_kind:
2898 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2899 if (!result) goto failed;
2900 value = ast2obj_expr(o->v.AugAssign.target);
2901 if (!value) goto failed;
2902 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2903 goto failed;
2904 Py_DECREF(value);
2905 value = ast2obj_operator(o->v.AugAssign.op);
2906 if (!value) goto failed;
2907 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2908 goto failed;
2909 Py_DECREF(value);
2910 value = ast2obj_expr(o->v.AugAssign.value);
2911 if (!value) goto failed;
2912 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2913 goto failed;
2914 Py_DECREF(value);
2915 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002916 case AnnAssign_kind:
2917 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2918 if (!result) goto failed;
2919 value = ast2obj_expr(o->v.AnnAssign.target);
2920 if (!value) goto failed;
2921 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2922 goto failed;
2923 Py_DECREF(value);
2924 value = ast2obj_expr(o->v.AnnAssign.annotation);
2925 if (!value) goto failed;
2926 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2927 goto failed;
2928 Py_DECREF(value);
2929 value = ast2obj_expr(o->v.AnnAssign.value);
2930 if (!value) goto failed;
2931 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2932 goto failed;
2933 Py_DECREF(value);
2934 value = ast2obj_int(o->v.AnnAssign.simple);
2935 if (!value) goto failed;
2936 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2937 goto failed;
2938 Py_DECREF(value);
2939 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002940 case For_kind:
2941 result = PyType_GenericNew(For_type, NULL, NULL);
2942 if (!result) goto failed;
2943 value = ast2obj_expr(o->v.For.target);
2944 if (!value) goto failed;
2945 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2946 goto failed;
2947 Py_DECREF(value);
2948 value = ast2obj_expr(o->v.For.iter);
2949 if (!value) goto failed;
2950 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2951 goto failed;
2952 Py_DECREF(value);
2953 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2954 if (!value) goto failed;
2955 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2956 goto failed;
2957 Py_DECREF(value);
2958 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2959 if (!value) goto failed;
2960 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2961 goto failed;
2962 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002963 value = ast2obj_string(o->v.For.type_comment);
2964 if (!value) goto failed;
2965 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2966 goto failed;
2967 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002968 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002969 case AsyncFor_kind:
2970 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2971 if (!result) goto failed;
2972 value = ast2obj_expr(o->v.AsyncFor.target);
2973 if (!value) goto failed;
2974 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2975 goto failed;
2976 Py_DECREF(value);
2977 value = ast2obj_expr(o->v.AsyncFor.iter);
2978 if (!value) goto failed;
2979 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2980 goto failed;
2981 Py_DECREF(value);
2982 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2983 if (!value) goto failed;
2984 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2985 goto failed;
2986 Py_DECREF(value);
2987 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2988 if (!value) goto failed;
2989 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2990 goto failed;
2991 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002992 value = ast2obj_string(o->v.AsyncFor.type_comment);
2993 if (!value) goto failed;
2994 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2995 goto failed;
2996 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002997 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002998 case While_kind:
2999 result = PyType_GenericNew(While_type, NULL, NULL);
3000 if (!result) goto failed;
3001 value = ast2obj_expr(o->v.While.test);
3002 if (!value) goto failed;
3003 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3004 goto failed;
3005 Py_DECREF(value);
3006 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
3007 if (!value) goto failed;
3008 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3009 goto failed;
3010 Py_DECREF(value);
3011 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
3012 if (!value) goto failed;
3013 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3014 goto failed;
3015 Py_DECREF(value);
3016 break;
3017 case If_kind:
3018 result = PyType_GenericNew(If_type, NULL, NULL);
3019 if (!result) goto failed;
3020 value = ast2obj_expr(o->v.If.test);
3021 if (!value) goto failed;
3022 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3023 goto failed;
3024 Py_DECREF(value);
3025 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
3026 if (!value) goto failed;
3027 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3028 goto failed;
3029 Py_DECREF(value);
3030 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
3031 if (!value) goto failed;
3032 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3033 goto failed;
3034 Py_DECREF(value);
3035 break;
3036 case With_kind:
3037 result = PyType_GenericNew(With_type, NULL, NULL);
3038 if (!result) goto failed;
3039 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
3040 if (!value) goto failed;
3041 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3042 goto failed;
3043 Py_DECREF(value);
3044 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
3045 if (!value) goto failed;
3046 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3047 goto failed;
3048 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003049 value = ast2obj_string(o->v.With.type_comment);
3050 if (!value) goto failed;
3051 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3052 goto failed;
3053 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003054 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003055 case AsyncWith_kind:
3056 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
3057 if (!result) goto failed;
3058 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
3059 if (!value) goto failed;
3060 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3061 goto failed;
3062 Py_DECREF(value);
3063 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
3064 if (!value) goto failed;
3065 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3066 goto failed;
3067 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003068 value = ast2obj_string(o->v.AsyncWith.type_comment);
3069 if (!value) goto failed;
3070 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3071 goto failed;
3072 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003073 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003074 case Raise_kind:
3075 result = PyType_GenericNew(Raise_type, NULL, NULL);
3076 if (!result) goto failed;
3077 value = ast2obj_expr(o->v.Raise.exc);
3078 if (!value) goto failed;
3079 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
3080 goto failed;
3081 Py_DECREF(value);
3082 value = ast2obj_expr(o->v.Raise.cause);
3083 if (!value) goto failed;
3084 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
3085 goto failed;
3086 Py_DECREF(value);
3087 break;
3088 case Try_kind:
3089 result = PyType_GenericNew(Try_type, NULL, NULL);
3090 if (!result) goto failed;
3091 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
3092 if (!value) goto failed;
3093 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3094 goto failed;
3095 Py_DECREF(value);
3096 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
3097 if (!value) goto failed;
3098 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
3099 goto failed;
3100 Py_DECREF(value);
3101 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
3102 if (!value) goto failed;
3103 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3104 goto failed;
3105 Py_DECREF(value);
3106 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
3107 if (!value) goto failed;
3108 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
3109 goto failed;
3110 Py_DECREF(value);
3111 break;
3112 case Assert_kind:
3113 result = PyType_GenericNew(Assert_type, NULL, NULL);
3114 if (!result) goto failed;
3115 value = ast2obj_expr(o->v.Assert.test);
3116 if (!value) goto failed;
3117 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3118 goto failed;
3119 Py_DECREF(value);
3120 value = ast2obj_expr(o->v.Assert.msg);
3121 if (!value) goto failed;
3122 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
3123 goto failed;
3124 Py_DECREF(value);
3125 break;
3126 case Import_kind:
3127 result = PyType_GenericNew(Import_type, NULL, NULL);
3128 if (!result) goto failed;
3129 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
3130 if (!value) goto failed;
3131 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3132 goto failed;
3133 Py_DECREF(value);
3134 break;
3135 case ImportFrom_kind:
3136 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
3137 if (!result) goto failed;
3138 value = ast2obj_identifier(o->v.ImportFrom.module);
3139 if (!value) goto failed;
3140 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
3141 goto failed;
3142 Py_DECREF(value);
3143 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
3144 if (!value) goto failed;
3145 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3146 goto failed;
3147 Py_DECREF(value);
3148 value = ast2obj_int(o->v.ImportFrom.level);
3149 if (!value) goto failed;
3150 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
3151 goto failed;
3152 Py_DECREF(value);
3153 break;
3154 case Global_kind:
3155 result = PyType_GenericNew(Global_type, NULL, NULL);
3156 if (!result) goto failed;
3157 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
3158 if (!value) goto failed;
3159 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3160 goto failed;
3161 Py_DECREF(value);
3162 break;
3163 case Nonlocal_kind:
3164 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3165 if (!result) goto failed;
3166 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3167 if (!value) goto failed;
3168 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3169 goto failed;
3170 Py_DECREF(value);
3171 break;
3172 case Expr_kind:
3173 result = PyType_GenericNew(Expr_type, NULL, NULL);
3174 if (!result) goto failed;
3175 value = ast2obj_expr(o->v.Expr.value);
3176 if (!value) goto failed;
3177 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3178 goto failed;
3179 Py_DECREF(value);
3180 break;
3181 case Pass_kind:
3182 result = PyType_GenericNew(Pass_type, NULL, NULL);
3183 if (!result) goto failed;
3184 break;
3185 case Break_kind:
3186 result = PyType_GenericNew(Break_type, NULL, NULL);
3187 if (!result) goto failed;
3188 break;
3189 case Continue_kind:
3190 result = PyType_GenericNew(Continue_type, NULL, NULL);
3191 if (!result) goto failed;
3192 break;
3193 }
3194 value = ast2obj_int(o->lineno);
3195 if (!value) goto failed;
3196 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3197 goto failed;
3198 Py_DECREF(value);
3199 value = ast2obj_int(o->col_offset);
3200 if (!value) goto failed;
3201 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3202 goto failed;
3203 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003204 value = ast2obj_int(o->end_lineno);
3205 if (!value) goto failed;
3206 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3207 goto failed;
3208 Py_DECREF(value);
3209 value = ast2obj_int(o->end_col_offset);
3210 if (!value) goto failed;
3211 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3212 goto failed;
3213 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003214 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003215failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003216 Py_XDECREF(value);
3217 Py_XDECREF(result);
3218 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219}
3220
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003221PyObject*
3222ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003224 expr_ty o = (expr_ty)_o;
3225 PyObject *result = NULL, *value = NULL;
3226 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003227 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003228 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003229
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003230 switch (o->kind) {
3231 case BoolOp_kind:
3232 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3233 if (!result) goto failed;
3234 value = ast2obj_boolop(o->v.BoolOp.op);
3235 if (!value) goto failed;
3236 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3237 goto failed;
3238 Py_DECREF(value);
3239 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3240 if (!value) goto failed;
3241 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3242 goto failed;
3243 Py_DECREF(value);
3244 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003245 case NamedExpr_kind:
3246 result = PyType_GenericNew(NamedExpr_type, NULL, NULL);
3247 if (!result) goto failed;
3248 value = ast2obj_expr(o->v.NamedExpr.target);
3249 if (!value) goto failed;
3250 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3251 goto failed;
3252 Py_DECREF(value);
3253 value = ast2obj_expr(o->v.NamedExpr.value);
3254 if (!value) goto failed;
3255 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3256 goto failed;
3257 Py_DECREF(value);
3258 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003259 case BinOp_kind:
3260 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3261 if (!result) goto failed;
3262 value = ast2obj_expr(o->v.BinOp.left);
3263 if (!value) goto failed;
3264 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3265 goto failed;
3266 Py_DECREF(value);
3267 value = ast2obj_operator(o->v.BinOp.op);
3268 if (!value) goto failed;
3269 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3270 goto failed;
3271 Py_DECREF(value);
3272 value = ast2obj_expr(o->v.BinOp.right);
3273 if (!value) goto failed;
3274 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3275 goto failed;
3276 Py_DECREF(value);
3277 break;
3278 case UnaryOp_kind:
3279 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3280 if (!result) goto failed;
3281 value = ast2obj_unaryop(o->v.UnaryOp.op);
3282 if (!value) goto failed;
3283 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3284 goto failed;
3285 Py_DECREF(value);
3286 value = ast2obj_expr(o->v.UnaryOp.operand);
3287 if (!value) goto failed;
3288 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3289 goto failed;
3290 Py_DECREF(value);
3291 break;
3292 case Lambda_kind:
3293 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3294 if (!result) goto failed;
3295 value = ast2obj_arguments(o->v.Lambda.args);
3296 if (!value) goto failed;
3297 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3298 goto failed;
3299 Py_DECREF(value);
3300 value = ast2obj_expr(o->v.Lambda.body);
3301 if (!value) goto failed;
3302 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3303 goto failed;
3304 Py_DECREF(value);
3305 break;
3306 case IfExp_kind:
3307 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3308 if (!result) goto failed;
3309 value = ast2obj_expr(o->v.IfExp.test);
3310 if (!value) goto failed;
3311 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3312 goto failed;
3313 Py_DECREF(value);
3314 value = ast2obj_expr(o->v.IfExp.body);
3315 if (!value) goto failed;
3316 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3317 goto failed;
3318 Py_DECREF(value);
3319 value = ast2obj_expr(o->v.IfExp.orelse);
3320 if (!value) goto failed;
3321 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3322 goto failed;
3323 Py_DECREF(value);
3324 break;
3325 case Dict_kind:
3326 result = PyType_GenericNew(Dict_type, NULL, NULL);
3327 if (!result) goto failed;
3328 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3329 if (!value) goto failed;
3330 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3331 goto failed;
3332 Py_DECREF(value);
3333 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3334 if (!value) goto failed;
3335 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3336 goto failed;
3337 Py_DECREF(value);
3338 break;
3339 case Set_kind:
3340 result = PyType_GenericNew(Set_type, NULL, NULL);
3341 if (!result) goto failed;
3342 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3343 if (!value) goto failed;
3344 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3345 goto failed;
3346 Py_DECREF(value);
3347 break;
3348 case ListComp_kind:
3349 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3350 if (!result) goto failed;
3351 value = ast2obj_expr(o->v.ListComp.elt);
3352 if (!value) goto failed;
3353 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3354 goto failed;
3355 Py_DECREF(value);
3356 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3357 if (!value) goto failed;
3358 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3359 goto failed;
3360 Py_DECREF(value);
3361 break;
3362 case SetComp_kind:
3363 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3364 if (!result) goto failed;
3365 value = ast2obj_expr(o->v.SetComp.elt);
3366 if (!value) goto failed;
3367 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3368 goto failed;
3369 Py_DECREF(value);
3370 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3371 if (!value) goto failed;
3372 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3373 goto failed;
3374 Py_DECREF(value);
3375 break;
3376 case DictComp_kind:
3377 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3378 if (!result) goto failed;
3379 value = ast2obj_expr(o->v.DictComp.key);
3380 if (!value) goto failed;
3381 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3382 goto failed;
3383 Py_DECREF(value);
3384 value = ast2obj_expr(o->v.DictComp.value);
3385 if (!value) goto failed;
3386 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3387 goto failed;
3388 Py_DECREF(value);
3389 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3390 if (!value) goto failed;
3391 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3392 goto failed;
3393 Py_DECREF(value);
3394 break;
3395 case GeneratorExp_kind:
3396 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3397 if (!result) goto failed;
3398 value = ast2obj_expr(o->v.GeneratorExp.elt);
3399 if (!value) goto failed;
3400 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3401 goto failed;
3402 Py_DECREF(value);
3403 value = ast2obj_list(o->v.GeneratorExp.generators,
3404 ast2obj_comprehension);
3405 if (!value) goto failed;
3406 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3407 goto failed;
3408 Py_DECREF(value);
3409 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003410 case Await_kind:
3411 result = PyType_GenericNew(Await_type, NULL, NULL);
3412 if (!result) goto failed;
3413 value = ast2obj_expr(o->v.Await.value);
3414 if (!value) goto failed;
3415 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3416 goto failed;
3417 Py_DECREF(value);
3418 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003419 case Yield_kind:
3420 result = PyType_GenericNew(Yield_type, NULL, NULL);
3421 if (!result) goto failed;
3422 value = ast2obj_expr(o->v.Yield.value);
3423 if (!value) goto failed;
3424 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3425 goto failed;
3426 Py_DECREF(value);
3427 break;
3428 case YieldFrom_kind:
3429 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3430 if (!result) goto failed;
3431 value = ast2obj_expr(o->v.YieldFrom.value);
3432 if (!value) goto failed;
3433 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3434 goto failed;
3435 Py_DECREF(value);
3436 break;
3437 case Compare_kind:
3438 result = PyType_GenericNew(Compare_type, NULL, NULL);
3439 if (!result) goto failed;
3440 value = ast2obj_expr(o->v.Compare.left);
3441 if (!value) goto failed;
3442 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3443 goto failed;
3444 Py_DECREF(value);
3445 {
3446 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3447 value = PyList_New(n);
3448 if (!value) goto failed;
3449 for(i = 0; i < n; i++)
3450 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003451 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003452 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003453 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3454 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003455 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003456 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003457 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003458 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3459 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003460 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003461 break;
3462 case Call_kind:
3463 result = PyType_GenericNew(Call_type, NULL, NULL);
3464 if (!result) goto failed;
3465 value = ast2obj_expr(o->v.Call.func);
3466 if (!value) goto failed;
3467 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3468 goto failed;
3469 Py_DECREF(value);
3470 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3471 if (!value) goto failed;
3472 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3473 goto failed;
3474 Py_DECREF(value);
3475 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3476 if (!value) goto failed;
3477 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3478 goto failed;
3479 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003480 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003481 case FormattedValue_kind:
3482 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3483 if (!result) goto failed;
3484 value = ast2obj_expr(o->v.FormattedValue.value);
3485 if (!value) goto failed;
3486 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3487 goto failed;
3488 Py_DECREF(value);
3489 value = ast2obj_int(o->v.FormattedValue.conversion);
3490 if (!value) goto failed;
3491 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3492 goto failed;
3493 Py_DECREF(value);
3494 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3495 if (!value) goto failed;
3496 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3497 goto failed;
3498 Py_DECREF(value);
3499 break;
3500 case JoinedStr_kind:
3501 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3502 if (!result) goto failed;
3503 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3504 if (!value) goto failed;
3505 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3506 goto failed;
3507 Py_DECREF(value);
3508 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003509 case Constant_kind:
3510 result = PyType_GenericNew(Constant_type, NULL, NULL);
3511 if (!result) goto failed;
3512 value = ast2obj_constant(o->v.Constant.value);
3513 if (!value) goto failed;
3514 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3515 goto failed;
3516 Py_DECREF(value);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003517 value = ast2obj_string(o->v.Constant.kind);
3518 if (!value) goto failed;
3519 if (_PyObject_SetAttrId(result, &PyId_kind, value) == -1)
3520 goto failed;
3521 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003522 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003523 case Attribute_kind:
3524 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3525 if (!result) goto failed;
3526 value = ast2obj_expr(o->v.Attribute.value);
3527 if (!value) goto failed;
3528 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3529 goto failed;
3530 Py_DECREF(value);
3531 value = ast2obj_identifier(o->v.Attribute.attr);
3532 if (!value) goto failed;
3533 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3534 goto failed;
3535 Py_DECREF(value);
3536 value = ast2obj_expr_context(o->v.Attribute.ctx);
3537 if (!value) goto failed;
3538 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3539 goto failed;
3540 Py_DECREF(value);
3541 break;
3542 case Subscript_kind:
3543 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3544 if (!result) goto failed;
3545 value = ast2obj_expr(o->v.Subscript.value);
3546 if (!value) goto failed;
3547 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3548 goto failed;
3549 Py_DECREF(value);
3550 value = ast2obj_slice(o->v.Subscript.slice);
3551 if (!value) goto failed;
3552 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3553 goto failed;
3554 Py_DECREF(value);
3555 value = ast2obj_expr_context(o->v.Subscript.ctx);
3556 if (!value) goto failed;
3557 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3558 goto failed;
3559 Py_DECREF(value);
3560 break;
3561 case Starred_kind:
3562 result = PyType_GenericNew(Starred_type, NULL, NULL);
3563 if (!result) goto failed;
3564 value = ast2obj_expr(o->v.Starred.value);
3565 if (!value) goto failed;
3566 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3567 goto failed;
3568 Py_DECREF(value);
3569 value = ast2obj_expr_context(o->v.Starred.ctx);
3570 if (!value) goto failed;
3571 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3572 goto failed;
3573 Py_DECREF(value);
3574 break;
3575 case Name_kind:
3576 result = PyType_GenericNew(Name_type, NULL, NULL);
3577 if (!result) goto failed;
3578 value = ast2obj_identifier(o->v.Name.id);
3579 if (!value) goto failed;
3580 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3581 goto failed;
3582 Py_DECREF(value);
3583 value = ast2obj_expr_context(o->v.Name.ctx);
3584 if (!value) goto failed;
3585 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3586 goto failed;
3587 Py_DECREF(value);
3588 break;
3589 case List_kind:
3590 result = PyType_GenericNew(List_type, NULL, NULL);
3591 if (!result) goto failed;
3592 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3593 if (!value) goto failed;
3594 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3595 goto failed;
3596 Py_DECREF(value);
3597 value = ast2obj_expr_context(o->v.List.ctx);
3598 if (!value) goto failed;
3599 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3600 goto failed;
3601 Py_DECREF(value);
3602 break;
3603 case Tuple_kind:
3604 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3605 if (!result) goto failed;
3606 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3607 if (!value) goto failed;
3608 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3609 goto failed;
3610 Py_DECREF(value);
3611 value = ast2obj_expr_context(o->v.Tuple.ctx);
3612 if (!value) goto failed;
3613 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3614 goto failed;
3615 Py_DECREF(value);
3616 break;
3617 }
3618 value = ast2obj_int(o->lineno);
3619 if (!value) goto failed;
3620 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3621 goto failed;
3622 Py_DECREF(value);
3623 value = ast2obj_int(o->col_offset);
3624 if (!value) goto failed;
3625 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3626 goto failed;
3627 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003628 value = ast2obj_int(o->end_lineno);
3629 if (!value) goto failed;
3630 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3631 goto failed;
3632 Py_DECREF(value);
3633 value = ast2obj_int(o->end_col_offset);
3634 if (!value) goto failed;
3635 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3636 goto failed;
3637 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003638 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003639failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003640 Py_XDECREF(value);
3641 Py_XDECREF(result);
3642 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643}
3644
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003645PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003646{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003647 switch(o) {
3648 case Load:
3649 Py_INCREF(Load_singleton);
3650 return Load_singleton;
3651 case Store:
3652 Py_INCREF(Store_singleton);
3653 return Store_singleton;
3654 case Del:
3655 Py_INCREF(Del_singleton);
3656 return Del_singleton;
3657 case AugLoad:
3658 Py_INCREF(AugLoad_singleton);
3659 return AugLoad_singleton;
3660 case AugStore:
3661 Py_INCREF(AugStore_singleton);
3662 return AugStore_singleton;
3663 case Param:
3664 Py_INCREF(Param_singleton);
3665 return Param_singleton;
3666 default:
3667 /* should never happen, but just in case ... */
3668 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3669 return NULL;
3670 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003672PyObject*
3673ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003675 slice_ty o = (slice_ty)_o;
3676 PyObject *result = NULL, *value = NULL;
3677 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003678 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003679 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003680
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003681 switch (o->kind) {
3682 case Slice_kind:
3683 result = PyType_GenericNew(Slice_type, NULL, NULL);
3684 if (!result) goto failed;
3685 value = ast2obj_expr(o->v.Slice.lower);
3686 if (!value) goto failed;
3687 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3688 goto failed;
3689 Py_DECREF(value);
3690 value = ast2obj_expr(o->v.Slice.upper);
3691 if (!value) goto failed;
3692 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3693 goto failed;
3694 Py_DECREF(value);
3695 value = ast2obj_expr(o->v.Slice.step);
3696 if (!value) goto failed;
3697 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3698 goto failed;
3699 Py_DECREF(value);
3700 break;
3701 case ExtSlice_kind:
3702 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3703 if (!result) goto failed;
3704 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3705 if (!value) goto failed;
3706 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3707 goto failed;
3708 Py_DECREF(value);
3709 break;
3710 case Index_kind:
3711 result = PyType_GenericNew(Index_type, NULL, NULL);
3712 if (!result) goto failed;
3713 value = ast2obj_expr(o->v.Index.value);
3714 if (!value) goto failed;
3715 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3716 goto failed;
3717 Py_DECREF(value);
3718 break;
3719 }
3720 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003721failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003722 Py_XDECREF(value);
3723 Py_XDECREF(result);
3724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003725}
3726
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003727PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003728{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003729 switch(o) {
3730 case And:
3731 Py_INCREF(And_singleton);
3732 return And_singleton;
3733 case Or:
3734 Py_INCREF(Or_singleton);
3735 return Or_singleton;
3736 default:
3737 /* should never happen, but just in case ... */
3738 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3739 return NULL;
3740 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003741}
3742PyObject* ast2obj_operator(operator_ty o)
3743{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003744 switch(o) {
3745 case Add:
3746 Py_INCREF(Add_singleton);
3747 return Add_singleton;
3748 case Sub:
3749 Py_INCREF(Sub_singleton);
3750 return Sub_singleton;
3751 case Mult:
3752 Py_INCREF(Mult_singleton);
3753 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003754 case MatMult:
3755 Py_INCREF(MatMult_singleton);
3756 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003757 case Div:
3758 Py_INCREF(Div_singleton);
3759 return Div_singleton;
3760 case Mod:
3761 Py_INCREF(Mod_singleton);
3762 return Mod_singleton;
3763 case Pow:
3764 Py_INCREF(Pow_singleton);
3765 return Pow_singleton;
3766 case LShift:
3767 Py_INCREF(LShift_singleton);
3768 return LShift_singleton;
3769 case RShift:
3770 Py_INCREF(RShift_singleton);
3771 return RShift_singleton;
3772 case BitOr:
3773 Py_INCREF(BitOr_singleton);
3774 return BitOr_singleton;
3775 case BitXor:
3776 Py_INCREF(BitXor_singleton);
3777 return BitXor_singleton;
3778 case BitAnd:
3779 Py_INCREF(BitAnd_singleton);
3780 return BitAnd_singleton;
3781 case FloorDiv:
3782 Py_INCREF(FloorDiv_singleton);
3783 return FloorDiv_singleton;
3784 default:
3785 /* should never happen, but just in case ... */
3786 PyErr_Format(PyExc_SystemError, "unknown operator found");
3787 return NULL;
3788 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003789}
3790PyObject* ast2obj_unaryop(unaryop_ty o)
3791{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003792 switch(o) {
3793 case Invert:
3794 Py_INCREF(Invert_singleton);
3795 return Invert_singleton;
3796 case Not:
3797 Py_INCREF(Not_singleton);
3798 return Not_singleton;
3799 case UAdd:
3800 Py_INCREF(UAdd_singleton);
3801 return UAdd_singleton;
3802 case USub:
3803 Py_INCREF(USub_singleton);
3804 return USub_singleton;
3805 default:
3806 /* should never happen, but just in case ... */
3807 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3808 return NULL;
3809 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003810}
3811PyObject* ast2obj_cmpop(cmpop_ty o)
3812{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003813 switch(o) {
3814 case Eq:
3815 Py_INCREF(Eq_singleton);
3816 return Eq_singleton;
3817 case NotEq:
3818 Py_INCREF(NotEq_singleton);
3819 return NotEq_singleton;
3820 case Lt:
3821 Py_INCREF(Lt_singleton);
3822 return Lt_singleton;
3823 case LtE:
3824 Py_INCREF(LtE_singleton);
3825 return LtE_singleton;
3826 case Gt:
3827 Py_INCREF(Gt_singleton);
3828 return Gt_singleton;
3829 case GtE:
3830 Py_INCREF(GtE_singleton);
3831 return GtE_singleton;
3832 case Is:
3833 Py_INCREF(Is_singleton);
3834 return Is_singleton;
3835 case IsNot:
3836 Py_INCREF(IsNot_singleton);
3837 return IsNot_singleton;
3838 case In:
3839 Py_INCREF(In_singleton);
3840 return In_singleton;
3841 case NotIn:
3842 Py_INCREF(NotIn_singleton);
3843 return NotIn_singleton;
3844 default:
3845 /* should never happen, but just in case ... */
3846 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3847 return NULL;
3848 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003849}
3850PyObject*
3851ast2obj_comprehension(void* _o)
3852{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003853 comprehension_ty o = (comprehension_ty)_o;
3854 PyObject *result = NULL, *value = NULL;
3855 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003856 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003857 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003858
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003859 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3860 if (!result) return NULL;
3861 value = ast2obj_expr(o->target);
3862 if (!value) goto failed;
3863 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3864 goto failed;
3865 Py_DECREF(value);
3866 value = ast2obj_expr(o->iter);
3867 if (!value) goto failed;
3868 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3869 goto failed;
3870 Py_DECREF(value);
3871 value = ast2obj_list(o->ifs, ast2obj_expr);
3872 if (!value) goto failed;
3873 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3874 goto failed;
3875 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003876 value = ast2obj_int(o->is_async);
3877 if (!value) goto failed;
3878 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3879 goto failed;
3880 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003881 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003882failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003883 Py_XDECREF(value);
3884 Py_XDECREF(result);
3885 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003886}
3887
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003888PyObject*
3889ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003891 excepthandler_ty o = (excepthandler_ty)_o;
3892 PyObject *result = NULL, *value = NULL;
3893 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003894 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003895 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003896
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003897 switch (o->kind) {
3898 case ExceptHandler_kind:
3899 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3900 if (!result) goto failed;
3901 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003902 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003903 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3904 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003905 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003906 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003907 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003908 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3909 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003910 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003911 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3912 if (!value) goto failed;
3913 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3914 goto failed;
3915 Py_DECREF(value);
3916 break;
3917 }
3918 value = ast2obj_int(o->lineno);
3919 if (!value) goto failed;
3920 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3921 goto failed;
3922 Py_DECREF(value);
3923 value = ast2obj_int(o->col_offset);
3924 if (!value) goto failed;
3925 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3926 goto failed;
3927 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003928 value = ast2obj_int(o->end_lineno);
3929 if (!value) goto failed;
3930 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3931 goto failed;
3932 Py_DECREF(value);
3933 value = ast2obj_int(o->end_col_offset);
3934 if (!value) goto failed;
3935 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3936 goto failed;
3937 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003938 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003939failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003940 Py_XDECREF(value);
3941 Py_XDECREF(result);
3942 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003943}
3944
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003945PyObject*
3946ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003947{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 arguments_ty o = (arguments_ty)_o;
3949 PyObject *result = NULL, *value = NULL;
3950 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003951 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003952 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003953
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003954 result = PyType_GenericNew(arguments_type, NULL, NULL);
3955 if (!result) return NULL;
3956 value = ast2obj_list(o->args, ast2obj_arg);
3957 if (!value) goto failed;
3958 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3959 goto failed;
3960 Py_DECREF(value);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003961 value = ast2obj_list(o->posonlyargs, ast2obj_arg);
3962 if (!value) goto failed;
3963 if (_PyObject_SetAttrId(result, &PyId_posonlyargs, value) == -1)
3964 goto failed;
3965 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003966 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003967 if (!value) goto failed;
3968 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3969 goto failed;
3970 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003971 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3972 if (!value) goto failed;
3973 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3974 goto failed;
3975 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003976 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003977 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003978 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003979 goto failed;
3980 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003981 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003982 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003983 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003984 goto failed;
3985 Py_DECREF(value);
3986 value = ast2obj_list(o->defaults, ast2obj_expr);
3987 if (!value) goto failed;
3988 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3989 goto failed;
3990 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003991 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003992failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003993 Py_XDECREF(value);
3994 Py_XDECREF(result);
3995 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003996}
3997
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003998PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003999ast2obj_arg(void* _o)
4000{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004001 arg_ty o = (arg_ty)_o;
4002 PyObject *result = NULL, *value = NULL;
4003 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004004 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004005 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004006
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004007 result = PyType_GenericNew(arg_type, NULL, NULL);
4008 if (!result) return NULL;
4009 value = ast2obj_identifier(o->arg);
4010 if (!value) goto failed;
4011 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4012 goto failed;
4013 Py_DECREF(value);
4014 value = ast2obj_expr(o->annotation);
4015 if (!value) goto failed;
4016 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
4017 goto failed;
4018 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004019 value = ast2obj_string(o->type_comment);
4020 if (!value) goto failed;
4021 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
4022 goto failed;
4023 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004024 value = ast2obj_int(o->lineno);
4025 if (!value) goto failed;
4026 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
4027 goto failed;
4028 Py_DECREF(value);
4029 value = ast2obj_int(o->col_offset);
4030 if (!value) goto failed;
4031 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
4032 goto failed;
4033 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004034 value = ast2obj_int(o->end_lineno);
4035 if (!value) goto failed;
4036 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
4037 goto failed;
4038 Py_DECREF(value);
4039 value = ast2obj_int(o->end_col_offset);
4040 if (!value) goto failed;
4041 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
4042 goto failed;
4043 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004044 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004045failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004046 Py_XDECREF(value);
4047 Py_XDECREF(result);
4048 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004049}
4050
4051PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004052ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004053{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004054 keyword_ty o = (keyword_ty)_o;
4055 PyObject *result = NULL, *value = NULL;
4056 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004057 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004058 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004059
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004060 result = PyType_GenericNew(keyword_type, NULL, NULL);
4061 if (!result) return NULL;
4062 value = ast2obj_identifier(o->arg);
4063 if (!value) goto failed;
4064 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4065 goto failed;
4066 Py_DECREF(value);
4067 value = ast2obj_expr(o->value);
4068 if (!value) goto failed;
4069 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
4070 goto failed;
4071 Py_DECREF(value);
4072 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004073failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004074 Py_XDECREF(value);
4075 Py_XDECREF(result);
4076 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004077}
4078
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004079PyObject*
4080ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004081{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 alias_ty o = (alias_ty)_o;
4083 PyObject *result = NULL, *value = NULL;
4084 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004085 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004086 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004087
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004088 result = PyType_GenericNew(alias_type, NULL, NULL);
4089 if (!result) return NULL;
4090 value = ast2obj_identifier(o->name);
4091 if (!value) goto failed;
4092 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
4093 goto failed;
4094 Py_DECREF(value);
4095 value = ast2obj_identifier(o->asname);
4096 if (!value) goto failed;
4097 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
4098 goto failed;
4099 Py_DECREF(value);
4100 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004101failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004102 Py_XDECREF(value);
4103 Py_XDECREF(result);
4104 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004105}
4106
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004107PyObject*
4108ast2obj_withitem(void* _o)
4109{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004110 withitem_ty o = (withitem_ty)_o;
4111 PyObject *result = NULL, *value = NULL;
4112 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004113 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004114 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004115
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004116 result = PyType_GenericNew(withitem_type, NULL, NULL);
4117 if (!result) return NULL;
4118 value = ast2obj_expr(o->context_expr);
4119 if (!value) goto failed;
4120 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
4121 goto failed;
4122 Py_DECREF(value);
4123 value = ast2obj_expr(o->optional_vars);
4124 if (!value) goto failed;
4125 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
4126 goto failed;
4127 Py_DECREF(value);
4128 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004129failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004130 Py_XDECREF(value);
4131 Py_XDECREF(result);
4132 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004133}
4134
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004135PyObject*
4136ast2obj_type_ignore(void* _o)
4137{
4138 type_ignore_ty o = (type_ignore_ty)_o;
4139 PyObject *result = NULL, *value = NULL;
4140 if (!o) {
4141 Py_RETURN_NONE;
4142 }
4143
4144 switch (o->kind) {
4145 case TypeIgnore_kind:
4146 result = PyType_GenericNew(TypeIgnore_type, NULL, NULL);
4147 if (!result) goto failed;
4148 value = ast2obj_int(o->v.TypeIgnore.lineno);
4149 if (!value) goto failed;
4150 if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1)
4151 goto failed;
4152 Py_DECREF(value);
4153 break;
4154 }
4155 return result;
4156failed:
4157 Py_XDECREF(value);
4158 Py_XDECREF(result);
4159 return NULL;
4160}
4161
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004162
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004163int
4164obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
4165{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004166 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004167
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004168 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004169
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004170 if (obj == Py_None) {
4171 *out = NULL;
4172 return 0;
4173 }
4174 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
4175 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004176 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004177 }
4178 if (isinstance) {
4179 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004180 asdl_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004181
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004182 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4183 return 1;
4184 }
4185 if (tmp == NULL) {
4186 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4187 return 1;
4188 }
4189 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004190 int res;
4191 Py_ssize_t len;
4192 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004193 if (!PyList_Check(tmp)) {
4194 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4195 goto failed;
4196 }
4197 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004198 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004199 if (body == NULL) goto failed;
4200 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004201 stmt_ty val;
4202 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004203 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004204 if (len != PyList_GET_SIZE(tmp)) {
4205 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
4206 goto failed;
4207 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004208 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004209 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004210 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004211 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004212 if (_PyObject_LookupAttrId(obj, &PyId_type_ignores, &tmp) < 0) {
4213 return 1;
4214 }
4215 if (tmp == NULL) {
4216 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
4217 return 1;
4218 }
4219 else {
4220 int res;
4221 Py_ssize_t len;
4222 Py_ssize_t i;
4223 if (!PyList_Check(tmp)) {
4224 PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4225 goto failed;
4226 }
4227 len = PyList_GET_SIZE(tmp);
4228 type_ignores = _Py_asdl_seq_new(len, arena);
4229 if (type_ignores == NULL) goto failed;
4230 for (i = 0; i < len; i++) {
4231 type_ignore_ty val;
4232 res = obj2ast_type_ignore(PyList_GET_ITEM(tmp, i), &val, arena);
4233 if (res != 0) goto failed;
4234 if (len != PyList_GET_SIZE(tmp)) {
4235 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
4236 goto failed;
4237 }
4238 asdl_seq_SET(type_ignores, i, val);
4239 }
4240 Py_CLEAR(tmp);
4241 }
4242 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004243 if (*out == NULL) goto failed;
4244 return 0;
4245 }
4246 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
4247 if (isinstance == -1) {
4248 return 1;
4249 }
4250 if (isinstance) {
4251 asdl_seq* body;
4252
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004253 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4254 return 1;
4255 }
4256 if (tmp == NULL) {
4257 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4258 return 1;
4259 }
4260 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004261 int res;
4262 Py_ssize_t len;
4263 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004264 if (!PyList_Check(tmp)) {
4265 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4266 goto failed;
4267 }
4268 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004269 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004270 if (body == NULL) goto failed;
4271 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004272 stmt_ty val;
4273 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004274 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004275 if (len != PyList_GET_SIZE(tmp)) {
4276 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4277 goto failed;
4278 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004279 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004280 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004281 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004282 }
4283 *out = Interactive(body, arena);
4284 if (*out == NULL) goto failed;
4285 return 0;
4286 }
4287 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4288 if (isinstance == -1) {
4289 return 1;
4290 }
4291 if (isinstance) {
4292 expr_ty body;
4293
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004294 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4295 return 1;
4296 }
4297 if (tmp == NULL) {
4298 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4299 return 1;
4300 }
4301 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004302 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004303 res = obj2ast_expr(tmp, &body, arena);
4304 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004305 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004306 }
4307 *out = Expression(body, arena);
4308 if (*out == NULL) goto failed;
4309 return 0;
4310 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004311 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionType_type);
4312 if (isinstance == -1) {
4313 return 1;
4314 }
4315 if (isinstance) {
4316 asdl_seq* argtypes;
4317 expr_ty returns;
4318
4319 if (_PyObject_LookupAttrId(obj, &PyId_argtypes, &tmp) < 0) {
4320 return 1;
4321 }
4322 if (tmp == NULL) {
4323 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
4324 return 1;
4325 }
4326 else {
4327 int res;
4328 Py_ssize_t len;
4329 Py_ssize_t i;
4330 if (!PyList_Check(tmp)) {
4331 PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4332 goto failed;
4333 }
4334 len = PyList_GET_SIZE(tmp);
4335 argtypes = _Py_asdl_seq_new(len, arena);
4336 if (argtypes == NULL) goto failed;
4337 for (i = 0; i < len; i++) {
4338 expr_ty val;
4339 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
4340 if (res != 0) goto failed;
4341 if (len != PyList_GET_SIZE(tmp)) {
4342 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
4343 goto failed;
4344 }
4345 asdl_seq_SET(argtypes, i, val);
4346 }
4347 Py_CLEAR(tmp);
4348 }
4349 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
4350 return 1;
4351 }
4352 if (tmp == NULL) {
4353 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
4354 return 1;
4355 }
4356 else {
4357 int res;
4358 res = obj2ast_expr(tmp, &returns, arena);
4359 if (res != 0) goto failed;
4360 Py_CLEAR(tmp);
4361 }
4362 *out = FunctionType(argtypes, returns, arena);
4363 if (*out == NULL) goto failed;
4364 return 0;
4365 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004366 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4367 if (isinstance == -1) {
4368 return 1;
4369 }
4370 if (isinstance) {
4371 asdl_seq* body;
4372
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004373 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4374 return 1;
4375 }
4376 if (tmp == NULL) {
4377 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4378 return 1;
4379 }
4380 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004381 int res;
4382 Py_ssize_t len;
4383 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004384 if (!PyList_Check(tmp)) {
4385 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4386 goto failed;
4387 }
4388 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004389 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004390 if (body == NULL) goto failed;
4391 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004392 stmt_ty val;
4393 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004394 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004395 if (len != PyList_GET_SIZE(tmp)) {
4396 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4397 goto failed;
4398 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004399 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004400 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004401 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004402 }
4403 *out = Suite(body, arena);
4404 if (*out == NULL) goto failed;
4405 return 0;
4406 }
4407
4408 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4409 failed:
4410 Py_XDECREF(tmp);
4411 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004412}
4413
4414int
4415obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4416{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004417 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004418
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004419 PyObject *tmp = NULL;
4420 int lineno;
4421 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004422 int end_lineno;
4423 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004424
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004425 if (obj == Py_None) {
4426 *out = NULL;
4427 return 0;
4428 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004429 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4430 return 1;
4431 }
4432 if (tmp == NULL) {
4433 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4434 return 1;
4435 }
4436 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004437 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004438 res = obj2ast_int(tmp, &lineno, arena);
4439 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004440 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004441 }
4442 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004443 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004444 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004445 if (tmp == NULL) {
4446 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" 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, &col_offset, arena);
4452 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004453 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004454 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004455 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
4456 return 1;
4457 }
4458 if (tmp == NULL || tmp == Py_None) {
4459 Py_CLEAR(tmp);
4460 end_lineno = 0;
4461 }
4462 else {
4463 int res;
4464 res = obj2ast_int(tmp, &end_lineno, arena);
4465 if (res != 0) goto failed;
4466 Py_CLEAR(tmp);
4467 }
4468 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
4469 return 1;
4470 }
4471 if (tmp == NULL || tmp == Py_None) {
4472 Py_CLEAR(tmp);
4473 end_col_offset = 0;
4474 }
4475 else {
4476 int res;
4477 res = obj2ast_int(tmp, &end_col_offset, arena);
4478 if (res != 0) goto failed;
4479 Py_CLEAR(tmp);
4480 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004481 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4482 if (isinstance == -1) {
4483 return 1;
4484 }
4485 if (isinstance) {
4486 identifier name;
4487 arguments_ty args;
4488 asdl_seq* body;
4489 asdl_seq* decorator_list;
4490 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004491 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004492
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004493 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4494 return 1;
4495 }
4496 if (tmp == NULL) {
4497 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4498 return 1;
4499 }
4500 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004501 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004502 res = obj2ast_identifier(tmp, &name, arena);
4503 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004504 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004505 }
4506 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004507 return 1;
4508 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004509 if (tmp == NULL) {
4510 PyErr_SetString(PyExc_TypeError, "required field \"args\" 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_arguments(tmp, &args, 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_body, &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 \"body\" missing from FunctionDef");
4524 return 1;
4525 }
4526 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004527 int res;
4528 Py_ssize_t len;
4529 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004530 if (!PyList_Check(tmp)) {
4531 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4532 goto failed;
4533 }
4534 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004535 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004536 if (body == NULL) goto failed;
4537 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004538 stmt_ty val;
4539 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004540 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004541 if (len != PyList_GET_SIZE(tmp)) {
4542 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4543 goto failed;
4544 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004545 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004546 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004547 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004548 }
4549 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004550 return 1;
4551 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004552 if (tmp == NULL) {
4553 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4554 return 1;
4555 }
4556 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004557 int res;
4558 Py_ssize_t len;
4559 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004560 if (!PyList_Check(tmp)) {
4561 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4562 goto failed;
4563 }
4564 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004565 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004566 if (decorator_list == NULL) goto failed;
4567 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004568 expr_ty val;
4569 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004570 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004571 if (len != PyList_GET_SIZE(tmp)) {
4572 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4573 goto failed;
4574 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004575 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004576 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004577 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004578 }
4579 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004580 return 1;
4581 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004582 if (tmp == NULL || tmp == Py_None) {
4583 Py_CLEAR(tmp);
4584 returns = NULL;
4585 }
4586 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004587 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004588 res = obj2ast_expr(tmp, &returns, arena);
4589 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004590 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004591 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004592 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4593 return 1;
4594 }
4595 if (tmp == NULL || tmp == Py_None) {
4596 Py_CLEAR(tmp);
4597 type_comment = NULL;
4598 }
4599 else {
4600 int res;
4601 res = obj2ast_string(tmp, &type_comment, arena);
4602 if (res != 0) goto failed;
4603 Py_CLEAR(tmp);
4604 }
4605 *out = FunctionDef(name, args, body, decorator_list, returns,
4606 type_comment, lineno, col_offset, end_lineno,
4607 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004608 if (*out == NULL) goto failed;
4609 return 0;
4610 }
Yury Selivanov75445082015-05-11 22:57:16 -04004611 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4612 if (isinstance == -1) {
4613 return 1;
4614 }
4615 if (isinstance) {
4616 identifier name;
4617 arguments_ty args;
4618 asdl_seq* body;
4619 asdl_seq* decorator_list;
4620 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004621 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04004622
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004623 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4624 return 1;
4625 }
4626 if (tmp == NULL) {
4627 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4628 return 1;
4629 }
4630 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004631 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004632 res = obj2ast_identifier(tmp, &name, arena);
4633 if (res != 0) goto failed;
4634 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004635 }
4636 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004637 return 1;
4638 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004639 if (tmp == NULL) {
4640 PyErr_SetString(PyExc_TypeError, "required field \"args\" 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_arguments(tmp, &args, 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_body, &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 \"body\" missing from AsyncFunctionDef");
4654 return 1;
4655 }
4656 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004657 int res;
4658 Py_ssize_t len;
4659 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004660 if (!PyList_Check(tmp)) {
4661 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4662 goto failed;
4663 }
4664 len = PyList_GET_SIZE(tmp);
4665 body = _Py_asdl_seq_new(len, arena);
4666 if (body == NULL) goto failed;
4667 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004668 stmt_ty val;
4669 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004670 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004671 if (len != PyList_GET_SIZE(tmp)) {
4672 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4673 goto failed;
4674 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004675 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004676 }
4677 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004678 }
4679 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004680 return 1;
4681 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004682 if (tmp == NULL) {
4683 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4684 return 1;
4685 }
4686 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004687 int res;
4688 Py_ssize_t len;
4689 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004690 if (!PyList_Check(tmp)) {
4691 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4692 goto failed;
4693 }
4694 len = PyList_GET_SIZE(tmp);
4695 decorator_list = _Py_asdl_seq_new(len, arena);
4696 if (decorator_list == NULL) goto failed;
4697 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004698 expr_ty val;
4699 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004700 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004701 if (len != PyList_GET_SIZE(tmp)) {
4702 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4703 goto failed;
4704 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004705 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004706 }
4707 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004708 }
4709 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004710 return 1;
4711 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004712 if (tmp == NULL || tmp == Py_None) {
4713 Py_CLEAR(tmp);
4714 returns = NULL;
4715 }
4716 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004717 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004718 res = obj2ast_expr(tmp, &returns, arena);
4719 if (res != 0) goto failed;
4720 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004721 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004722 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4723 return 1;
4724 }
4725 if (tmp == NULL || tmp == Py_None) {
4726 Py_CLEAR(tmp);
4727 type_comment = NULL;
4728 }
4729 else {
4730 int res;
4731 res = obj2ast_string(tmp, &type_comment, arena);
4732 if (res != 0) goto failed;
4733 Py_CLEAR(tmp);
4734 }
Yury Selivanov75445082015-05-11 22:57:16 -04004735 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004736 type_comment, lineno, col_offset, end_lineno,
4737 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004738 if (*out == NULL) goto failed;
4739 return 0;
4740 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004741 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4742 if (isinstance == -1) {
4743 return 1;
4744 }
4745 if (isinstance) {
4746 identifier name;
4747 asdl_seq* bases;
4748 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004749 asdl_seq* body;
4750 asdl_seq* decorator_list;
4751
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004752 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4753 return 1;
4754 }
4755 if (tmp == NULL) {
4756 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4757 return 1;
4758 }
4759 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004760 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004761 res = obj2ast_identifier(tmp, &name, arena);
4762 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004763 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004764 }
4765 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004766 return 1;
4767 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004768 if (tmp == NULL) {
4769 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4770 return 1;
4771 }
4772 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 int res;
4774 Py_ssize_t len;
4775 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004776 if (!PyList_Check(tmp)) {
4777 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4778 goto failed;
4779 }
4780 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004781 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004782 if (bases == NULL) goto failed;
4783 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004784 expr_ty val;
4785 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004786 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004787 if (len != PyList_GET_SIZE(tmp)) {
4788 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4789 goto failed;
4790 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004791 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004792 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004793 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004794 }
4795 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004796 return 1;
4797 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004798 if (tmp == NULL) {
4799 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4800 return 1;
4801 }
4802 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004803 int res;
4804 Py_ssize_t len;
4805 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004806 if (!PyList_Check(tmp)) {
4807 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4808 goto failed;
4809 }
4810 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004811 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004812 if (keywords == NULL) goto failed;
4813 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004814 keyword_ty val;
4815 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004816 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004817 if (len != PyList_GET_SIZE(tmp)) {
4818 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4819 goto failed;
4820 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004821 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004822 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004823 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004824 }
4825 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004826 return 1;
4827 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004828 if (tmp == NULL) {
4829 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4830 return 1;
4831 }
4832 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004833 int res;
4834 Py_ssize_t len;
4835 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004836 if (!PyList_Check(tmp)) {
4837 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4838 goto failed;
4839 }
4840 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004841 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004842 if (body == NULL) goto failed;
4843 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004844 stmt_ty val;
4845 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004846 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004847 if (len != PyList_GET_SIZE(tmp)) {
4848 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4849 goto failed;
4850 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004851 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004852 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004853 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004854 }
4855 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004856 return 1;
4857 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004858 if (tmp == NULL) {
4859 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4860 return 1;
4861 }
4862 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004863 int res;
4864 Py_ssize_t len;
4865 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004866 if (!PyList_Check(tmp)) {
4867 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4868 goto failed;
4869 }
4870 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004871 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004872 if (decorator_list == NULL) goto failed;
4873 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004874 expr_ty val;
4875 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004876 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004877 if (len != PyList_GET_SIZE(tmp)) {
4878 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4879 goto failed;
4880 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004881 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004882 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004883 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004884 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004885 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004886 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004887 if (*out == NULL) goto failed;
4888 return 0;
4889 }
4890 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4891 if (isinstance == -1) {
4892 return 1;
4893 }
4894 if (isinstance) {
4895 expr_ty value;
4896
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004897 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4898 return 1;
4899 }
4900 if (tmp == NULL || tmp == Py_None) {
4901 Py_CLEAR(tmp);
4902 value = NULL;
4903 }
4904 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004905 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004906 res = obj2ast_expr(tmp, &value, arena);
4907 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004908 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004909 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004910 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
4911 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004912 if (*out == NULL) goto failed;
4913 return 0;
4914 }
4915 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4916 if (isinstance == -1) {
4917 return 1;
4918 }
4919 if (isinstance) {
4920 asdl_seq* targets;
4921
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004922 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4923 return 1;
4924 }
4925 if (tmp == NULL) {
4926 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4927 return 1;
4928 }
4929 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004930 int res;
4931 Py_ssize_t len;
4932 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004933 if (!PyList_Check(tmp)) {
4934 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4935 goto failed;
4936 }
4937 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004938 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004939 if (targets == NULL) goto failed;
4940 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004941 expr_ty val;
4942 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004943 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004944 if (len != PyList_GET_SIZE(tmp)) {
4945 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4946 goto failed;
4947 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004948 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004949 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004950 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004951 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004952 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
4953 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004954 if (*out == NULL) goto failed;
4955 return 0;
4956 }
4957 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4958 if (isinstance == -1) {
4959 return 1;
4960 }
4961 if (isinstance) {
4962 asdl_seq* targets;
4963 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004964 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004965
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004966 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4967 return 1;
4968 }
4969 if (tmp == NULL) {
4970 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4971 return 1;
4972 }
4973 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004974 int res;
4975 Py_ssize_t len;
4976 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004977 if (!PyList_Check(tmp)) {
4978 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4979 goto failed;
4980 }
4981 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004982 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004983 if (targets == NULL) goto failed;
4984 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004985 expr_ty val;
4986 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004987 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004988 if (len != PyList_GET_SIZE(tmp)) {
4989 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4990 goto failed;
4991 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004992 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004993 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004994 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004995 }
4996 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004997 return 1;
4998 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004999 if (tmp == NULL) {
5000 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
5001 return 1;
5002 }
5003 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005004 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005005 res = obj2ast_expr(tmp, &value, arena);
5006 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005007 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005008 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005009 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5010 return 1;
5011 }
5012 if (tmp == NULL || tmp == Py_None) {
5013 Py_CLEAR(tmp);
5014 type_comment = NULL;
5015 }
5016 else {
5017 int res;
5018 res = obj2ast_string(tmp, &type_comment, arena);
5019 if (res != 0) goto failed;
5020 Py_CLEAR(tmp);
5021 }
5022 *out = Assign(targets, value, type_comment, lineno, col_offset,
5023 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005024 if (*out == NULL) goto failed;
5025 return 0;
5026 }
5027 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
5028 if (isinstance == -1) {
5029 return 1;
5030 }
5031 if (isinstance) {
5032 expr_ty target;
5033 operator_ty op;
5034 expr_ty value;
5035
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005036 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5037 return 1;
5038 }
5039 if (tmp == NULL) {
5040 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
5041 return 1;
5042 }
5043 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005044 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005045 res = obj2ast_expr(tmp, &target, arena);
5046 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005047 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005048 }
5049 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005050 return 1;
5051 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005052 if (tmp == NULL) {
5053 PyErr_SetString(PyExc_TypeError, "required field \"op\" 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_operator(tmp, &op, 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_value, &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 \"value\" 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_expr(tmp, &value, arena);
5072 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005073 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005074 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005075 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
5076 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005077 if (*out == NULL) goto failed;
5078 return 0;
5079 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005080 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
5081 if (isinstance == -1) {
5082 return 1;
5083 }
5084 if (isinstance) {
5085 expr_ty target;
5086 expr_ty annotation;
5087 expr_ty value;
5088 int simple;
5089
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005090 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5091 return 1;
5092 }
5093 if (tmp == NULL) {
5094 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
5095 return 1;
5096 }
5097 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005098 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005099 res = obj2ast_expr(tmp, &target, arena);
5100 if (res != 0) goto failed;
5101 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005102 }
5103 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005104 return 1;
5105 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005106 if (tmp == NULL) {
5107 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" 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, &annotation, 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_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005117 return 1;
5118 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005119 if (tmp == NULL || tmp == Py_None) {
5120 Py_CLEAR(tmp);
5121 value = NULL;
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, &value, arena);
5126 if (res != 0) goto failed;
5127 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005128 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005129 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
5130 return 1;
5131 }
5132 if (tmp == NULL) {
5133 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
5134 return 1;
5135 }
5136 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005137 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005138 res = obj2ast_int(tmp, &simple, arena);
5139 if (res != 0) goto failed;
5140 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005141 }
5142 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005143 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005144 if (*out == NULL) goto failed;
5145 return 0;
5146 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005147 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
5148 if (isinstance == -1) {
5149 return 1;
5150 }
5151 if (isinstance) {
5152 expr_ty target;
5153 expr_ty iter;
5154 asdl_seq* body;
5155 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005156 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005157
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005158 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5159 return 1;
5160 }
5161 if (tmp == NULL) {
5162 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
5163 return 1;
5164 }
5165 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005166 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005167 res = obj2ast_expr(tmp, &target, arena);
5168 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005169 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005170 }
5171 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005172 return 1;
5173 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005174 if (tmp == NULL) {
5175 PyErr_SetString(PyExc_TypeError, "required field \"iter\" 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, &iter, 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_body, &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 \"body\" missing from For");
5189 return 1;
5190 }
5191 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005192 int res;
5193 Py_ssize_t len;
5194 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005195 if (!PyList_Check(tmp)) {
5196 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5197 goto failed;
5198 }
5199 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005200 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005201 if (body == NULL) goto failed;
5202 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005203 stmt_ty val;
5204 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005205 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005206 if (len != PyList_GET_SIZE(tmp)) {
5207 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
5208 goto failed;
5209 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005210 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005211 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005212 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005213 }
5214 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005215 return 1;
5216 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005217 if (tmp == NULL) {
5218 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
5219 return 1;
5220 }
5221 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005222 int res;
5223 Py_ssize_t len;
5224 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005225 if (!PyList_Check(tmp)) {
5226 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5227 goto failed;
5228 }
5229 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005230 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005231 if (orelse == NULL) goto failed;
5232 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005233 stmt_ty val;
5234 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005235 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005236 if (len != PyList_GET_SIZE(tmp)) {
5237 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
5238 goto failed;
5239 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005240 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005241 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005242 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005243 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005244 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5245 return 1;
5246 }
5247 if (tmp == NULL || tmp == Py_None) {
5248 Py_CLEAR(tmp);
5249 type_comment = NULL;
5250 }
5251 else {
5252 int res;
5253 res = obj2ast_string(tmp, &type_comment, arena);
5254 if (res != 0) goto failed;
5255 Py_CLEAR(tmp);
5256 }
5257 *out = For(target, iter, body, orelse, type_comment, lineno,
5258 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005259 if (*out == NULL) goto failed;
5260 return 0;
5261 }
Yury Selivanov75445082015-05-11 22:57:16 -04005262 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
5263 if (isinstance == -1) {
5264 return 1;
5265 }
5266 if (isinstance) {
5267 expr_ty target;
5268 expr_ty iter;
5269 asdl_seq* body;
5270 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005271 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005272
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005273 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5274 return 1;
5275 }
5276 if (tmp == NULL) {
5277 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
5278 return 1;
5279 }
5280 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005281 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04005282 res = obj2ast_expr(tmp, &target, arena);
5283 if (res != 0) goto failed;
5284 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005285 }
5286 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005287 return 1;
5288 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005289 if (tmp == NULL) {
5290 PyErr_SetString(PyExc_TypeError, "required field \"iter\" 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, &iter, 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_body, &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 \"body\" missing from AsyncFor");
5304 return 1;
5305 }
5306 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005307 int res;
5308 Py_ssize_t len;
5309 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005310 if (!PyList_Check(tmp)) {
5311 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5312 goto failed;
5313 }
5314 len = PyList_GET_SIZE(tmp);
5315 body = _Py_asdl_seq_new(len, arena);
5316 if (body == NULL) goto failed;
5317 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005318 stmt_ty val;
5319 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005320 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005321 if (len != PyList_GET_SIZE(tmp)) {
5322 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
5323 goto failed;
5324 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005325 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005326 }
5327 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005328 }
5329 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005330 return 1;
5331 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005332 if (tmp == NULL) {
5333 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
5334 return 1;
5335 }
5336 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005337 int res;
5338 Py_ssize_t len;
5339 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005340 if (!PyList_Check(tmp)) {
5341 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5342 goto failed;
5343 }
5344 len = PyList_GET_SIZE(tmp);
5345 orelse = _Py_asdl_seq_new(len, arena);
5346 if (orelse == NULL) goto failed;
5347 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005348 stmt_ty val;
5349 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005350 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005351 if (len != PyList_GET_SIZE(tmp)) {
5352 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
5353 goto failed;
5354 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005355 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005356 }
5357 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005358 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005359 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5360 return 1;
5361 }
5362 if (tmp == NULL || tmp == Py_None) {
5363 Py_CLEAR(tmp);
5364 type_comment = NULL;
5365 }
5366 else {
5367 int res;
5368 res = obj2ast_string(tmp, &type_comment, arena);
5369 if (res != 0) goto failed;
5370 Py_CLEAR(tmp);
5371 }
5372 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
5373 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005374 if (*out == NULL) goto failed;
5375 return 0;
5376 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005377 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
5378 if (isinstance == -1) {
5379 return 1;
5380 }
5381 if (isinstance) {
5382 expr_ty test;
5383 asdl_seq* body;
5384 asdl_seq* orelse;
5385
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005386 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5387 return 1;
5388 }
5389 if (tmp == NULL) {
5390 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
5391 return 1;
5392 }
5393 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005394 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005395 res = obj2ast_expr(tmp, &test, arena);
5396 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005397 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005398 }
5399 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005400 return 1;
5401 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005402 if (tmp == NULL) {
5403 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
5404 return 1;
5405 }
5406 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005407 int res;
5408 Py_ssize_t len;
5409 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005410 if (!PyList_Check(tmp)) {
5411 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5412 goto failed;
5413 }
5414 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005415 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005416 if (body == NULL) goto failed;
5417 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005418 stmt_ty val;
5419 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005420 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005421 if (len != PyList_GET_SIZE(tmp)) {
5422 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5423 goto failed;
5424 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005425 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005426 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005427 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005428 }
5429 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005430 return 1;
5431 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005432 if (tmp == NULL) {
5433 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5434 return 1;
5435 }
5436 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005437 int res;
5438 Py_ssize_t len;
5439 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005440 if (!PyList_Check(tmp)) {
5441 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5442 goto failed;
5443 }
5444 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005445 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005446 if (orelse == NULL) goto failed;
5447 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005448 stmt_ty val;
5449 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005450 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005451 if (len != PyList_GET_SIZE(tmp)) {
5452 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5453 goto failed;
5454 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005455 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005456 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005457 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005458 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005459 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
5460 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005461 if (*out == NULL) goto failed;
5462 return 0;
5463 }
5464 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5465 if (isinstance == -1) {
5466 return 1;
5467 }
5468 if (isinstance) {
5469 expr_ty test;
5470 asdl_seq* body;
5471 asdl_seq* orelse;
5472
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005473 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5474 return 1;
5475 }
5476 if (tmp == NULL) {
5477 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5478 return 1;
5479 }
5480 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005481 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005482 res = obj2ast_expr(tmp, &test, arena);
5483 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005484 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005485 }
5486 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005487 return 1;
5488 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005489 if (tmp == NULL) {
5490 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5491 return 1;
5492 }
5493 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005494 int res;
5495 Py_ssize_t len;
5496 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005497 if (!PyList_Check(tmp)) {
5498 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5499 goto failed;
5500 }
5501 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005502 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005503 if (body == NULL) goto failed;
5504 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005505 stmt_ty val;
5506 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005507 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005508 if (len != PyList_GET_SIZE(tmp)) {
5509 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5510 goto failed;
5511 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005512 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005513 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005514 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005515 }
5516 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005517 return 1;
5518 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005519 if (tmp == NULL) {
5520 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5521 return 1;
5522 }
5523 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005524 int res;
5525 Py_ssize_t len;
5526 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005527 if (!PyList_Check(tmp)) {
5528 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5529 goto failed;
5530 }
5531 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005532 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005533 if (orelse == NULL) goto failed;
5534 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005535 stmt_ty val;
5536 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005537 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005538 if (len != PyList_GET_SIZE(tmp)) {
5539 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5540 goto failed;
5541 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005542 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005543 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005544 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005545 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005546 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
5547 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005548 if (*out == NULL) goto failed;
5549 return 0;
5550 }
5551 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5552 if (isinstance == -1) {
5553 return 1;
5554 }
5555 if (isinstance) {
5556 asdl_seq* items;
5557 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005558 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005559
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005560 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5561 return 1;
5562 }
5563 if (tmp == NULL) {
5564 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5565 return 1;
5566 }
5567 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005568 int res;
5569 Py_ssize_t len;
5570 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005571 if (!PyList_Check(tmp)) {
5572 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5573 goto failed;
5574 }
5575 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005576 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005577 if (items == NULL) goto failed;
5578 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005579 withitem_ty val;
5580 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005581 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005582 if (len != PyList_GET_SIZE(tmp)) {
5583 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5584 goto failed;
5585 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005586 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005587 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005588 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005589 }
5590 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005591 return 1;
5592 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005593 if (tmp == NULL) {
5594 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5595 return 1;
5596 }
5597 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005598 int res;
5599 Py_ssize_t len;
5600 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005601 if (!PyList_Check(tmp)) {
5602 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5603 goto failed;
5604 }
5605 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005606 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005607 if (body == NULL) goto failed;
5608 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005609 stmt_ty val;
5610 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005611 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005612 if (len != PyList_GET_SIZE(tmp)) {
5613 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5614 goto failed;
5615 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005616 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005617 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005618 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005619 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005620 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5621 return 1;
5622 }
5623 if (tmp == NULL || tmp == Py_None) {
5624 Py_CLEAR(tmp);
5625 type_comment = NULL;
5626 }
5627 else {
5628 int res;
5629 res = obj2ast_string(tmp, &type_comment, arena);
5630 if (res != 0) goto failed;
5631 Py_CLEAR(tmp);
5632 }
5633 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005634 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005635 if (*out == NULL) goto failed;
5636 return 0;
5637 }
Yury Selivanov75445082015-05-11 22:57:16 -04005638 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5639 if (isinstance == -1) {
5640 return 1;
5641 }
5642 if (isinstance) {
5643 asdl_seq* items;
5644 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005645 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005646
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005647 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5648 return 1;
5649 }
5650 if (tmp == NULL) {
5651 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5652 return 1;
5653 }
5654 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005655 int res;
5656 Py_ssize_t len;
5657 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005658 if (!PyList_Check(tmp)) {
5659 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5660 goto failed;
5661 }
5662 len = PyList_GET_SIZE(tmp);
5663 items = _Py_asdl_seq_new(len, arena);
5664 if (items == NULL) goto failed;
5665 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005666 withitem_ty val;
5667 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005668 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005669 if (len != PyList_GET_SIZE(tmp)) {
5670 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5671 goto failed;
5672 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005673 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005674 }
5675 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005676 }
5677 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005678 return 1;
5679 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005680 if (tmp == NULL) {
5681 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5682 return 1;
5683 }
5684 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005685 int res;
5686 Py_ssize_t len;
5687 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005688 if (!PyList_Check(tmp)) {
5689 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5690 goto failed;
5691 }
5692 len = PyList_GET_SIZE(tmp);
5693 body = _Py_asdl_seq_new(len, arena);
5694 if (body == NULL) goto failed;
5695 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005696 stmt_ty val;
5697 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005698 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005699 if (len != PyList_GET_SIZE(tmp)) {
5700 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5701 goto failed;
5702 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005703 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005704 }
5705 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005706 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005707 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5708 return 1;
5709 }
5710 if (tmp == NULL || tmp == Py_None) {
5711 Py_CLEAR(tmp);
5712 type_comment = NULL;
5713 }
5714 else {
5715 int res;
5716 res = obj2ast_string(tmp, &type_comment, arena);
5717 if (res != 0) goto failed;
5718 Py_CLEAR(tmp);
5719 }
5720 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
5721 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005722 if (*out == NULL) goto failed;
5723 return 0;
5724 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005725 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5726 if (isinstance == -1) {
5727 return 1;
5728 }
5729 if (isinstance) {
5730 expr_ty exc;
5731 expr_ty cause;
5732
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005733 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5734 return 1;
5735 }
5736 if (tmp == NULL || tmp == Py_None) {
5737 Py_CLEAR(tmp);
5738 exc = NULL;
5739 }
5740 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005741 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005742 res = obj2ast_expr(tmp, &exc, arena);
5743 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005744 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005745 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005746 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5747 return 1;
5748 }
5749 if (tmp == NULL || tmp == Py_None) {
5750 Py_CLEAR(tmp);
5751 cause = 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, &cause, 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 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005759 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
5760 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005761 if (*out == NULL) goto failed;
5762 return 0;
5763 }
5764 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5765 if (isinstance == -1) {
5766 return 1;
5767 }
5768 if (isinstance) {
5769 asdl_seq* body;
5770 asdl_seq* handlers;
5771 asdl_seq* orelse;
5772 asdl_seq* finalbody;
5773
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005774 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5775 return 1;
5776 }
5777 if (tmp == NULL) {
5778 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5779 return 1;
5780 }
5781 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005782 int res;
5783 Py_ssize_t len;
5784 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005785 if (!PyList_Check(tmp)) {
5786 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5787 goto failed;
5788 }
5789 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005790 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005791 if (body == NULL) goto failed;
5792 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005793 stmt_ty val;
5794 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005795 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005796 if (len != PyList_GET_SIZE(tmp)) {
5797 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5798 goto failed;
5799 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005800 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005801 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005802 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005803 }
5804 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005805 return 1;
5806 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005807 if (tmp == NULL) {
5808 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5809 return 1;
5810 }
5811 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005812 int res;
5813 Py_ssize_t len;
5814 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005815 if (!PyList_Check(tmp)) {
5816 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5817 goto failed;
5818 }
5819 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005820 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005821 if (handlers == NULL) goto failed;
5822 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005823 excepthandler_ty val;
5824 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005825 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005826 if (len != PyList_GET_SIZE(tmp)) {
5827 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5828 goto failed;
5829 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005830 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005831 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005832 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005833 }
5834 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005835 return 1;
5836 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005837 if (tmp == NULL) {
5838 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5839 return 1;
5840 }
5841 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005842 int res;
5843 Py_ssize_t len;
5844 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005845 if (!PyList_Check(tmp)) {
5846 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5847 goto failed;
5848 }
5849 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005850 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005851 if (orelse == NULL) goto failed;
5852 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005853 stmt_ty val;
5854 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005855 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005856 if (len != PyList_GET_SIZE(tmp)) {
5857 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5858 goto failed;
5859 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005860 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005861 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005862 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005863 }
5864 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005865 return 1;
5866 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005867 if (tmp == NULL) {
5868 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5869 return 1;
5870 }
5871 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005872 int res;
5873 Py_ssize_t len;
5874 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005875 if (!PyList_Check(tmp)) {
5876 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5877 goto failed;
5878 }
5879 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005880 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005881 if (finalbody == NULL) goto failed;
5882 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005883 stmt_ty val;
5884 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005885 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005886 if (len != PyList_GET_SIZE(tmp)) {
5887 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5888 goto failed;
5889 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005890 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005891 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005892 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005893 }
5894 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005895 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005896 if (*out == NULL) goto failed;
5897 return 0;
5898 }
5899 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5900 if (isinstance == -1) {
5901 return 1;
5902 }
5903 if (isinstance) {
5904 expr_ty test;
5905 expr_ty msg;
5906
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005907 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5908 return 1;
5909 }
5910 if (tmp == NULL) {
5911 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5912 return 1;
5913 }
5914 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005915 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005916 res = obj2ast_expr(tmp, &test, arena);
5917 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005918 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005919 }
5920 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005921 return 1;
5922 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005923 if (tmp == NULL || tmp == Py_None) {
5924 Py_CLEAR(tmp);
5925 msg = NULL;
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, &msg, arena);
5930 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005931 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005932 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005933 *out = Assert(test, msg, lineno, col_offset, end_lineno,
5934 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005935 if (*out == NULL) goto failed;
5936 return 0;
5937 }
5938 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5939 if (isinstance == -1) {
5940 return 1;
5941 }
5942 if (isinstance) {
5943 asdl_seq* names;
5944
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005945 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5946 return 1;
5947 }
5948 if (tmp == NULL) {
5949 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5950 return 1;
5951 }
5952 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005953 int res;
5954 Py_ssize_t len;
5955 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005956 if (!PyList_Check(tmp)) {
5957 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5958 goto failed;
5959 }
5960 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005961 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005962 if (names == NULL) goto failed;
5963 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005964 alias_ty val;
5965 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005966 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005967 if (len != PyList_GET_SIZE(tmp)) {
5968 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5969 goto failed;
5970 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005971 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005972 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005973 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005974 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005975 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
5976 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005977 if (*out == NULL) goto failed;
5978 return 0;
5979 }
5980 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5981 if (isinstance == -1) {
5982 return 1;
5983 }
5984 if (isinstance) {
5985 identifier module;
5986 asdl_seq* names;
5987 int level;
5988
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005989 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5990 return 1;
5991 }
5992 if (tmp == NULL || tmp == Py_None) {
5993 Py_CLEAR(tmp);
5994 module = NULL;
5995 }
5996 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005997 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005998 res = obj2ast_identifier(tmp, &module, arena);
5999 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006000 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006001 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006002 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6003 return 1;
6004 }
6005 if (tmp == NULL) {
6006 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
6007 return 1;
6008 }
6009 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006010 int res;
6011 Py_ssize_t len;
6012 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006013 if (!PyList_Check(tmp)) {
6014 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6015 goto failed;
6016 }
6017 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006018 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006019 if (names == NULL) goto failed;
6020 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006021 alias_ty val;
6022 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006023 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006024 if (len != PyList_GET_SIZE(tmp)) {
6025 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
6026 goto failed;
6027 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006028 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006029 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006030 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006031 }
6032 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006033 return 1;
6034 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006035 if (tmp == NULL || tmp == Py_None) {
6036 Py_CLEAR(tmp);
6037 level = 0;
6038 }
6039 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006040 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006041 res = obj2ast_int(tmp, &level, arena);
6042 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006043 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006044 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006045 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
6046 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006047 if (*out == NULL) goto failed;
6048 return 0;
6049 }
6050 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
6051 if (isinstance == -1) {
6052 return 1;
6053 }
6054 if (isinstance) {
6055 asdl_seq* names;
6056
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006057 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6058 return 1;
6059 }
6060 if (tmp == NULL) {
6061 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
6062 return 1;
6063 }
6064 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006065 int res;
6066 Py_ssize_t len;
6067 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006068 if (!PyList_Check(tmp)) {
6069 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6070 goto failed;
6071 }
6072 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006073 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006074 if (names == NULL) goto failed;
6075 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006076 identifier val;
6077 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006078 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006079 if (len != PyList_GET_SIZE(tmp)) {
6080 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
6081 goto failed;
6082 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006083 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006084 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006085 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006086 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006087 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
6088 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006089 if (*out == NULL) goto failed;
6090 return 0;
6091 }
6092 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
6093 if (isinstance == -1) {
6094 return 1;
6095 }
6096 if (isinstance) {
6097 asdl_seq* names;
6098
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006099 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6100 return 1;
6101 }
6102 if (tmp == NULL) {
6103 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
6104 return 1;
6105 }
6106 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006107 int res;
6108 Py_ssize_t len;
6109 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006110 if (!PyList_Check(tmp)) {
6111 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6112 goto failed;
6113 }
6114 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006115 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006116 if (names == NULL) goto failed;
6117 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006118 identifier val;
6119 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006120 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006121 if (len != PyList_GET_SIZE(tmp)) {
6122 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
6123 goto failed;
6124 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006125 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006126 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006127 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006128 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006129 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
6130 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006131 if (*out == NULL) goto failed;
6132 return 0;
6133 }
6134 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
6135 if (isinstance == -1) {
6136 return 1;
6137 }
6138 if (isinstance) {
6139 expr_ty value;
6140
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006141 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6142 return 1;
6143 }
6144 if (tmp == NULL) {
6145 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
6146 return 1;
6147 }
6148 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006149 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006150 res = obj2ast_expr(tmp, &value, arena);
6151 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006152 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006153 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006154 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
6155 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006156 if (*out == NULL) goto failed;
6157 return 0;
6158 }
6159 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
6160 if (isinstance == -1) {
6161 return 1;
6162 }
6163 if (isinstance) {
6164
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006165 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006166 if (*out == NULL) goto failed;
6167 return 0;
6168 }
6169 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
6170 if (isinstance == -1) {
6171 return 1;
6172 }
6173 if (isinstance) {
6174
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006175 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006176 if (*out == NULL) goto failed;
6177 return 0;
6178 }
6179 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
6180 if (isinstance == -1) {
6181 return 1;
6182 }
6183 if (isinstance) {
6184
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006185 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006186 if (*out == NULL) goto failed;
6187 return 0;
6188 }
6189
6190 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
6191 failed:
6192 Py_XDECREF(tmp);
6193 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006194}
6195
6196int
6197obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
6198{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006199 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006200
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006201 PyObject *tmp = NULL;
6202 int lineno;
6203 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006204 int end_lineno;
6205 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006206
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006207 if (obj == Py_None) {
6208 *out = NULL;
6209 return 0;
6210 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006211 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
6212 return 1;
6213 }
6214 if (tmp == NULL) {
6215 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
6216 return 1;
6217 }
6218 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006219 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006220 res = obj2ast_int(tmp, &lineno, arena);
6221 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006222 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006223 }
6224 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006225 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006226 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006227 if (tmp == NULL) {
6228 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" 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, &col_offset, arena);
6234 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006235 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006236 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006237 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
6238 return 1;
6239 }
6240 if (tmp == NULL || tmp == Py_None) {
6241 Py_CLEAR(tmp);
6242 end_lineno = 0;
6243 }
6244 else {
6245 int res;
6246 res = obj2ast_int(tmp, &end_lineno, arena);
6247 if (res != 0) goto failed;
6248 Py_CLEAR(tmp);
6249 }
6250 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
6251 return 1;
6252 }
6253 if (tmp == NULL || tmp == Py_None) {
6254 Py_CLEAR(tmp);
6255 end_col_offset = 0;
6256 }
6257 else {
6258 int res;
6259 res = obj2ast_int(tmp, &end_col_offset, arena);
6260 if (res != 0) goto failed;
6261 Py_CLEAR(tmp);
6262 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006263 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
6264 if (isinstance == -1) {
6265 return 1;
6266 }
6267 if (isinstance) {
6268 boolop_ty op;
6269 asdl_seq* values;
6270
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006271 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6272 return 1;
6273 }
6274 if (tmp == NULL) {
6275 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
6276 return 1;
6277 }
6278 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006279 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006280 res = obj2ast_boolop(tmp, &op, arena);
6281 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006282 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006283 }
6284 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006285 return 1;
6286 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006287 if (tmp == NULL) {
6288 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
6289 return 1;
6290 }
6291 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006292 int res;
6293 Py_ssize_t len;
6294 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006295 if (!PyList_Check(tmp)) {
6296 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6297 goto failed;
6298 }
6299 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006300 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006301 if (values == NULL) goto failed;
6302 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006303 expr_ty val;
6304 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006305 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006306 if (len != PyList_GET_SIZE(tmp)) {
6307 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
6308 goto failed;
6309 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006310 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006311 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006312 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006313 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006314 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
6315 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006316 if (*out == NULL) goto failed;
6317 return 0;
6318 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07006319 isinstance = PyObject_IsInstance(obj, (PyObject*)NamedExpr_type);
6320 if (isinstance == -1) {
6321 return 1;
6322 }
6323 if (isinstance) {
6324 expr_ty target;
6325 expr_ty value;
6326
6327 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
6328 return 1;
6329 }
6330 if (tmp == NULL) {
6331 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
6332 return 1;
6333 }
6334 else {
6335 int res;
6336 res = obj2ast_expr(tmp, &target, arena);
6337 if (res != 0) goto failed;
6338 Py_CLEAR(tmp);
6339 }
6340 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6341 return 1;
6342 }
6343 if (tmp == NULL) {
6344 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
6345 return 1;
6346 }
6347 else {
6348 int res;
6349 res = obj2ast_expr(tmp, &value, arena);
6350 if (res != 0) goto failed;
6351 Py_CLEAR(tmp);
6352 }
6353 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
6354 end_col_offset, arena);
6355 if (*out == NULL) goto failed;
6356 return 0;
6357 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006358 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
6359 if (isinstance == -1) {
6360 return 1;
6361 }
6362 if (isinstance) {
6363 expr_ty left;
6364 operator_ty op;
6365 expr_ty right;
6366
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006367 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6368 return 1;
6369 }
6370 if (tmp == NULL) {
6371 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
6372 return 1;
6373 }
6374 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006375 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006376 res = obj2ast_expr(tmp, &left, arena);
6377 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006378 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006379 }
6380 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006381 return 1;
6382 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006383 if (tmp == NULL) {
6384 PyErr_SetString(PyExc_TypeError, "required field \"op\" 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_operator(tmp, &op, 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_right, &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 \"right\" 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_expr(tmp, &right, arena);
6403 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006404 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006405 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006406 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
6407 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006408 if (*out == NULL) goto failed;
6409 return 0;
6410 }
6411 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
6412 if (isinstance == -1) {
6413 return 1;
6414 }
6415 if (isinstance) {
6416 unaryop_ty op;
6417 expr_ty operand;
6418
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006419 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6420 return 1;
6421 }
6422 if (tmp == NULL) {
6423 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
6424 return 1;
6425 }
6426 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006427 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006428 res = obj2ast_unaryop(tmp, &op, arena);
6429 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006430 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006431 }
6432 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006433 return 1;
6434 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006435 if (tmp == NULL) {
6436 PyErr_SetString(PyExc_TypeError, "required field \"operand\" 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_expr(tmp, &operand, arena);
6442 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006443 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006444 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006445 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
6446 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006447 if (*out == NULL) goto failed;
6448 return 0;
6449 }
6450 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
6451 if (isinstance == -1) {
6452 return 1;
6453 }
6454 if (isinstance) {
6455 arguments_ty args;
6456 expr_ty body;
6457
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006458 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
6459 return 1;
6460 }
6461 if (tmp == NULL) {
6462 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
6463 return 1;
6464 }
6465 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006466 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006467 res = obj2ast_arguments(tmp, &args, arena);
6468 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006469 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006470 }
6471 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006472 return 1;
6473 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006474 if (tmp == NULL) {
6475 PyErr_SetString(PyExc_TypeError, "required field \"body\" 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_expr(tmp, &body, arena);
6481 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006482 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006483 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006484 *out = Lambda(args, body, lineno, col_offset, end_lineno,
6485 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006486 if (*out == NULL) goto failed;
6487 return 0;
6488 }
6489 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
6490 if (isinstance == -1) {
6491 return 1;
6492 }
6493 if (isinstance) {
6494 expr_ty test;
6495 expr_ty body;
6496 expr_ty orelse;
6497
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006498 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
6499 return 1;
6500 }
6501 if (tmp == NULL) {
6502 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
6503 return 1;
6504 }
6505 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006506 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006507 res = obj2ast_expr(tmp, &test, arena);
6508 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006509 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006510 }
6511 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006512 return 1;
6513 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006514 if (tmp == NULL) {
6515 PyErr_SetString(PyExc_TypeError, "required field \"body\" 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, &body, 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_orelse, &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 \"orelse\" 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, &orelse, arena);
6534 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006535 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006536 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006537 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
6538 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006539 if (*out == NULL) goto failed;
6540 return 0;
6541 }
6542 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6543 if (isinstance == -1) {
6544 return 1;
6545 }
6546 if (isinstance) {
6547 asdl_seq* keys;
6548 asdl_seq* values;
6549
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006550 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6551 return 1;
6552 }
6553 if (tmp == NULL) {
6554 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6555 return 1;
6556 }
6557 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006558 int res;
6559 Py_ssize_t len;
6560 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006561 if (!PyList_Check(tmp)) {
6562 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6563 goto failed;
6564 }
6565 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006566 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006567 if (keys == NULL) goto failed;
6568 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006569 expr_ty val;
6570 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006571 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006572 if (len != PyList_GET_SIZE(tmp)) {
6573 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6574 goto failed;
6575 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006576 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006577 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006578 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006579 }
6580 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006581 return 1;
6582 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006583 if (tmp == NULL) {
6584 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6585 return 1;
6586 }
6587 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006588 int res;
6589 Py_ssize_t len;
6590 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006591 if (!PyList_Check(tmp)) {
6592 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6593 goto failed;
6594 }
6595 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006596 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006597 if (values == NULL) goto failed;
6598 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006599 expr_ty val;
6600 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006601 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006602 if (len != PyList_GET_SIZE(tmp)) {
6603 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6604 goto failed;
6605 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006606 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006607 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006608 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006609 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006610 *out = Dict(keys, values, lineno, col_offset, end_lineno,
6611 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006612 if (*out == NULL) goto failed;
6613 return 0;
6614 }
6615 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6616 if (isinstance == -1) {
6617 return 1;
6618 }
6619 if (isinstance) {
6620 asdl_seq* elts;
6621
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006622 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6623 return 1;
6624 }
6625 if (tmp == NULL) {
6626 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6627 return 1;
6628 }
6629 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006630 int res;
6631 Py_ssize_t len;
6632 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006633 if (!PyList_Check(tmp)) {
6634 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6635 goto failed;
6636 }
6637 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006638 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006639 if (elts == NULL) goto failed;
6640 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006641 expr_ty val;
6642 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006643 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006644 if (len != PyList_GET_SIZE(tmp)) {
6645 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6646 goto failed;
6647 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006648 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006649 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006650 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006651 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006652 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006653 if (*out == NULL) goto failed;
6654 return 0;
6655 }
6656 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6657 if (isinstance == -1) {
6658 return 1;
6659 }
6660 if (isinstance) {
6661 expr_ty elt;
6662 asdl_seq* generators;
6663
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006664 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6665 return 1;
6666 }
6667 if (tmp == NULL) {
6668 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6669 return 1;
6670 }
6671 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006672 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006673 res = obj2ast_expr(tmp, &elt, arena);
6674 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006675 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006676 }
6677 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006678 return 1;
6679 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006680 if (tmp == NULL) {
6681 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6682 return 1;
6683 }
6684 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006685 int res;
6686 Py_ssize_t len;
6687 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006688 if (!PyList_Check(tmp)) {
6689 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6690 goto failed;
6691 }
6692 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006693 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006694 if (generators == NULL) goto failed;
6695 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006696 comprehension_ty val;
6697 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006698 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006699 if (len != PyList_GET_SIZE(tmp)) {
6700 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6701 goto failed;
6702 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006703 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006704 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006705 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006706 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006707 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
6708 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006709 if (*out == NULL) goto failed;
6710 return 0;
6711 }
6712 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6713 if (isinstance == -1) {
6714 return 1;
6715 }
6716 if (isinstance) {
6717 expr_ty elt;
6718 asdl_seq* generators;
6719
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006720 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6721 return 1;
6722 }
6723 if (tmp == NULL) {
6724 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6725 return 1;
6726 }
6727 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006728 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006729 res = obj2ast_expr(tmp, &elt, arena);
6730 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006731 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006732 }
6733 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006734 return 1;
6735 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006736 if (tmp == NULL) {
6737 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6738 return 1;
6739 }
6740 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006741 int res;
6742 Py_ssize_t len;
6743 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006744 if (!PyList_Check(tmp)) {
6745 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6746 goto failed;
6747 }
6748 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006749 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006750 if (generators == NULL) goto failed;
6751 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006752 comprehension_ty val;
6753 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006754 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006755 if (len != PyList_GET_SIZE(tmp)) {
6756 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6757 goto failed;
6758 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006759 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006760 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006761 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006762 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006763 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
6764 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006765 if (*out == NULL) goto failed;
6766 return 0;
6767 }
6768 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6769 if (isinstance == -1) {
6770 return 1;
6771 }
6772 if (isinstance) {
6773 expr_ty key;
6774 expr_ty value;
6775 asdl_seq* generators;
6776
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006777 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6778 return 1;
6779 }
6780 if (tmp == NULL) {
6781 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6782 return 1;
6783 }
6784 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006785 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006786 res = obj2ast_expr(tmp, &key, arena);
6787 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006788 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006789 }
6790 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006791 return 1;
6792 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006793 if (tmp == NULL) {
6794 PyErr_SetString(PyExc_TypeError, "required field \"value\" 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, &value, 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_generators, &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 \"generators\" missing from DictComp");
6808 return 1;
6809 }
6810 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006811 int res;
6812 Py_ssize_t len;
6813 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006814 if (!PyList_Check(tmp)) {
6815 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6816 goto failed;
6817 }
6818 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006819 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006820 if (generators == NULL) goto failed;
6821 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006822 comprehension_ty val;
6823 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006824 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006825 if (len != PyList_GET_SIZE(tmp)) {
6826 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6827 goto failed;
6828 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006829 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006830 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006831 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006832 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006833 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
6834 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006835 if (*out == NULL) goto failed;
6836 return 0;
6837 }
6838 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6839 if (isinstance == -1) {
6840 return 1;
6841 }
6842 if (isinstance) {
6843 expr_ty elt;
6844 asdl_seq* generators;
6845
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006846 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6847 return 1;
6848 }
6849 if (tmp == NULL) {
6850 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6851 return 1;
6852 }
6853 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006854 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006855 res = obj2ast_expr(tmp, &elt, arena);
6856 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006857 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006858 }
6859 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006860 return 1;
6861 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006862 if (tmp == NULL) {
6863 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6864 return 1;
6865 }
6866 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006867 int res;
6868 Py_ssize_t len;
6869 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006870 if (!PyList_Check(tmp)) {
6871 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6872 goto failed;
6873 }
6874 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006875 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006876 if (generators == NULL) goto failed;
6877 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006878 comprehension_ty val;
6879 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006880 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006881 if (len != PyList_GET_SIZE(tmp)) {
6882 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6883 goto failed;
6884 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006885 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006886 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006887 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006888 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006889 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
6890 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006891 if (*out == NULL) goto failed;
6892 return 0;
6893 }
Yury Selivanov75445082015-05-11 22:57:16 -04006894 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6895 if (isinstance == -1) {
6896 return 1;
6897 }
6898 if (isinstance) {
6899 expr_ty value;
6900
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006901 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6902 return 1;
6903 }
6904 if (tmp == NULL) {
6905 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6906 return 1;
6907 }
6908 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006909 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006910 res = obj2ast_expr(tmp, &value, arena);
6911 if (res != 0) goto failed;
6912 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006913 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006914 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
6915 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006916 if (*out == NULL) goto failed;
6917 return 0;
6918 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006919 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6920 if (isinstance == -1) {
6921 return 1;
6922 }
6923 if (isinstance) {
6924 expr_ty value;
6925
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006926 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6927 return 1;
6928 }
6929 if (tmp == NULL || tmp == Py_None) {
6930 Py_CLEAR(tmp);
6931 value = NULL;
6932 }
6933 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006934 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006935 res = obj2ast_expr(tmp, &value, arena);
6936 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006937 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006938 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006939 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
6940 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006941 if (*out == NULL) goto failed;
6942 return 0;
6943 }
6944 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6945 if (isinstance == -1) {
6946 return 1;
6947 }
6948 if (isinstance) {
6949 expr_ty value;
6950
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006951 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6952 return 1;
6953 }
6954 if (tmp == NULL) {
6955 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6956 return 1;
6957 }
6958 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006959 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006960 res = obj2ast_expr(tmp, &value, arena);
6961 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006962 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006963 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006964 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
6965 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006966 if (*out == NULL) goto failed;
6967 return 0;
6968 }
6969 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6970 if (isinstance == -1) {
6971 return 1;
6972 }
6973 if (isinstance) {
6974 expr_ty left;
6975 asdl_int_seq* ops;
6976 asdl_seq* comparators;
6977
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006978 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6979 return 1;
6980 }
6981 if (tmp == NULL) {
6982 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6983 return 1;
6984 }
6985 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006986 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006987 res = obj2ast_expr(tmp, &left, arena);
6988 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006989 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006990 }
6991 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006992 return 1;
6993 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006994 if (tmp == NULL) {
6995 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6996 return 1;
6997 }
6998 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006999 int res;
7000 Py_ssize_t len;
7001 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007002 if (!PyList_Check(tmp)) {
7003 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7004 goto failed;
7005 }
7006 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007007 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007008 if (ops == NULL) goto failed;
7009 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007010 cmpop_ty val;
7011 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007012 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007013 if (len != PyList_GET_SIZE(tmp)) {
7014 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
7015 goto failed;
7016 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007017 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007018 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007019 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007020 }
7021 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007022 return 1;
7023 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007024 if (tmp == NULL) {
7025 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
7026 return 1;
7027 }
7028 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007029 int res;
7030 Py_ssize_t len;
7031 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007032 if (!PyList_Check(tmp)) {
7033 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7034 goto failed;
7035 }
7036 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007037 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007038 if (comparators == NULL) goto failed;
7039 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007040 expr_ty val;
7041 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007042 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007043 if (len != PyList_GET_SIZE(tmp)) {
7044 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
7045 goto failed;
7046 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007047 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007048 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007049 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007050 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007051 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
7052 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007053 if (*out == NULL) goto failed;
7054 return 0;
7055 }
7056 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
7057 if (isinstance == -1) {
7058 return 1;
7059 }
7060 if (isinstance) {
7061 expr_ty func;
7062 asdl_seq* args;
7063 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007064
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007065 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
7066 return 1;
7067 }
7068 if (tmp == NULL) {
7069 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
7070 return 1;
7071 }
7072 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007073 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007074 res = obj2ast_expr(tmp, &func, arena);
7075 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007076 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007077 }
7078 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007079 return 1;
7080 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007081 if (tmp == NULL) {
7082 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
7083 return 1;
7084 }
7085 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007086 int res;
7087 Py_ssize_t len;
7088 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007089 if (!PyList_Check(tmp)) {
7090 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7091 goto failed;
7092 }
7093 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007094 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007095 if (args == NULL) goto failed;
7096 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007097 expr_ty val;
7098 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007099 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007100 if (len != PyList_GET_SIZE(tmp)) {
7101 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
7102 goto failed;
7103 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007104 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007105 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007106 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007107 }
7108 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007109 return 1;
7110 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007111 if (tmp == NULL) {
7112 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
7113 return 1;
7114 }
7115 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007116 int res;
7117 Py_ssize_t len;
7118 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007119 if (!PyList_Check(tmp)) {
7120 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7121 goto failed;
7122 }
7123 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007124 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007125 if (keywords == NULL) goto failed;
7126 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007127 keyword_ty val;
7128 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007129 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007130 if (len != PyList_GET_SIZE(tmp)) {
7131 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
7132 goto failed;
7133 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007134 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007135 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007136 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007137 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007138 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
7139 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007140 if (*out == NULL) goto failed;
7141 return 0;
7142 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04007143 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
7144 if (isinstance == -1) {
7145 return 1;
7146 }
7147 if (isinstance) {
7148 expr_ty value;
7149 int conversion;
7150 expr_ty format_spec;
7151
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007152 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7153 return 1;
7154 }
7155 if (tmp == NULL) {
7156 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
7157 return 1;
7158 }
7159 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007160 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007161 res = obj2ast_expr(tmp, &value, arena);
7162 if (res != 0) goto failed;
7163 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007164 }
7165 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007166 return 1;
7167 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007168 if (tmp == NULL || tmp == Py_None) {
7169 Py_CLEAR(tmp);
7170 conversion = 0;
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_int(tmp, &conversion, arena);
7175 if (res != 0) goto failed;
7176 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007177 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007178 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
7179 return 1;
7180 }
7181 if (tmp == NULL || tmp == Py_None) {
7182 Py_CLEAR(tmp);
7183 format_spec = NULL;
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_expr(tmp, &format_spec, arena);
7188 if (res != 0) goto failed;
7189 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007190 }
7191 *out = FormattedValue(value, conversion, format_spec, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007192 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007193 if (*out == NULL) goto failed;
7194 return 0;
7195 }
7196 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
7197 if (isinstance == -1) {
7198 return 1;
7199 }
7200 if (isinstance) {
7201 asdl_seq* values;
7202
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007203 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
7204 return 1;
7205 }
7206 if (tmp == NULL) {
7207 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
7208 return 1;
7209 }
7210 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007211 int res;
7212 Py_ssize_t len;
7213 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007214 if (!PyList_Check(tmp)) {
7215 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7216 goto failed;
7217 }
7218 len = PyList_GET_SIZE(tmp);
7219 values = _Py_asdl_seq_new(len, arena);
7220 if (values == NULL) goto failed;
7221 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007222 expr_ty val;
7223 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007224 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03007225 if (len != PyList_GET_SIZE(tmp)) {
7226 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
7227 goto failed;
7228 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007229 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007230 }
7231 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007232 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007233 *out = JoinedStr(values, lineno, col_offset, end_lineno,
7234 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007235 if (*out == NULL) goto failed;
7236 return 0;
7237 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007238 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
7239 if (isinstance == -1) {
7240 return 1;
7241 }
7242 if (isinstance) {
7243 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007244 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007245
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007246 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7247 return 1;
7248 }
7249 if (tmp == NULL) {
7250 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
7251 return 1;
7252 }
7253 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007254 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007255 res = obj2ast_constant(tmp, &value, arena);
7256 if (res != 0) goto failed;
7257 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007258 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007259 if (_PyObject_LookupAttrId(obj, &PyId_kind, &tmp) < 0) {
7260 return 1;
7261 }
7262 if (tmp == NULL || tmp == Py_None) {
7263 Py_CLEAR(tmp);
7264 kind = NULL;
7265 }
7266 else {
7267 int res;
7268 res = obj2ast_string(tmp, &kind, arena);
7269 if (res != 0) goto failed;
7270 Py_CLEAR(tmp);
7271 }
7272 *out = Constant(value, kind, lineno, col_offset, end_lineno,
7273 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007274 if (*out == NULL) goto failed;
7275 return 0;
7276 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007277 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
7278 if (isinstance == -1) {
7279 return 1;
7280 }
7281 if (isinstance) {
7282 expr_ty value;
7283 identifier attr;
7284 expr_context_ty ctx;
7285
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007286 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7287 return 1;
7288 }
7289 if (tmp == NULL) {
7290 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
7291 return 1;
7292 }
7293 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007294 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007295 res = obj2ast_expr(tmp, &value, arena);
7296 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007297 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007298 }
7299 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007300 return 1;
7301 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007302 if (tmp == NULL) {
7303 PyErr_SetString(PyExc_TypeError, "required field \"attr\" 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_identifier(tmp, &attr, 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_ctx, &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 \"ctx\" 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_expr_context(tmp, &ctx, arena);
7322 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007323 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007324 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007325 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
7326 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007327 if (*out == NULL) goto failed;
7328 return 0;
7329 }
7330 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
7331 if (isinstance == -1) {
7332 return 1;
7333 }
7334 if (isinstance) {
7335 expr_ty value;
7336 slice_ty slice;
7337 expr_context_ty ctx;
7338
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007339 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7340 return 1;
7341 }
7342 if (tmp == NULL) {
7343 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
7344 return 1;
7345 }
7346 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007347 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007348 res = obj2ast_expr(tmp, &value, arena);
7349 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007350 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007351 }
7352 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007353 return 1;
7354 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007355 if (tmp == NULL) {
7356 PyErr_SetString(PyExc_TypeError, "required field \"slice\" 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_slice(tmp, &slice, 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_ctx, &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 \"ctx\" 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_expr_context(tmp, &ctx, arena);
7375 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007376 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007377 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007378 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
7379 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007380 if (*out == NULL) goto failed;
7381 return 0;
7382 }
7383 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
7384 if (isinstance == -1) {
7385 return 1;
7386 }
7387 if (isinstance) {
7388 expr_ty value;
7389 expr_context_ty ctx;
7390
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007391 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7392 return 1;
7393 }
7394 if (tmp == NULL) {
7395 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
7396 return 1;
7397 }
7398 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007399 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007400 res = obj2ast_expr(tmp, &value, arena);
7401 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007402 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007403 }
7404 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007405 return 1;
7406 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007407 if (tmp == NULL) {
7408 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" 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_context(tmp, &ctx, arena);
7414 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007415 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007416 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007417 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
7418 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007419 if (*out == NULL) goto failed;
7420 return 0;
7421 }
7422 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
7423 if (isinstance == -1) {
7424 return 1;
7425 }
7426 if (isinstance) {
7427 identifier id;
7428 expr_context_ty ctx;
7429
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007430 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
7431 return 1;
7432 }
7433 if (tmp == NULL) {
7434 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
7435 return 1;
7436 }
7437 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007438 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007439 res = obj2ast_identifier(tmp, &id, arena);
7440 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007441 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007442 }
7443 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007444 return 1;
7445 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007446 if (tmp == NULL) {
7447 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" 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_expr_context(tmp, &ctx, arena);
7453 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007454 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007455 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007456 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
7457 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007458 if (*out == NULL) goto failed;
7459 return 0;
7460 }
7461 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7462 if (isinstance == -1) {
7463 return 1;
7464 }
7465 if (isinstance) {
7466 asdl_seq* elts;
7467 expr_context_ty ctx;
7468
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007469 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7470 return 1;
7471 }
7472 if (tmp == NULL) {
7473 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7474 return 1;
7475 }
7476 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007477 int res;
7478 Py_ssize_t len;
7479 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007480 if (!PyList_Check(tmp)) {
7481 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7482 goto failed;
7483 }
7484 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007485 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007486 if (elts == NULL) goto failed;
7487 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007488 expr_ty val;
7489 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007490 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007491 if (len != PyList_GET_SIZE(tmp)) {
7492 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7493 goto failed;
7494 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007495 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007496 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007497 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007498 }
7499 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007500 return 1;
7501 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007502 if (tmp == NULL) {
7503 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7504 return 1;
7505 }
7506 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007507 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007508 res = obj2ast_expr_context(tmp, &ctx, arena);
7509 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007510 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007511 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007512 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7513 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007514 if (*out == NULL) goto failed;
7515 return 0;
7516 }
7517 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7518 if (isinstance == -1) {
7519 return 1;
7520 }
7521 if (isinstance) {
7522 asdl_seq* elts;
7523 expr_context_ty ctx;
7524
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007525 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7526 return 1;
7527 }
7528 if (tmp == NULL) {
7529 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7530 return 1;
7531 }
7532 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007533 int res;
7534 Py_ssize_t len;
7535 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007536 if (!PyList_Check(tmp)) {
7537 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7538 goto failed;
7539 }
7540 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007541 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007542 if (elts == NULL) goto failed;
7543 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007544 expr_ty val;
7545 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007546 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007547 if (len != PyList_GET_SIZE(tmp)) {
7548 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7549 goto failed;
7550 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007551 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007552 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007553 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007554 }
7555 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007556 return 1;
7557 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007558 if (tmp == NULL) {
7559 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7560 return 1;
7561 }
7562 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007563 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007564 res = obj2ast_expr_context(tmp, &ctx, arena);
7565 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007566 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007567 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007568 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7569 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007570 if (*out == NULL) goto failed;
7571 return 0;
7572 }
7573
7574 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7575 failed:
7576 Py_XDECREF(tmp);
7577 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007578}
7579
7580int
7581obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7582{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007583 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007584
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007585 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7586 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007587 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007588 }
7589 if (isinstance) {
7590 *out = Load;
7591 return 0;
7592 }
7593 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7594 if (isinstance == -1) {
7595 return 1;
7596 }
7597 if (isinstance) {
7598 *out = Store;
7599 return 0;
7600 }
7601 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7602 if (isinstance == -1) {
7603 return 1;
7604 }
7605 if (isinstance) {
7606 *out = Del;
7607 return 0;
7608 }
7609 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7610 if (isinstance == -1) {
7611 return 1;
7612 }
7613 if (isinstance) {
7614 *out = AugLoad;
7615 return 0;
7616 }
7617 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7618 if (isinstance == -1) {
7619 return 1;
7620 }
7621 if (isinstance) {
7622 *out = AugStore;
7623 return 0;
7624 }
7625 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7626 if (isinstance == -1) {
7627 return 1;
7628 }
7629 if (isinstance) {
7630 *out = Param;
7631 return 0;
7632 }
7633
7634 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7635 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007636}
7637
7638int
7639obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7640{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007641 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007642
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007643 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007644
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007645 if (obj == Py_None) {
7646 *out = NULL;
7647 return 0;
7648 }
7649 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7650 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007651 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007652 }
7653 if (isinstance) {
7654 expr_ty lower;
7655 expr_ty upper;
7656 expr_ty step;
7657
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007658 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7659 return 1;
7660 }
7661 if (tmp == NULL || tmp == Py_None) {
7662 Py_CLEAR(tmp);
7663 lower = NULL;
7664 }
7665 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007666 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007667 res = obj2ast_expr(tmp, &lower, arena);
7668 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007669 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007670 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007671 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7672 return 1;
7673 }
7674 if (tmp == NULL || tmp == Py_None) {
7675 Py_CLEAR(tmp);
7676 upper = 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, &upper, 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_step, &tmp) < 0) {
7685 return 1;
7686 }
7687 if (tmp == NULL || tmp == Py_None) {
7688 Py_CLEAR(tmp);
7689 step = 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, &step, 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 }
7697 *out = Slice(lower, upper, step, arena);
7698 if (*out == NULL) goto failed;
7699 return 0;
7700 }
7701 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7702 if (isinstance == -1) {
7703 return 1;
7704 }
7705 if (isinstance) {
7706 asdl_seq* dims;
7707
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007708 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7709 return 1;
7710 }
7711 if (tmp == NULL) {
7712 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7713 return 1;
7714 }
7715 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007716 int res;
7717 Py_ssize_t len;
7718 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007719 if (!PyList_Check(tmp)) {
7720 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7721 goto failed;
7722 }
7723 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007724 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007725 if (dims == NULL) goto failed;
7726 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007727 slice_ty val;
7728 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007729 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007730 if (len != PyList_GET_SIZE(tmp)) {
7731 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7732 goto failed;
7733 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007734 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007735 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007736 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007737 }
7738 *out = ExtSlice(dims, arena);
7739 if (*out == NULL) goto failed;
7740 return 0;
7741 }
7742 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7743 if (isinstance == -1) {
7744 return 1;
7745 }
7746 if (isinstance) {
7747 expr_ty value;
7748
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007749 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7750 return 1;
7751 }
7752 if (tmp == NULL) {
7753 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7754 return 1;
7755 }
7756 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007757 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007758 res = obj2ast_expr(tmp, &value, arena);
7759 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007760 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007761 }
7762 *out = Index(value, arena);
7763 if (*out == NULL) goto failed;
7764 return 0;
7765 }
7766
7767 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7768 failed:
7769 Py_XDECREF(tmp);
7770 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007771}
7772
7773int
7774obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7775{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007776 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007777
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007778 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7779 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007780 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007781 }
7782 if (isinstance) {
7783 *out = And;
7784 return 0;
7785 }
7786 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7787 if (isinstance == -1) {
7788 return 1;
7789 }
7790 if (isinstance) {
7791 *out = Or;
7792 return 0;
7793 }
7794
7795 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7796 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007797}
7798
7799int
7800obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7801{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007802 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007803
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007804 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7805 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007806 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007807 }
7808 if (isinstance) {
7809 *out = Add;
7810 return 0;
7811 }
7812 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7813 if (isinstance == -1) {
7814 return 1;
7815 }
7816 if (isinstance) {
7817 *out = Sub;
7818 return 0;
7819 }
7820 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7821 if (isinstance == -1) {
7822 return 1;
7823 }
7824 if (isinstance) {
7825 *out = Mult;
7826 return 0;
7827 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007828 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7829 if (isinstance == -1) {
7830 return 1;
7831 }
7832 if (isinstance) {
7833 *out = MatMult;
7834 return 0;
7835 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007836 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7837 if (isinstance == -1) {
7838 return 1;
7839 }
7840 if (isinstance) {
7841 *out = Div;
7842 return 0;
7843 }
7844 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7845 if (isinstance == -1) {
7846 return 1;
7847 }
7848 if (isinstance) {
7849 *out = Mod;
7850 return 0;
7851 }
7852 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7853 if (isinstance == -1) {
7854 return 1;
7855 }
7856 if (isinstance) {
7857 *out = Pow;
7858 return 0;
7859 }
7860 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7861 if (isinstance == -1) {
7862 return 1;
7863 }
7864 if (isinstance) {
7865 *out = LShift;
7866 return 0;
7867 }
7868 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7869 if (isinstance == -1) {
7870 return 1;
7871 }
7872 if (isinstance) {
7873 *out = RShift;
7874 return 0;
7875 }
7876 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7877 if (isinstance == -1) {
7878 return 1;
7879 }
7880 if (isinstance) {
7881 *out = BitOr;
7882 return 0;
7883 }
7884 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7885 if (isinstance == -1) {
7886 return 1;
7887 }
7888 if (isinstance) {
7889 *out = BitXor;
7890 return 0;
7891 }
7892 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7893 if (isinstance == -1) {
7894 return 1;
7895 }
7896 if (isinstance) {
7897 *out = BitAnd;
7898 return 0;
7899 }
7900 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7901 if (isinstance == -1) {
7902 return 1;
7903 }
7904 if (isinstance) {
7905 *out = FloorDiv;
7906 return 0;
7907 }
7908
7909 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7910 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007911}
7912
7913int
7914obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7915{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007916 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007917
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007918 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7919 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007920 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007921 }
7922 if (isinstance) {
7923 *out = Invert;
7924 return 0;
7925 }
7926 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7927 if (isinstance == -1) {
7928 return 1;
7929 }
7930 if (isinstance) {
7931 *out = Not;
7932 return 0;
7933 }
7934 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7935 if (isinstance == -1) {
7936 return 1;
7937 }
7938 if (isinstance) {
7939 *out = UAdd;
7940 return 0;
7941 }
7942 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7943 if (isinstance == -1) {
7944 return 1;
7945 }
7946 if (isinstance) {
7947 *out = USub;
7948 return 0;
7949 }
7950
7951 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7952 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007953}
7954
7955int
7956obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7957{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007958 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007959
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007960 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7961 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007962 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007963 }
7964 if (isinstance) {
7965 *out = Eq;
7966 return 0;
7967 }
7968 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7969 if (isinstance == -1) {
7970 return 1;
7971 }
7972 if (isinstance) {
7973 *out = NotEq;
7974 return 0;
7975 }
7976 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7977 if (isinstance == -1) {
7978 return 1;
7979 }
7980 if (isinstance) {
7981 *out = Lt;
7982 return 0;
7983 }
7984 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7985 if (isinstance == -1) {
7986 return 1;
7987 }
7988 if (isinstance) {
7989 *out = LtE;
7990 return 0;
7991 }
7992 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7993 if (isinstance == -1) {
7994 return 1;
7995 }
7996 if (isinstance) {
7997 *out = Gt;
7998 return 0;
7999 }
8000 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
8001 if (isinstance == -1) {
8002 return 1;
8003 }
8004 if (isinstance) {
8005 *out = GtE;
8006 return 0;
8007 }
8008 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
8009 if (isinstance == -1) {
8010 return 1;
8011 }
8012 if (isinstance) {
8013 *out = Is;
8014 return 0;
8015 }
8016 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
8017 if (isinstance == -1) {
8018 return 1;
8019 }
8020 if (isinstance) {
8021 *out = IsNot;
8022 return 0;
8023 }
8024 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
8025 if (isinstance == -1) {
8026 return 1;
8027 }
8028 if (isinstance) {
8029 *out = In;
8030 return 0;
8031 }
8032 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
8033 if (isinstance == -1) {
8034 return 1;
8035 }
8036 if (isinstance) {
8037 *out = NotIn;
8038 return 0;
8039 }
8040
8041 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
8042 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008043}
8044
8045int
8046obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
8047{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008048 PyObject* tmp = NULL;
8049 expr_ty target;
8050 expr_ty iter;
8051 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008052 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008053
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008054 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
8055 return 1;
8056 }
8057 if (tmp == NULL) {
8058 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
8059 return 1;
8060 }
8061 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008062 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008063 res = obj2ast_expr(tmp, &target, arena);
8064 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008065 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008066 }
8067 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008068 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008069 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008070 if (tmp == NULL) {
8071 PyErr_SetString(PyExc_TypeError, "required field \"iter\" 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, &iter, 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_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008081 return 1;
8082 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008083 if (tmp == NULL) {
8084 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
8085 return 1;
8086 }
8087 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008088 int res;
8089 Py_ssize_t len;
8090 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008091 if (!PyList_Check(tmp)) {
8092 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8093 goto failed;
8094 }
8095 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008096 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008097 if (ifs == NULL) goto failed;
8098 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008099 expr_ty val;
8100 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008101 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008102 if (len != PyList_GET_SIZE(tmp)) {
8103 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
8104 goto failed;
8105 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008106 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008107 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008108 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008109 }
8110 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008111 return 1;
8112 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008113 if (tmp == NULL) {
8114 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
8115 return 1;
8116 }
8117 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008118 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008119 res = obj2ast_int(tmp, &is_async, arena);
8120 if (res != 0) goto failed;
8121 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008122 }
8123 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008124 return 0;
8125failed:
8126 Py_XDECREF(tmp);
8127 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008128}
8129
8130int
8131obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
8132{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008133 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00008134
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008135 PyObject *tmp = NULL;
8136 int lineno;
8137 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008138 int end_lineno;
8139 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008140
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008141 if (obj == Py_None) {
8142 *out = NULL;
8143 return 0;
8144 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008145 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8146 return 1;
8147 }
8148 if (tmp == NULL) {
8149 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
8150 return 1;
8151 }
8152 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008153 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008154 res = obj2ast_int(tmp, &lineno, arena);
8155 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008156 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008157 }
8158 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008159 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008160 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008161 if (tmp == NULL) {
8162 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" 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, &col_offset, arena);
8168 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008169 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008170 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008171 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8172 return 1;
8173 }
8174 if (tmp == NULL || tmp == Py_None) {
8175 Py_CLEAR(tmp);
8176 end_lineno = 0;
8177 }
8178 else {
8179 int res;
8180 res = obj2ast_int(tmp, &end_lineno, arena);
8181 if (res != 0) goto failed;
8182 Py_CLEAR(tmp);
8183 }
8184 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8185 return 1;
8186 }
8187 if (tmp == NULL || tmp == Py_None) {
8188 Py_CLEAR(tmp);
8189 end_col_offset = 0;
8190 }
8191 else {
8192 int res;
8193 res = obj2ast_int(tmp, &end_col_offset, arena);
8194 if (res != 0) goto failed;
8195 Py_CLEAR(tmp);
8196 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008197 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
8198 if (isinstance == -1) {
8199 return 1;
8200 }
8201 if (isinstance) {
8202 expr_ty type;
8203 identifier name;
8204 asdl_seq* body;
8205
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008206 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
8207 return 1;
8208 }
8209 if (tmp == NULL || tmp == Py_None) {
8210 Py_CLEAR(tmp);
8211 type = NULL;
8212 }
8213 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008214 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008215 res = obj2ast_expr(tmp, &type, arena);
8216 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008217 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008218 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008219 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8220 return 1;
8221 }
8222 if (tmp == NULL || tmp == Py_None) {
8223 Py_CLEAR(tmp);
8224 name = NULL;
8225 }
8226 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008227 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008228 res = obj2ast_identifier(tmp, &name, 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_body, &tmp) < 0) {
8233 return 1;
8234 }
8235 if (tmp == NULL) {
8236 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
8237 return 1;
8238 }
8239 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008240 int res;
8241 Py_ssize_t len;
8242 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008243 if (!PyList_Check(tmp)) {
8244 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8245 goto failed;
8246 }
8247 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008248 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008249 if (body == NULL) goto failed;
8250 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008251 stmt_ty val;
8252 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008253 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008254 if (len != PyList_GET_SIZE(tmp)) {
8255 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
8256 goto failed;
8257 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008258 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008259 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008260 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008261 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008262 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
8263 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008264 if (*out == NULL) goto failed;
8265 return 0;
8266 }
8267
8268 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
8269 failed:
8270 Py_XDECREF(tmp);
8271 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008272}
8273
8274int
8275obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
8276{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008277 PyObject* tmp = NULL;
8278 asdl_seq* args;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008279 asdl_seq* posonlyargs;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008280 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008281 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008282 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008283 arg_ty kwarg;
8284 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008285
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008286 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
8287 return 1;
8288 }
8289 if (tmp == NULL) {
8290 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
8291 return 1;
8292 }
8293 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008294 int res;
8295 Py_ssize_t len;
8296 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008297 if (!PyList_Check(tmp)) {
8298 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8299 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008300 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008301 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008302 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008303 if (args == NULL) goto failed;
8304 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008305 arg_ty val;
8306 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008307 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008308 if (len != PyList_GET_SIZE(tmp)) {
8309 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
8310 goto failed;
8311 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008312 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008313 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008314 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008315 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008316 if (_PyObject_LookupAttrId(obj, &PyId_posonlyargs, &tmp) < 0) {
8317 return 1;
8318 }
8319 if (tmp == NULL) {
8320 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
8321 return 1;
8322 }
8323 else {
8324 int res;
8325 Py_ssize_t len;
8326 Py_ssize_t i;
8327 if (!PyList_Check(tmp)) {
8328 PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8329 goto failed;
8330 }
8331 len = PyList_GET_SIZE(tmp);
8332 posonlyargs = _Py_asdl_seq_new(len, arena);
8333 if (posonlyargs == NULL) goto failed;
8334 for (i = 0; i < len; i++) {
8335 arg_ty val;
8336 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
8337 if (res != 0) goto failed;
8338 if (len != PyList_GET_SIZE(tmp)) {
8339 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
8340 goto failed;
8341 }
8342 asdl_seq_SET(posonlyargs, i, val);
8343 }
8344 Py_CLEAR(tmp);
8345 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008346 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008347 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008348 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008349 if (tmp == NULL || tmp == Py_None) {
8350 Py_CLEAR(tmp);
8351 vararg = NULL;
8352 }
8353 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008354 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008355 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008356 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008357 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008358 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008359 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
8360 return 1;
8361 }
8362 if (tmp == NULL) {
8363 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
8364 return 1;
8365 }
8366 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008367 int res;
8368 Py_ssize_t len;
8369 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008370 if (!PyList_Check(tmp)) {
8371 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8372 goto failed;
8373 }
8374 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008375 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008376 if (kwonlyargs == NULL) goto failed;
8377 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008378 arg_ty val;
8379 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008380 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008381 if (len != PyList_GET_SIZE(tmp)) {
8382 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
8383 goto failed;
8384 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008385 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008386 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008387 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008388 }
8389 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008390 return 1;
8391 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008392 if (tmp == NULL) {
8393 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
8394 return 1;
8395 }
8396 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008397 int res;
8398 Py_ssize_t len;
8399 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008400 if (!PyList_Check(tmp)) {
8401 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8402 goto failed;
8403 }
8404 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008405 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008406 if (kw_defaults == NULL) goto failed;
8407 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008408 expr_ty val;
8409 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008410 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008411 if (len != PyList_GET_SIZE(tmp)) {
8412 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
8413 goto failed;
8414 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008415 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008416 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008417 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008418 }
8419 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008420 return 1;
8421 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008422 if (tmp == NULL || tmp == Py_None) {
8423 Py_CLEAR(tmp);
8424 kwarg = NULL;
8425 }
8426 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008427 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008428 res = obj2ast_arg(tmp, &kwarg, arena);
8429 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02008430 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008431 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008432 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
8433 return 1;
8434 }
8435 if (tmp == NULL) {
8436 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
8437 return 1;
8438 }
8439 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008440 int res;
8441 Py_ssize_t len;
8442 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008443 if (!PyList_Check(tmp)) {
8444 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8445 goto failed;
8446 }
8447 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008448 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008449 if (defaults == NULL) goto failed;
8450 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008451 expr_ty val;
8452 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008453 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008454 if (len != PyList_GET_SIZE(tmp)) {
8455 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
8456 goto failed;
8457 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008458 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008459 }
Victor Stinnerb3189902013-07-27 00:04:42 +02008460 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008461 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008462 *out = arguments(args, posonlyargs, vararg, kwonlyargs, kw_defaults, kwarg,
8463 defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008464 return 0;
8465failed:
8466 Py_XDECREF(tmp);
8467 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008468}
8469
8470int
8471obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
8472{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008473 PyObject* tmp = NULL;
8474 identifier arg;
8475 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008476 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01008477 int lineno;
8478 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008479 int end_lineno;
8480 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008481
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008482 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8483 return 1;
8484 }
8485 if (tmp == NULL) {
8486 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
8487 return 1;
8488 }
8489 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008490 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008491 res = obj2ast_identifier(tmp, &arg, arena);
8492 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008493 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008494 }
8495 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008496 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008497 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008498 if (tmp == NULL || tmp == Py_None) {
8499 Py_CLEAR(tmp);
8500 annotation = NULL;
8501 }
8502 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008503 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008504 res = obj2ast_expr(tmp, &annotation, arena);
8505 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008506 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008507 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008508 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
8509 return 1;
8510 }
8511 if (tmp == NULL || tmp == Py_None) {
8512 Py_CLEAR(tmp);
8513 type_comment = NULL;
8514 }
8515 else {
8516 int res;
8517 res = obj2ast_string(tmp, &type_comment, arena);
8518 if (res != 0) goto failed;
8519 Py_CLEAR(tmp);
8520 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008521 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8522 return 1;
8523 }
8524 if (tmp == NULL) {
8525 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
8526 return 1;
8527 }
8528 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008529 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008530 res = obj2ast_int(tmp, &lineno, arena);
8531 if (res != 0) goto failed;
8532 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008533 }
8534 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008535 return 1;
8536 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008537 if (tmp == NULL) {
8538 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" 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, &col_offset, arena);
8544 if (res != 0) goto failed;
8545 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008546 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008547 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8548 return 1;
8549 }
8550 if (tmp == NULL || tmp == Py_None) {
8551 Py_CLEAR(tmp);
8552 end_lineno = 0;
8553 }
8554 else {
8555 int res;
8556 res = obj2ast_int(tmp, &end_lineno, arena);
8557 if (res != 0) goto failed;
8558 Py_CLEAR(tmp);
8559 }
8560 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8561 return 1;
8562 }
8563 if (tmp == NULL || tmp == Py_None) {
8564 Py_CLEAR(tmp);
8565 end_col_offset = 0;
8566 }
8567 else {
8568 int res;
8569 res = obj2ast_int(tmp, &end_col_offset, arena);
8570 if (res != 0) goto failed;
8571 Py_CLEAR(tmp);
8572 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008573 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
8574 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008575 return 0;
8576failed:
8577 Py_XDECREF(tmp);
8578 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008579}
8580
8581int
8582obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8583{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008584 PyObject* tmp = NULL;
8585 identifier arg;
8586 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008587
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008588 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8589 return 1;
8590 }
8591 if (tmp == NULL || tmp == Py_None) {
8592 Py_CLEAR(tmp);
8593 arg = NULL;
8594 }
8595 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008596 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008597 res = obj2ast_identifier(tmp, &arg, arena);
8598 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008599 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008600 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008601 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8602 return 1;
8603 }
8604 if (tmp == NULL) {
8605 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8606 return 1;
8607 }
8608 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008609 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008610 res = obj2ast_expr(tmp, &value, arena);
8611 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008612 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008613 }
8614 *out = keyword(arg, value, arena);
8615 return 0;
8616failed:
8617 Py_XDECREF(tmp);
8618 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008619}
8620
8621int
8622obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8623{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008624 PyObject* tmp = NULL;
8625 identifier name;
8626 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008627
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008628 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8629 return 1;
8630 }
8631 if (tmp == NULL) {
8632 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8633 return 1;
8634 }
8635 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008636 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008637 res = obj2ast_identifier(tmp, &name, arena);
8638 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008639 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008640 }
8641 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008642 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008643 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008644 if (tmp == NULL || tmp == Py_None) {
8645 Py_CLEAR(tmp);
8646 asname = NULL;
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, &asname, arena);
8651 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008652 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008653 }
8654 *out = alias(name, asname, arena);
8655 return 0;
8656failed:
8657 Py_XDECREF(tmp);
8658 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008659}
8660
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008661int
8662obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8663{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008664 PyObject* tmp = NULL;
8665 expr_ty context_expr;
8666 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008667
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008668 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8669 return 1;
8670 }
8671 if (tmp == NULL) {
8672 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8673 return 1;
8674 }
8675 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008676 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008677 res = obj2ast_expr(tmp, &context_expr, arena);
8678 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008679 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008680 }
8681 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008682 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008683 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008684 if (tmp == NULL || tmp == Py_None) {
8685 Py_CLEAR(tmp);
8686 optional_vars = NULL;
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, &optional_vars, arena);
8691 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008692 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008693 }
8694 *out = withitem(context_expr, optional_vars, arena);
8695 return 0;
8696failed:
8697 Py_XDECREF(tmp);
8698 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008699}
8700
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008701int
8702obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena)
8703{
8704 int isinstance;
8705
8706 PyObject *tmp = NULL;
8707
8708 if (obj == Py_None) {
8709 *out = NULL;
8710 return 0;
8711 }
8712 isinstance = PyObject_IsInstance(obj, (PyObject*)TypeIgnore_type);
8713 if (isinstance == -1) {
8714 return 1;
8715 }
8716 if (isinstance) {
8717 int lineno;
8718
8719 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8720 return 1;
8721 }
8722 if (tmp == NULL) {
8723 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
8724 return 1;
8725 }
8726 else {
8727 int res;
8728 res = obj2ast_int(tmp, &lineno, arena);
8729 if (res != 0) goto failed;
8730 Py_CLEAR(tmp);
8731 }
8732 *out = TypeIgnore(lineno, arena);
8733 if (*out == NULL) goto failed;
8734 return 0;
8735 }
8736
8737 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
8738 failed:
8739 Py_XDECREF(tmp);
8740 return 1;
8741}
8742
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008743
Martin v. Löwis1a214512008-06-11 05:26:20 +00008744static struct PyModuleDef _astmodule = {
8745 PyModuleDef_HEAD_INIT, "_ast"
8746};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008747PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008748PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008749{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008750 PyObject *m, *d;
8751 if (!init_types()) return NULL;
8752 m = PyModule_Create(&_astmodule);
8753 if (!m) return NULL;
8754 d = PyModule_GetDict(m);
8755 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008756 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008757 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008758 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)
8759 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008760 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8761 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8762 NULL;
8763 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8764 0) return NULL;
8765 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8766 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008767 if (PyDict_SetItemString(d, "FunctionType", (PyObject*)FunctionType_type) <
8768 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008769 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8770 NULL;
8771 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8772 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8773 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008774 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8775 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008776 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8777 return NULL;
8778 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8779 NULL;
8780 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8781 NULL;
8782 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8783 NULL;
8784 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8785 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008786 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8787 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008788 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008789 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8790 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008791 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8792 NULL;
8793 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8794 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008795 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8796 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008797 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8798 NULL;
8799 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8800 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8801 NULL;
8802 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8803 NULL;
8804 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8805 return NULL;
8806 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8807 NULL;
8808 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8809 return NULL;
8810 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8811 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8812 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8813 NULL;
8814 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8815 return NULL;
8816 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8817 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8818 NULL;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07008819 if (PyDict_SetItemString(d, "NamedExpr", (PyObject*)NamedExpr_type) < 0)
8820 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008821 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8822 NULL;
8823 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8824 NULL;
8825 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8826 NULL;
8827 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8828 NULL;
8829 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8830 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8831 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8832 return NULL;
8833 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8834 NULL;
8835 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8836 return NULL;
8837 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8838 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008839 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8840 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008841 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8842 NULL;
8843 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8844 return NULL;
8845 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8846 NULL;
8847 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008848 if (PyDict_SetItemString(d, "FormattedValue",
8849 (PyObject*)FormattedValue_type) < 0) return NULL;
8850 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8851 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008852 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8853 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008854 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8855 return NULL;
8856 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8857 return NULL;
8858 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8859 NULL;
8860 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8861 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8862 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8863 NULL;
8864 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8865 0) return NULL;
8866 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8867 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8868 NULL;
8869 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8870 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8871 NULL;
8872 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8873 return NULL;
8874 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8875 NULL;
8876 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8877 NULL;
8878 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8879 NULL;
8880 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8881 return NULL;
8882 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8883 NULL;
8884 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8885 NULL;
8886 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8887 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8888 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8889 return NULL;
8890 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8891 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8892 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008893 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8894 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008895 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8896 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8897 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8898 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8899 NULL;
8900 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8901 NULL;
8902 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8903 NULL;
8904 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8905 NULL;
8906 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8907 NULL;
8908 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8909 return NULL;
8910 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8911 NULL;
8912 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8913 NULL;
8914 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8915 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8916 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8917 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8918 NULL;
8919 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8920 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8921 NULL;
8922 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8923 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8924 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8925 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8926 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8927 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8928 NULL;
8929 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8930 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8931 NULL;
8932 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8933 < 0) return NULL;
8934 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8935 < 0) return NULL;
8936 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8937 < 0) return NULL;
8938 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8939 return NULL;
8940 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8941 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8942 NULL;
8943 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8944 NULL;
8945 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8946 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008947 if (PyDict_SetItemString(d, "type_ignore", (PyObject*)type_ignore_type) <
8948 0) return NULL;
8949 if (PyDict_SetItemString(d, "TypeIgnore", (PyObject*)TypeIgnore_type) < 0)
8950 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008951 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008952}
8953
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008954
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008955PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008956{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008957 if (!init_types())
8958 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008959 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008960}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008961
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008962/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8963mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008964{
Guido van Rossum495da292019-03-07 12:38:08 -08008965 return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION);
8966}
8967
8968mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version)
8969{
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008970 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008971 PyObject *req_type[3];
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08008972 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008973 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008974
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008975 req_type[0] = (PyObject*)Module_type;
8976 req_type[1] = (PyObject*)Expression_type;
8977 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008978
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08008979 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008980
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008981 if (!init_types())
8982 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008983
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008984 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8985 if (isinstance == -1)
8986 return NULL;
8987 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008988 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8989 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008990 return NULL;
8991 }
8992 if (obj2ast_mod(ast, &res, arena) != 0)
8993 return NULL;
8994 else
8995 return res;
8996}
8997
8998int PyAST_Check(PyObject* obj)
8999{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02009000 if (!init_types())
9001 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00009002 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009003}
9004
Martin v. Löwis5b222132007-06-10 09:51:05 +00009005