blob: cb53a41cdf35bd7168674e9964254b33bcac62dc [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);
Eric V. Smith9a4135e2019-05-08 16:28:48 -0400317_Py_IDENTIFIER(expr_text);
Eric V. Smith235a6f02015-09-19 14:51:32 -0400318static char *FormattedValue_fields[]={
319 "value",
320 "conversion",
321 "format_spec",
Eric V. Smith9a4135e2019-05-08 16:28:48 -0400322 "expr_text",
Eric V. Smith235a6f02015-09-19 14:51:32 -0400323};
324static PyTypeObject *JoinedStr_type;
325static char *JoinedStr_fields[]={
326 "values",
327};
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100328static PyTypeObject *Constant_type;
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700329_Py_IDENTIFIER(kind);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100330static char *Constant_fields[]={
331 "value",
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700332 "kind",
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100333};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000334static PyTypeObject *Attribute_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200335_Py_IDENTIFIER(attr);
336_Py_IDENTIFIER(ctx);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000337static char *Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200338 "value",
339 "attr",
340 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000341};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000342static PyTypeObject *Subscript_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200343_Py_IDENTIFIER(slice);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000344static char *Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200345 "value",
346 "slice",
347 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000348};
Guido van Rossum0368b722007-05-11 16:50:42 +0000349static PyTypeObject *Starred_type;
350static char *Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200351 "value",
352 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000353};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000354static PyTypeObject *Name_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200355_Py_IDENTIFIER(id);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000356static char *Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200357 "id",
358 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000359};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000360static PyTypeObject *List_type;
361static char *List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200362 "elts",
363 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000364};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000365static PyTypeObject *Tuple_type;
366static char *Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200367 "elts",
368 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000369};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000370static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000371static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
Serhiy Storchakad8b3a982019-03-05 20:42:06 +0200372*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000373static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000374static PyTypeObject *Load_type;
375static PyTypeObject *Store_type;
376static PyTypeObject *Del_type;
377static PyTypeObject *AugLoad_type;
378static PyTypeObject *AugStore_type;
379static PyTypeObject *Param_type;
380static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000381static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000382static PyTypeObject *Slice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200383_Py_IDENTIFIER(lower);
384_Py_IDENTIFIER(upper);
385_Py_IDENTIFIER(step);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000386static char *Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200387 "lower",
388 "upper",
389 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000390};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000391static PyTypeObject *ExtSlice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200392_Py_IDENTIFIER(dims);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000393static char *ExtSlice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200394 "dims",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000395};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000396static PyTypeObject *Index_type;
397static char *Index_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200398 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000399};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000400static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000401static PyObject *And_singleton, *Or_singleton;
402static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000403static PyTypeObject *And_type;
404static PyTypeObject *Or_type;
405static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000406static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
Benjamin Petersond51374e2014-04-09 23:55:56 -0400407*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton,
408*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton,
409*BitAnd_singleton, *FloorDiv_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000410static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000411static PyTypeObject *Add_type;
412static PyTypeObject *Sub_type;
413static PyTypeObject *Mult_type;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400414static PyTypeObject *MatMult_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000415static PyTypeObject *Div_type;
416static PyTypeObject *Mod_type;
417static PyTypeObject *Pow_type;
418static PyTypeObject *LShift_type;
419static PyTypeObject *RShift_type;
420static PyTypeObject *BitOr_type;
421static PyTypeObject *BitXor_type;
422static PyTypeObject *BitAnd_type;
423static PyTypeObject *FloorDiv_type;
424static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000425static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
426*USub_singleton;
427static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000428static PyTypeObject *Invert_type;
429static PyTypeObject *Not_type;
430static PyTypeObject *UAdd_type;
431static PyTypeObject *USub_type;
432static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000433static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
434*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
435*NotIn_singleton;
436static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000437static PyTypeObject *Eq_type;
438static PyTypeObject *NotEq_type;
439static PyTypeObject *Lt_type;
440static PyTypeObject *LtE_type;
441static PyTypeObject *Gt_type;
442static PyTypeObject *GtE_type;
443static PyTypeObject *Is_type;
444static PyTypeObject *IsNot_type;
445static PyTypeObject *In_type;
446static PyTypeObject *NotIn_type;
447static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000448static PyObject* ast2obj_comprehension(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200449_Py_IDENTIFIER(ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700450_Py_IDENTIFIER(is_async);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000451static char *comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200452 "target",
453 "iter",
454 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700455 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000456};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000457static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000458static char *excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200459 "lineno",
460 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000461 "end_lineno",
462 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000463};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000464static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000465static PyTypeObject *ExceptHandler_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200466_Py_IDENTIFIER(type);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000467static char *ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200468 "type",
469 "name",
470 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000471};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000472static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000473static PyObject* ast2obj_arguments(void*);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100474_Py_IDENTIFIER(posonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200475_Py_IDENTIFIER(vararg);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200476_Py_IDENTIFIER(kwonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200477_Py_IDENTIFIER(kw_defaults);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700478_Py_IDENTIFIER(kwarg);
479_Py_IDENTIFIER(defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000480static char *arguments_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200481 "args",
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100482 "posonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200483 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200484 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200485 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200486 "kwarg",
487 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000488};
Neal Norwitzc1505362006-12-28 06:47:50 +0000489static PyTypeObject *arg_type;
490static PyObject* ast2obj_arg(void*);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700491static char *arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200492 "lineno",
493 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000494 "end_lineno",
495 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700496};
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200497_Py_IDENTIFIER(arg);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000498static char *arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200499 "arg",
500 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800501 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +0000502};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000503static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000504static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000505static char *keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200506 "arg",
507 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000508};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000509static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000510static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200511_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000512static char *alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200513 "name",
514 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000515};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500516static PyTypeObject *withitem_type;
517static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200518_Py_IDENTIFIER(context_expr);
519_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500520static char *withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200521 "context_expr",
522 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500523};
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800524static PyTypeObject *type_ignore_type;
525static PyObject* ast2obj_type_ignore(void*);
526static PyTypeObject *TypeIgnore_type;
527static char *TypeIgnore_fields[]={
528 "lineno",
529};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000530
531
INADA Naokifc489082017-01-25 22:33:43 +0900532_Py_IDENTIFIER(_fields);
533_Py_IDENTIFIER(_attributes);
534
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700535typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100536 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700537 PyObject *dict;
538} AST_object;
539
Benjamin Peterson1767e022012-03-14 21:50:29 -0500540static void
541ast_dealloc(AST_object *self)
542{
INADA Naokia6296d32017-08-24 14:55:17 +0900543 /* bpo-31095: UnTrack is needed before calling any callbacks */
544 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500545 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200546 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500547}
548
Neal Norwitz207c9f32008-03-31 04:42:11 +0000549static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700550ast_traverse(AST_object *self, visitproc visit, void *arg)
551{
552 Py_VISIT(self->dict);
553 return 0;
554}
555
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300556static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700557ast_clear(AST_object *self)
558{
559 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300560 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700561}
562
563static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000564ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
565{
566 Py_ssize_t i, numfields = 0;
567 int res = -1;
568 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200569 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
570 goto cleanup;
571 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000572 if (fields) {
573 numfields = PySequence_Size(fields);
574 if (numfields == -1)
575 goto cleanup;
576 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900577
Neal Norwitz207c9f32008-03-31 04:42:11 +0000578 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900579 if (numfields < PyTuple_GET_SIZE(args)) {
580 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
581 "%zd positional argument%s",
582 Py_TYPE(self)->tp_name,
583 numfields, numfields == 1 ? "" : "s");
584 res = -1;
585 goto cleanup;
586 }
587 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
588 /* cannot be reached when fields is NULL */
589 PyObject *name = PySequence_GetItem(fields, i);
590 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000591 res = -1;
592 goto cleanup;
593 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900594 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
595 Py_DECREF(name);
596 if (res < 0)
597 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000598 }
599 if (kw) {
600 i = 0; /* needed by PyDict_Next */
601 while (PyDict_Next(kw, &i, &key, &value)) {
602 res = PyObject_SetAttr(self, key, value);
603 if (res < 0)
604 goto cleanup;
605 }
606 }
607 cleanup:
608 Py_XDECREF(fields);
609 return res;
610}
611
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000612/* Pickling support */
613static PyObject *
614ast_type_reduce(PyObject *self, PyObject *unused)
615{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200616 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200617 PyObject *dict;
618 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
619 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000620 }
621 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200622 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000623 }
624 return Py_BuildValue("O()", Py_TYPE(self));
625}
626
627static PyMethodDef ast_type_methods[] = {
628 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
629 {NULL}
630};
631
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700632static PyGetSetDef ast_type_getsets[] = {
633 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
634 {NULL}
635};
636
Neal Norwitz207c9f32008-03-31 04:42:11 +0000637static PyTypeObject AST_type = {
638 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000639 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700640 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000641 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500642 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000643 0, /* tp_print */
644 0, /* tp_getattr */
645 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000646 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000647 0, /* tp_repr */
648 0, /* tp_as_number */
649 0, /* tp_as_sequence */
650 0, /* tp_as_mapping */
651 0, /* tp_hash */
652 0, /* tp_call */
653 0, /* tp_str */
654 PyObject_GenericGetAttr, /* tp_getattro */
655 PyObject_GenericSetAttr, /* tp_setattro */
656 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700657 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000658 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700659 (traverseproc)ast_traverse, /* tp_traverse */
660 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000661 0, /* tp_richcompare */
662 0, /* tp_weaklistoffset */
663 0, /* tp_iter */
664 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000665 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000666 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700667 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000668 0, /* tp_base */
669 0, /* tp_dict */
670 0, /* tp_descr_get */
671 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700672 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000673 (initproc)ast_type_init, /* tp_init */
674 PyType_GenericAlloc, /* tp_alloc */
675 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700676 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000677};
678
679
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000680static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
681{
INADA Naokifc489082017-01-25 22:33:43 +0900682 _Py_IDENTIFIER(__module__);
683 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000684 PyObject *fnames, *result;
685 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000686 fnames = PyTuple_New(num_fields);
687 if (!fnames) return NULL;
688 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000689 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000690 if (!field) {
691 Py_DECREF(fnames);
692 return NULL;
693 }
694 PyTuple_SET_ITEM(fnames, i, field);
695 }
INADA Naokifc489082017-01-25 22:33:43 +0900696 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
697 type, base,
698 _PyUnicode_FromId(&PyId__fields), fnames,
699 _PyUnicode_FromId(&PyId___module__),
700 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000701 Py_DECREF(fnames);
702 return (PyTypeObject*)result;
703}
704
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000705static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
706{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000707 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000708 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000709 if (!l)
710 return 0;
711 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000712 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000713 if (!s) {
714 Py_DECREF(l);
715 return 0;
716 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000717 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000718 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200719 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000720 Py_DECREF(l);
721 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000722}
723
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000724/* Conversion AST -> Python */
725
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000726static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
727{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700728 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000729 PyObject *result = PyList_New(n);
730 PyObject *value;
731 if (!result)
732 return NULL;
733 for (i = 0; i < n; i++) {
734 value = func(asdl_seq_GET(seq, i));
735 if (!value) {
736 Py_DECREF(result);
737 return NULL;
738 }
739 PyList_SET_ITEM(result, i, value);
740 }
741 return result;
742}
743
744static PyObject* ast2obj_object(void *o)
745{
746 if (!o)
747 o = Py_None;
748 Py_INCREF((PyObject*)o);
749 return (PyObject*)o;
750}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500751#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100752#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000753#define ast2obj_identifier ast2obj_object
754#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500755#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000756
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000757static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000758{
Christian Heimes217cfd12007-12-02 14:31:20 +0000759 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000760}
761
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000762/* Conversion Python -> AST */
763
764static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
765{
766 if (obj == Py_None)
767 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200768 if (obj) {
769 if (PyArena_AddPyObject(arena, obj) < 0) {
770 *out = NULL;
771 return -1;
772 }
773 Py_INCREF(obj);
774 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000775 *out = obj;
776 return 0;
777}
778
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100779static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
780{
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300781 if (PyArena_AddPyObject(arena, obj) < 0) {
782 *out = NULL;
783 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100784 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300785 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100786 *out = obj;
787 return 0;
788}
789
Benjamin Peterson180e6352011-07-22 11:09:07 -0500790static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500791{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500792 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
793 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500794 return 1;
795 }
796 return obj2ast_object(obj, out, arena);
797}
798
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800799static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
800{
801 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
802 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
803 return 1;
804 }
805 return obj2ast_object(obj, out, arena);
806}
807
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000808static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
809{
810 int i;
811 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100812 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000813 return 1;
814 }
815
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300816 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000817 if (i == -1 && PyErr_Occurred())
818 return 1;
819 *out = i;
820 return 0;
821}
822
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000823static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000824{
825 PyObject *empty_tuple, *d;
826 if (PyType_Ready(&AST_type) < 0)
827 return -1;
828 d = AST_type.tp_dict;
829 empty_tuple = PyTuple_New(0);
830 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900831 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
832 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000833 Py_XDECREF(empty_tuple);
834 return -1;
835 }
836 Py_DECREF(empty_tuple);
837 return 0;
838}
839
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000840
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000841static int init_types(void)
842{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200843 static int initialized;
844 if (initialized) return 1;
845 if (add_ast_fields() < 0) return 0;
846 mod_type = make_type("mod", &AST_type, NULL, 0);
847 if (!mod_type) return 0;
848 if (!add_attributes(mod_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800849 Module_type = make_type("Module", mod_type, Module_fields, 2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200850 if (!Module_type) return 0;
851 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
852 1);
853 if (!Interactive_type) return 0;
854 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
855 if (!Expression_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800856 FunctionType_type = make_type("FunctionType", mod_type,
857 FunctionType_fields, 2);
858 if (!FunctionType_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200859 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
860 if (!Suite_type) return 0;
861 stmt_type = make_type("stmt", &AST_type, NULL, 0);
862 if (!stmt_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000863 if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200864 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800865 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200866 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400867 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800868 AsyncFunctionDef_fields, 6);
Yury Selivanov75445082015-05-11 22:57:16 -0400869 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300870 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200871 if (!ClassDef_type) return 0;
872 Return_type = make_type("Return", stmt_type, Return_fields, 1);
873 if (!Return_type) return 0;
874 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
875 if (!Delete_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800876 Assign_type = make_type("Assign", stmt_type, Assign_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200877 if (!Assign_type) return 0;
878 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
879 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700880 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
881 if (!AnnAssign_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800882 For_type = make_type("For", stmt_type, For_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200883 if (!For_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800884 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400885 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200886 While_type = make_type("While", stmt_type, While_fields, 3);
887 if (!While_type) return 0;
888 If_type = make_type("If", stmt_type, If_fields, 3);
889 if (!If_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800890 With_type = make_type("With", stmt_type, With_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200891 if (!With_type) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800892 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 3);
Yury Selivanov75445082015-05-11 22:57:16 -0400893 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200894 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
895 if (!Raise_type) return 0;
896 Try_type = make_type("Try", stmt_type, Try_fields, 4);
897 if (!Try_type) return 0;
898 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
899 if (!Assert_type) return 0;
900 Import_type = make_type("Import", stmt_type, Import_fields, 1);
901 if (!Import_type) return 0;
902 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
903 if (!ImportFrom_type) return 0;
904 Global_type = make_type("Global", stmt_type, Global_fields, 1);
905 if (!Global_type) return 0;
906 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
907 if (!Nonlocal_type) return 0;
908 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
909 if (!Expr_type) return 0;
910 Pass_type = make_type("Pass", stmt_type, NULL, 0);
911 if (!Pass_type) return 0;
912 Break_type = make_type("Break", stmt_type, NULL, 0);
913 if (!Break_type) return 0;
914 Continue_type = make_type("Continue", stmt_type, NULL, 0);
915 if (!Continue_type) return 0;
916 expr_type = make_type("expr", &AST_type, NULL, 0);
917 if (!expr_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000918 if (!add_attributes(expr_type, expr_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200919 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
920 if (!BoolOp_type) return 0;
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700921 NamedExpr_type = make_type("NamedExpr", expr_type, NamedExpr_fields, 2);
922 if (!NamedExpr_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200923 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
924 if (!BinOp_type) return 0;
925 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
926 if (!UnaryOp_type) return 0;
927 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
928 if (!Lambda_type) return 0;
929 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
930 if (!IfExp_type) return 0;
931 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
932 if (!Dict_type) return 0;
933 Set_type = make_type("Set", expr_type, Set_fields, 1);
934 if (!Set_type) return 0;
935 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
936 if (!ListComp_type) return 0;
937 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
938 if (!SetComp_type) return 0;
939 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
940 if (!DictComp_type) return 0;
941 GeneratorExp_type = make_type("GeneratorExp", expr_type,
942 GeneratorExp_fields, 2);
943 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400944 Await_type = make_type("Await", expr_type, Await_fields, 1);
945 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200946 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
947 if (!Yield_type) return 0;
948 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
949 if (!YieldFrom_type) return 0;
950 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
951 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400952 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200953 if (!Call_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400954 FormattedValue_type = make_type("FormattedValue", expr_type,
Eric V. Smith9a4135e2019-05-08 16:28:48 -0400955 FormattedValue_fields, 4);
Eric V. Smith235a6f02015-09-19 14:51:32 -0400956 if (!FormattedValue_type) return 0;
957 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
958 if (!JoinedStr_type) return 0;
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700959 Constant_type = make_type("Constant", expr_type, Constant_fields, 2);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100960 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200961 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
962 if (!Attribute_type) return 0;
963 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
964 if (!Subscript_type) return 0;
965 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
966 if (!Starred_type) return 0;
967 Name_type = make_type("Name", expr_type, Name_fields, 2);
968 if (!Name_type) return 0;
969 List_type = make_type("List", expr_type, List_fields, 2);
970 if (!List_type) return 0;
971 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
972 if (!Tuple_type) return 0;
973 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
974 if (!expr_context_type) return 0;
975 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
976 Load_type = make_type("Load", expr_context_type, NULL, 0);
977 if (!Load_type) return 0;
978 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
979 if (!Load_singleton) return 0;
980 Store_type = make_type("Store", expr_context_type, NULL, 0);
981 if (!Store_type) return 0;
982 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
983 if (!Store_singleton) return 0;
984 Del_type = make_type("Del", expr_context_type, NULL, 0);
985 if (!Del_type) return 0;
986 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
987 if (!Del_singleton) return 0;
988 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
989 if (!AugLoad_type) return 0;
990 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
991 if (!AugLoad_singleton) return 0;
992 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
993 if (!AugStore_type) return 0;
994 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
995 if (!AugStore_singleton) return 0;
996 Param_type = make_type("Param", expr_context_type, NULL, 0);
997 if (!Param_type) return 0;
998 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
999 if (!Param_singleton) return 0;
1000 slice_type = make_type("slice", &AST_type, NULL, 0);
1001 if (!slice_type) return 0;
1002 if (!add_attributes(slice_type, NULL, 0)) return 0;
1003 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
1004 if (!Slice_type) return 0;
1005 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
1006 if (!ExtSlice_type) return 0;
1007 Index_type = make_type("Index", slice_type, Index_fields, 1);
1008 if (!Index_type) return 0;
1009 boolop_type = make_type("boolop", &AST_type, NULL, 0);
1010 if (!boolop_type) return 0;
1011 if (!add_attributes(boolop_type, NULL, 0)) return 0;
1012 And_type = make_type("And", boolop_type, NULL, 0);
1013 if (!And_type) return 0;
1014 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
1015 if (!And_singleton) return 0;
1016 Or_type = make_type("Or", boolop_type, NULL, 0);
1017 if (!Or_type) return 0;
1018 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
1019 if (!Or_singleton) return 0;
1020 operator_type = make_type("operator", &AST_type, NULL, 0);
1021 if (!operator_type) return 0;
1022 if (!add_attributes(operator_type, NULL, 0)) return 0;
1023 Add_type = make_type("Add", operator_type, NULL, 0);
1024 if (!Add_type) return 0;
1025 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
1026 if (!Add_singleton) return 0;
1027 Sub_type = make_type("Sub", operator_type, NULL, 0);
1028 if (!Sub_type) return 0;
1029 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
1030 if (!Sub_singleton) return 0;
1031 Mult_type = make_type("Mult", operator_type, NULL, 0);
1032 if (!Mult_type) return 0;
1033 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
1034 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -04001035 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
1036 if (!MatMult_type) return 0;
1037 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
1038 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001039 Div_type = make_type("Div", operator_type, NULL, 0);
1040 if (!Div_type) return 0;
1041 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
1042 if (!Div_singleton) return 0;
1043 Mod_type = make_type("Mod", operator_type, NULL, 0);
1044 if (!Mod_type) return 0;
1045 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
1046 if (!Mod_singleton) return 0;
1047 Pow_type = make_type("Pow", operator_type, NULL, 0);
1048 if (!Pow_type) return 0;
1049 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
1050 if (!Pow_singleton) return 0;
1051 LShift_type = make_type("LShift", operator_type, NULL, 0);
1052 if (!LShift_type) return 0;
1053 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
1054 if (!LShift_singleton) return 0;
1055 RShift_type = make_type("RShift", operator_type, NULL, 0);
1056 if (!RShift_type) return 0;
1057 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1058 if (!RShift_singleton) return 0;
1059 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1060 if (!BitOr_type) return 0;
1061 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1062 if (!BitOr_singleton) return 0;
1063 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1064 if (!BitXor_type) return 0;
1065 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1066 if (!BitXor_singleton) return 0;
1067 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1068 if (!BitAnd_type) return 0;
1069 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1070 if (!BitAnd_singleton) return 0;
1071 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1072 if (!FloorDiv_type) return 0;
1073 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1074 if (!FloorDiv_singleton) return 0;
1075 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1076 if (!unaryop_type) return 0;
1077 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1078 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1079 if (!Invert_type) return 0;
1080 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1081 if (!Invert_singleton) return 0;
1082 Not_type = make_type("Not", unaryop_type, NULL, 0);
1083 if (!Not_type) return 0;
1084 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1085 if (!Not_singleton) return 0;
1086 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1087 if (!UAdd_type) return 0;
1088 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1089 if (!UAdd_singleton) return 0;
1090 USub_type = make_type("USub", unaryop_type, NULL, 0);
1091 if (!USub_type) return 0;
1092 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1093 if (!USub_singleton) return 0;
1094 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1095 if (!cmpop_type) return 0;
1096 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1097 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1098 if (!Eq_type) return 0;
1099 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1100 if (!Eq_singleton) return 0;
1101 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1102 if (!NotEq_type) return 0;
1103 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1104 if (!NotEq_singleton) return 0;
1105 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1106 if (!Lt_type) return 0;
1107 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1108 if (!Lt_singleton) return 0;
1109 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1110 if (!LtE_type) return 0;
1111 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1112 if (!LtE_singleton) return 0;
1113 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1114 if (!Gt_type) return 0;
1115 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1116 if (!Gt_singleton) return 0;
1117 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1118 if (!GtE_type) return 0;
1119 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1120 if (!GtE_singleton) return 0;
1121 Is_type = make_type("Is", cmpop_type, NULL, 0);
1122 if (!Is_type) return 0;
1123 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1124 if (!Is_singleton) return 0;
1125 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1126 if (!IsNot_type) return 0;
1127 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1128 if (!IsNot_singleton) return 0;
1129 In_type = make_type("In", cmpop_type, NULL, 0);
1130 if (!In_type) return 0;
1131 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1132 if (!In_singleton) return 0;
1133 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1134 if (!NotIn_type) return 0;
1135 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1136 if (!NotIn_singleton) return 0;
1137 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001138 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001139 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001140 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001141 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1142 if (!excepthandler_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001143 if (!add_attributes(excepthandler_type, excepthandler_attributes, 4))
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001144 return 0;
1145 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1146 ExceptHandler_fields, 3);
1147 if (!ExceptHandler_type) return 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001148 arguments_type = make_type("arguments", &AST_type, arguments_fields, 7);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001149 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001150 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001151 arg_type = make_type("arg", &AST_type, arg_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001152 if (!arg_type) return 0;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001153 if (!add_attributes(arg_type, arg_attributes, 4)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001154 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1155 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001156 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001157 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1158 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001159 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001160 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1161 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001162 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001163 type_ignore_type = make_type("type_ignore", &AST_type, NULL, 0);
1164 if (!type_ignore_type) return 0;
1165 if (!add_attributes(type_ignore_type, NULL, 0)) return 0;
1166 TypeIgnore_type = make_type("TypeIgnore", type_ignore_type,
1167 TypeIgnore_fields, 1);
1168 if (!TypeIgnore_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001169 initialized = 1;
1170 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001171}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001172
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001173static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1174static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1175static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1176static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1177 arena);
1178static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1179static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1180static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1181static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1182static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1183static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1184 arena);
1185static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1186 arena);
1187static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1188static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1189static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1190static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001191static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001192static int obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena*
1193 arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001194
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001196Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001198 mod_ty p;
1199 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1200 if (!p)
1201 return NULL;
1202 p->kind = Module_kind;
1203 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001204 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001205 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206}
1207
1208mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001209Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001211 mod_ty p;
1212 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1213 if (!p)
1214 return NULL;
1215 p->kind = Interactive_kind;
1216 p->v.Interactive.body = body;
1217 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218}
1219
1220mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001221Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001223 mod_ty p;
1224 if (!body) {
1225 PyErr_SetString(PyExc_ValueError,
1226 "field body is required for Expression");
1227 return NULL;
1228 }
1229 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1230 if (!p)
1231 return NULL;
1232 p->kind = Expression_kind;
1233 p->v.Expression.body = body;
1234 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235}
1236
1237mod_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001238FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena)
1239{
1240 mod_ty p;
1241 if (!returns) {
1242 PyErr_SetString(PyExc_ValueError,
1243 "field returns is required for FunctionType");
1244 return NULL;
1245 }
1246 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1247 if (!p)
1248 return NULL;
1249 p->kind = FunctionType_kind;
1250 p->v.FunctionType.argtypes = argtypes;
1251 p->v.FunctionType.returns = returns;
1252 return p;
1253}
1254
1255mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001256Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001257{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001258 mod_ty p;
1259 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1260 if (!p)
1261 return NULL;
1262 p->kind = Suite_kind;
1263 p->v.Suite.body = body;
1264 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265}
1266
1267stmt_ty
1268FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001269 decorator_list, expr_ty returns, string type_comment, int lineno,
1270 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001272 stmt_ty p;
1273 if (!name) {
1274 PyErr_SetString(PyExc_ValueError,
1275 "field name is required for FunctionDef");
1276 return NULL;
1277 }
1278 if (!args) {
1279 PyErr_SetString(PyExc_ValueError,
1280 "field args is required for FunctionDef");
1281 return NULL;
1282 }
1283 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1284 if (!p)
1285 return NULL;
1286 p->kind = FunctionDef_kind;
1287 p->v.FunctionDef.name = name;
1288 p->v.FunctionDef.args = args;
1289 p->v.FunctionDef.body = body;
1290 p->v.FunctionDef.decorator_list = decorator_list;
1291 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001292 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001293 p->lineno = lineno;
1294 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001295 p->end_lineno = end_lineno;
1296 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001297 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001298}
1299
1300stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001301AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001302 * decorator_list, expr_ty returns, string type_comment, int
1303 lineno, int col_offset, int end_lineno, int end_col_offset,
1304 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001305{
1306 stmt_ty p;
1307 if (!name) {
1308 PyErr_SetString(PyExc_ValueError,
1309 "field name is required for AsyncFunctionDef");
1310 return NULL;
1311 }
1312 if (!args) {
1313 PyErr_SetString(PyExc_ValueError,
1314 "field args is required for AsyncFunctionDef");
1315 return NULL;
1316 }
1317 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1318 if (!p)
1319 return NULL;
1320 p->kind = AsyncFunctionDef_kind;
1321 p->v.AsyncFunctionDef.name = name;
1322 p->v.AsyncFunctionDef.args = args;
1323 p->v.AsyncFunctionDef.body = body;
1324 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1325 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001326 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001327 p->lineno = lineno;
1328 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001329 p->end_lineno = end_lineno;
1330 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001331 return p;
1332}
1333
1334stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001335ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001336 body, asdl_seq * decorator_list, int lineno, int col_offset, int
1337 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001339 stmt_ty p;
1340 if (!name) {
1341 PyErr_SetString(PyExc_ValueError,
1342 "field name is required for ClassDef");
1343 return NULL;
1344 }
1345 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1346 if (!p)
1347 return NULL;
1348 p->kind = ClassDef_kind;
1349 p->v.ClassDef.name = name;
1350 p->v.ClassDef.bases = bases;
1351 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001352 p->v.ClassDef.body = body;
1353 p->v.ClassDef.decorator_list = decorator_list;
1354 p->lineno = lineno;
1355 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001356 p->end_lineno = end_lineno;
1357 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001358 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359}
1360
1361stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001362Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
1363 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001365 stmt_ty p;
1366 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1367 if (!p)
1368 return NULL;
1369 p->kind = Return_kind;
1370 p->v.Return.value = value;
1371 p->lineno = lineno;
1372 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001373 p->end_lineno = end_lineno;
1374 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001375 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376}
1377
1378stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001379Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int
1380 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001382 stmt_ty p;
1383 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1384 if (!p)
1385 return NULL;
1386 p->kind = Delete_kind;
1387 p->v.Delete.targets = targets;
1388 p->lineno = lineno;
1389 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001390 p->end_lineno = end_lineno;
1391 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001392 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393}
1394
1395stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001396Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int
1397 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001399 stmt_ty p;
1400 if (!value) {
1401 PyErr_SetString(PyExc_ValueError,
1402 "field value is required for Assign");
1403 return NULL;
1404 }
1405 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1406 if (!p)
1407 return NULL;
1408 p->kind = Assign_kind;
1409 p->v.Assign.targets = targets;
1410 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001411 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001412 p->lineno = lineno;
1413 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001414 p->end_lineno = end_lineno;
1415 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001416 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417}
1418
1419stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001420AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001421 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001423 stmt_ty p;
1424 if (!target) {
1425 PyErr_SetString(PyExc_ValueError,
1426 "field target is required for AugAssign");
1427 return NULL;
1428 }
1429 if (!op) {
1430 PyErr_SetString(PyExc_ValueError,
1431 "field op is required for AugAssign");
1432 return NULL;
1433 }
1434 if (!value) {
1435 PyErr_SetString(PyExc_ValueError,
1436 "field value is required for AugAssign");
1437 return NULL;
1438 }
1439 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1440 if (!p)
1441 return NULL;
1442 p->kind = AugAssign_kind;
1443 p->v.AugAssign.target = target;
1444 p->v.AugAssign.op = op;
1445 p->v.AugAssign.value = value;
1446 p->lineno = lineno;
1447 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001448 p->end_lineno = end_lineno;
1449 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001450 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451}
1452
1453stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001454AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001455 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1456 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001457{
1458 stmt_ty p;
1459 if (!target) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "field target is required for AnnAssign");
1462 return NULL;
1463 }
1464 if (!annotation) {
1465 PyErr_SetString(PyExc_ValueError,
1466 "field annotation is required for AnnAssign");
1467 return NULL;
1468 }
1469 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1470 if (!p)
1471 return NULL;
1472 p->kind = AnnAssign_kind;
1473 p->v.AnnAssign.target = target;
1474 p->v.AnnAssign.annotation = annotation;
1475 p->v.AnnAssign.value = value;
1476 p->v.AnnAssign.simple = simple;
1477 p->lineno = lineno;
1478 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001479 p->end_lineno = end_lineno;
1480 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001481 return p;
1482}
1483
1484stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001485For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string
1486 type_comment, int lineno, int col_offset, int end_lineno, int
1487 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001489 stmt_ty p;
1490 if (!target) {
1491 PyErr_SetString(PyExc_ValueError,
1492 "field target is required for For");
1493 return NULL;
1494 }
1495 if (!iter) {
1496 PyErr_SetString(PyExc_ValueError,
1497 "field iter is required for For");
1498 return NULL;
1499 }
1500 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1501 if (!p)
1502 return NULL;
1503 p->kind = For_kind;
1504 p->v.For.target = target;
1505 p->v.For.iter = iter;
1506 p->v.For.body = body;
1507 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001508 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001509 p->lineno = lineno;
1510 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001511 p->end_lineno = end_lineno;
1512 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001513 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514}
1515
1516stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001517AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse,
1518 string type_comment, int lineno, int col_offset, int end_lineno, int
1519 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001520{
1521 stmt_ty p;
1522 if (!target) {
1523 PyErr_SetString(PyExc_ValueError,
1524 "field target is required for AsyncFor");
1525 return NULL;
1526 }
1527 if (!iter) {
1528 PyErr_SetString(PyExc_ValueError,
1529 "field iter is required for AsyncFor");
1530 return NULL;
1531 }
1532 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1533 if (!p)
1534 return NULL;
1535 p->kind = AsyncFor_kind;
1536 p->v.AsyncFor.target = target;
1537 p->v.AsyncFor.iter = iter;
1538 p->v.AsyncFor.body = body;
1539 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001540 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001541 p->lineno = lineno;
1542 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001543 p->end_lineno = end_lineno;
1544 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001545 return p;
1546}
1547
1548stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001549While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001550 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001552 stmt_ty p;
1553 if (!test) {
1554 PyErr_SetString(PyExc_ValueError,
1555 "field test is required for While");
1556 return NULL;
1557 }
1558 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1559 if (!p)
1560 return NULL;
1561 p->kind = While_kind;
1562 p->v.While.test = test;
1563 p->v.While.body = body;
1564 p->v.While.orelse = orelse;
1565 p->lineno = lineno;
1566 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001567 p->end_lineno = end_lineno;
1568 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001569 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570}
1571
1572stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001573If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001574 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001576 stmt_ty p;
1577 if (!test) {
1578 PyErr_SetString(PyExc_ValueError,
1579 "field test is required for If");
1580 return NULL;
1581 }
1582 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1583 if (!p)
1584 return NULL;
1585 p->kind = If_kind;
1586 p->v.If.test = test;
1587 p->v.If.body = body;
1588 p->v.If.orelse = orelse;
1589 p->lineno = lineno;
1590 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001591 p->end_lineno = end_lineno;
1592 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001593 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594}
1595
1596stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001597With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int
1598 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001599{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001600 stmt_ty p;
1601 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1602 if (!p)
1603 return NULL;
1604 p->kind = With_kind;
1605 p->v.With.items = items;
1606 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001607 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001608 p->lineno = lineno;
1609 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001610 p->end_lineno = end_lineno;
1611 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001612 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001613}
1614
1615stmt_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001616AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno,
1617 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001618{
1619 stmt_ty p;
1620 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1621 if (!p)
1622 return NULL;
1623 p->kind = AsyncWith_kind;
1624 p->v.AsyncWith.items = items;
1625 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001626 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001627 p->lineno = lineno;
1628 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001629 p->end_lineno = end_lineno;
1630 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001631 return p;
1632}
1633
1634stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001635Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
1636 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001638 stmt_ty p;
1639 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1640 if (!p)
1641 return NULL;
1642 p->kind = Raise_kind;
1643 p->v.Raise.exc = exc;
1644 p->v.Raise.cause = cause;
1645 p->lineno = lineno;
1646 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001647 p->end_lineno = end_lineno;
1648 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001649 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650}
1651
1652stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001653Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001654 finalbody, int lineno, int col_offset, int end_lineno, int end_col_offset,
1655 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001657 stmt_ty p;
1658 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1659 if (!p)
1660 return NULL;
1661 p->kind = Try_kind;
1662 p->v.Try.body = body;
1663 p->v.Try.handlers = handlers;
1664 p->v.Try.orelse = orelse;
1665 p->v.Try.finalbody = finalbody;
1666 p->lineno = lineno;
1667 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001668 p->end_lineno = end_lineno;
1669 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001670 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001671}
1672
1673stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001674Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
1675 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001677 stmt_ty p;
1678 if (!test) {
1679 PyErr_SetString(PyExc_ValueError,
1680 "field test is required for Assert");
1681 return NULL;
1682 }
1683 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1684 if (!p)
1685 return NULL;
1686 p->kind = Assert_kind;
1687 p->v.Assert.test = test;
1688 p->v.Assert.msg = msg;
1689 p->lineno = lineno;
1690 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001691 p->end_lineno = end_lineno;
1692 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001693 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694}
1695
1696stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001697Import(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1698 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001700 stmt_ty p;
1701 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1702 if (!p)
1703 return NULL;
1704 p->kind = Import_kind;
1705 p->v.Import.names = names;
1706 p->lineno = lineno;
1707 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001708 p->end_lineno = end_lineno;
1709 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001710 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001711}
1712
1713stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001714ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001715 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001716{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001717 stmt_ty p;
1718 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1719 if (!p)
1720 return NULL;
1721 p->kind = ImportFrom_kind;
1722 p->v.ImportFrom.module = module;
1723 p->v.ImportFrom.names = names;
1724 p->v.ImportFrom.level = level;
1725 p->lineno = lineno;
1726 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001727 p->end_lineno = end_lineno;
1728 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001729 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001730}
1731
1732stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001733Global(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1734 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001736 stmt_ty p;
1737 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1738 if (!p)
1739 return NULL;
1740 p->kind = Global_kind;
1741 p->v.Global.names = names;
1742 p->lineno = lineno;
1743 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001744 p->end_lineno = end_lineno;
1745 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001746 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747}
1748
1749stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001750Nonlocal(asdl_seq * names, int lineno, int col_offset, int end_lineno, int
1751 end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00001752{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001753 stmt_ty p;
1754 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1755 if (!p)
1756 return NULL;
1757 p->kind = Nonlocal_kind;
1758 p->v.Nonlocal.names = names;
1759 p->lineno = lineno;
1760 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001761 p->end_lineno = end_lineno;
1762 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001763 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001764}
1765
1766stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001767Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
1768 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001770 stmt_ty p;
1771 if (!value) {
1772 PyErr_SetString(PyExc_ValueError,
1773 "field value is required for Expr");
1774 return NULL;
1775 }
1776 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1777 if (!p)
1778 return NULL;
1779 p->kind = Expr_kind;
1780 p->v.Expr.value = value;
1781 p->lineno = lineno;
1782 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001783 p->end_lineno = end_lineno;
1784 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001785 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786}
1787
1788stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001789Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1790 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001792 stmt_ty p;
1793 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1794 if (!p)
1795 return NULL;
1796 p->kind = Pass_kind;
1797 p->lineno = lineno;
1798 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001799 p->end_lineno = end_lineno;
1800 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001801 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802}
1803
1804stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001805Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1806 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001808 stmt_ty p;
1809 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1810 if (!p)
1811 return NULL;
1812 p->kind = Break_kind;
1813 p->lineno = lineno;
1814 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001815 p->end_lineno = end_lineno;
1816 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001817 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818}
1819
1820stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001821Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
1822 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001824 stmt_ty p;
1825 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1826 if (!p)
1827 return NULL;
1828 p->kind = Continue_kind;
1829 p->lineno = lineno;
1830 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001831 p->end_lineno = end_lineno;
1832 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001833 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834}
1835
1836expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001837BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int
1838 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001840 expr_ty p;
1841 if (!op) {
1842 PyErr_SetString(PyExc_ValueError,
1843 "field op is required for BoolOp");
1844 return NULL;
1845 }
1846 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1847 if (!p)
1848 return NULL;
1849 p->kind = BoolOp_kind;
1850 p->v.BoolOp.op = op;
1851 p->v.BoolOp.values = values;
1852 p->lineno = lineno;
1853 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001854 p->end_lineno = end_lineno;
1855 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001856 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857}
1858
1859expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07001860NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
1861 end_lineno, int end_col_offset, PyArena *arena)
1862{
1863 expr_ty p;
1864 if (!target) {
1865 PyErr_SetString(PyExc_ValueError,
1866 "field target is required for NamedExpr");
1867 return NULL;
1868 }
1869 if (!value) {
1870 PyErr_SetString(PyExc_ValueError,
1871 "field value is required for NamedExpr");
1872 return NULL;
1873 }
1874 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1875 if (!p)
1876 return NULL;
1877 p->kind = NamedExpr_kind;
1878 p->v.NamedExpr.target = target;
1879 p->v.NamedExpr.value = value;
1880 p->lineno = lineno;
1881 p->col_offset = col_offset;
1882 p->end_lineno = end_lineno;
1883 p->end_col_offset = end_col_offset;
1884 return p;
1885}
1886
1887expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001888BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001889 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001891 expr_ty p;
1892 if (!left) {
1893 PyErr_SetString(PyExc_ValueError,
1894 "field left is required for BinOp");
1895 return NULL;
1896 }
1897 if (!op) {
1898 PyErr_SetString(PyExc_ValueError,
1899 "field op is required for BinOp");
1900 return NULL;
1901 }
1902 if (!right) {
1903 PyErr_SetString(PyExc_ValueError,
1904 "field right is required for BinOp");
1905 return NULL;
1906 }
1907 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1908 if (!p)
1909 return NULL;
1910 p->kind = BinOp_kind;
1911 p->v.BinOp.left = left;
1912 p->v.BinOp.op = op;
1913 p->v.BinOp.right = right;
1914 p->lineno = lineno;
1915 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001916 p->end_lineno = end_lineno;
1917 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001918 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919}
1920
1921expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001922UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
1923 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001925 expr_ty p;
1926 if (!op) {
1927 PyErr_SetString(PyExc_ValueError,
1928 "field op is required for UnaryOp");
1929 return NULL;
1930 }
1931 if (!operand) {
1932 PyErr_SetString(PyExc_ValueError,
1933 "field operand is required for UnaryOp");
1934 return NULL;
1935 }
1936 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1937 if (!p)
1938 return NULL;
1939 p->kind = UnaryOp_kind;
1940 p->v.UnaryOp.op = op;
1941 p->v.UnaryOp.operand = operand;
1942 p->lineno = lineno;
1943 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001944 p->end_lineno = end_lineno;
1945 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001946 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947}
1948
1949expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001950Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
1951 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001953 expr_ty p;
1954 if (!args) {
1955 PyErr_SetString(PyExc_ValueError,
1956 "field args is required for Lambda");
1957 return NULL;
1958 }
1959 if (!body) {
1960 PyErr_SetString(PyExc_ValueError,
1961 "field body is required for Lambda");
1962 return NULL;
1963 }
1964 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1965 if (!p)
1966 return NULL;
1967 p->kind = Lambda_kind;
1968 p->v.Lambda.args = args;
1969 p->v.Lambda.body = body;
1970 p->lineno = lineno;
1971 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001972 p->end_lineno = end_lineno;
1973 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001974 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975}
1976
1977expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001978IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001979 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001980{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001981 expr_ty p;
1982 if (!test) {
1983 PyErr_SetString(PyExc_ValueError,
1984 "field test is required for IfExp");
1985 return NULL;
1986 }
1987 if (!body) {
1988 PyErr_SetString(PyExc_ValueError,
1989 "field body is required for IfExp");
1990 return NULL;
1991 }
1992 if (!orelse) {
1993 PyErr_SetString(PyExc_ValueError,
1994 "field orelse is required for IfExp");
1995 return NULL;
1996 }
1997 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1998 if (!p)
1999 return NULL;
2000 p->kind = IfExp_kind;
2001 p->v.IfExp.test = test;
2002 p->v.IfExp.body = body;
2003 p->v.IfExp.orelse = orelse;
2004 p->lineno = lineno;
2005 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002006 p->end_lineno = end_lineno;
2007 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002008 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002009}
2010
2011expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002012Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, int
2013 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002015 expr_ty p;
2016 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2017 if (!p)
2018 return NULL;
2019 p->kind = Dict_kind;
2020 p->v.Dict.keys = keys;
2021 p->v.Dict.values = values;
2022 p->lineno = lineno;
2023 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002024 p->end_lineno = end_lineno;
2025 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002026 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027}
2028
2029expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002030Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, int
2031 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002032{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002033 expr_ty p;
2034 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2035 if (!p)
2036 return NULL;
2037 p->kind = Set_kind;
2038 p->v.Set.elts = elts;
2039 p->lineno = lineno;
2040 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002041 p->end_lineno = end_lineno;
2042 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002043 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002044}
2045
2046expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002047ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2048 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002050 expr_ty p;
2051 if (!elt) {
2052 PyErr_SetString(PyExc_ValueError,
2053 "field elt is required for ListComp");
2054 return NULL;
2055 }
2056 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2057 if (!p)
2058 return NULL;
2059 p->kind = ListComp_kind;
2060 p->v.ListComp.elt = elt;
2061 p->v.ListComp.generators = generators;
2062 p->lineno = lineno;
2063 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002064 p->end_lineno = end_lineno;
2065 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002066 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067}
2068
2069expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002070SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int
2071 end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002072{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002073 expr_ty p;
2074 if (!elt) {
2075 PyErr_SetString(PyExc_ValueError,
2076 "field elt is required for SetComp");
2077 return NULL;
2078 }
2079 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2080 if (!p)
2081 return NULL;
2082 p->kind = SetComp_kind;
2083 p->v.SetComp.elt = elt;
2084 p->v.SetComp.generators = generators;
2085 p->lineno = lineno;
2086 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002087 p->end_lineno = end_lineno;
2088 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002089 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002090}
2091
2092expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00002093DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002094 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002095{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002096 expr_ty p;
2097 if (!key) {
2098 PyErr_SetString(PyExc_ValueError,
2099 "field key is required for DictComp");
2100 return NULL;
2101 }
2102 if (!value) {
2103 PyErr_SetString(PyExc_ValueError,
2104 "field value is required for DictComp");
2105 return NULL;
2106 }
2107 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2108 if (!p)
2109 return NULL;
2110 p->kind = DictComp_kind;
2111 p->v.DictComp.key = key;
2112 p->v.DictComp.value = value;
2113 p->v.DictComp.generators = generators;
2114 p->lineno = lineno;
2115 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002116 p->end_lineno = end_lineno;
2117 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002118 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002119}
2120
2121expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002122GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002123 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002125 expr_ty p;
2126 if (!elt) {
2127 PyErr_SetString(PyExc_ValueError,
2128 "field elt is required for GeneratorExp");
2129 return NULL;
2130 }
2131 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2132 if (!p)
2133 return NULL;
2134 p->kind = GeneratorExp_kind;
2135 p->v.GeneratorExp.elt = elt;
2136 p->v.GeneratorExp.generators = generators;
2137 p->lineno = lineno;
2138 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002139 p->end_lineno = end_lineno;
2140 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002141 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142}
2143
2144expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002145Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2146 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002147{
2148 expr_ty p;
2149 if (!value) {
2150 PyErr_SetString(PyExc_ValueError,
2151 "field value is required for Await");
2152 return NULL;
2153 }
2154 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2155 if (!p)
2156 return NULL;
2157 p->kind = Await_kind;
2158 p->v.Await.value = value;
2159 p->lineno = lineno;
2160 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002161 p->end_lineno = end_lineno;
2162 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002163 return p;
2164}
2165
2166expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002167Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
2168 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002170 expr_ty p;
2171 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2172 if (!p)
2173 return NULL;
2174 p->kind = Yield_kind;
2175 p->v.Yield.value = value;
2176 p->lineno = lineno;
2177 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002178 p->end_lineno = end_lineno;
2179 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002180 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181}
2182
2183expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002184YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
2185 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05002186{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002187 expr_ty p;
2188 if (!value) {
2189 PyErr_SetString(PyExc_ValueError,
2190 "field value is required for YieldFrom");
2191 return NULL;
2192 }
2193 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2194 if (!p)
2195 return NULL;
2196 p->kind = YieldFrom_kind;
2197 p->v.YieldFrom.value = value;
2198 p->lineno = lineno;
2199 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002200 p->end_lineno = end_lineno;
2201 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002202 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002203}
2204
2205expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002206Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002207 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002208{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002209 expr_ty p;
2210 if (!left) {
2211 PyErr_SetString(PyExc_ValueError,
2212 "field left is required for Compare");
2213 return NULL;
2214 }
2215 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2216 if (!p)
2217 return NULL;
2218 p->kind = Compare_kind;
2219 p->v.Compare.left = left;
2220 p->v.Compare.ops = ops;
2221 p->v.Compare.comparators = comparators;
2222 p->lineno = lineno;
2223 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002224 p->end_lineno = end_lineno;
2225 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002226 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227}
2228
2229expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002230Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002231 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002233 expr_ty p;
2234 if (!func) {
2235 PyErr_SetString(PyExc_ValueError,
2236 "field func is required for Call");
2237 return NULL;
2238 }
2239 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2240 if (!p)
2241 return NULL;
2242 p->kind = Call_kind;
2243 p->v.Call.func = func;
2244 p->v.Call.args = args;
2245 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002246 p->lineno = lineno;
2247 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002248 p->end_lineno = end_lineno;
2249 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002250 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251}
2252
2253expr_ty
Eric V. Smith9a4135e2019-05-08 16:28:48 -04002254FormattedValue(expr_ty value, int conversion, expr_ty format_spec, string
2255 expr_text, int lineno, int col_offset, int end_lineno, int
2256 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002257{
2258 expr_ty p;
2259 if (!value) {
2260 PyErr_SetString(PyExc_ValueError,
2261 "field value is required for FormattedValue");
2262 return NULL;
2263 }
2264 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2265 if (!p)
2266 return NULL;
2267 p->kind = FormattedValue_kind;
2268 p->v.FormattedValue.value = value;
2269 p->v.FormattedValue.conversion = conversion;
2270 p->v.FormattedValue.format_spec = format_spec;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04002271 p->v.FormattedValue.expr_text = expr_text;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002272 p->lineno = lineno;
2273 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002274 p->end_lineno = end_lineno;
2275 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002276 return p;
2277}
2278
2279expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002280JoinedStr(asdl_seq * values, int lineno, int col_offset, int end_lineno, int
2281 end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002282{
2283 expr_ty p;
2284 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2285 if (!p)
2286 return NULL;
2287 p->kind = JoinedStr_kind;
2288 p->v.JoinedStr.values = values;
2289 p->lineno = lineno;
2290 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002291 p->end_lineno = end_lineno;
2292 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002293 return p;
2294}
2295
2296expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002297Constant(constant value, string kind, int lineno, int col_offset, int
2298 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002299{
2300 expr_ty p;
2301 if (!value) {
2302 PyErr_SetString(PyExc_ValueError,
2303 "field value is required for Constant");
2304 return NULL;
2305 }
2306 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2307 if (!p)
2308 return NULL;
2309 p->kind = Constant_kind;
2310 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002311 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002312 p->lineno = lineno;
2313 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002314 p->end_lineno = end_lineno;
2315 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002316 return p;
2317}
2318
2319expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002320Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002321 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002323 expr_ty p;
2324 if (!value) {
2325 PyErr_SetString(PyExc_ValueError,
2326 "field value is required for Attribute");
2327 return NULL;
2328 }
2329 if (!attr) {
2330 PyErr_SetString(PyExc_ValueError,
2331 "field attr is required for Attribute");
2332 return NULL;
2333 }
2334 if (!ctx) {
2335 PyErr_SetString(PyExc_ValueError,
2336 "field ctx is required for Attribute");
2337 return NULL;
2338 }
2339 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2340 if (!p)
2341 return NULL;
2342 p->kind = Attribute_kind;
2343 p->v.Attribute.value = value;
2344 p->v.Attribute.attr = attr;
2345 p->v.Attribute.ctx = ctx;
2346 p->lineno = lineno;
2347 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002348 p->end_lineno = end_lineno;
2349 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002350 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351}
2352
2353expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002354Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002355 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002357 expr_ty p;
2358 if (!value) {
2359 PyErr_SetString(PyExc_ValueError,
2360 "field value is required for Subscript");
2361 return NULL;
2362 }
2363 if (!slice) {
2364 PyErr_SetString(PyExc_ValueError,
2365 "field slice is required for Subscript");
2366 return NULL;
2367 }
2368 if (!ctx) {
2369 PyErr_SetString(PyExc_ValueError,
2370 "field ctx is required for Subscript");
2371 return NULL;
2372 }
2373 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2374 if (!p)
2375 return NULL;
2376 p->kind = Subscript_kind;
2377 p->v.Subscript.value = value;
2378 p->v.Subscript.slice = slice;
2379 p->v.Subscript.ctx = ctx;
2380 p->lineno = lineno;
2381 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002382 p->end_lineno = end_lineno;
2383 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002384 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385}
2386
2387expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002388Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
2389 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00002390{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002391 expr_ty p;
2392 if (!value) {
2393 PyErr_SetString(PyExc_ValueError,
2394 "field value is required for Starred");
2395 return NULL;
2396 }
2397 if (!ctx) {
2398 PyErr_SetString(PyExc_ValueError,
2399 "field ctx is required for Starred");
2400 return NULL;
2401 }
2402 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2403 if (!p)
2404 return NULL;
2405 p->kind = Starred_kind;
2406 p->v.Starred.value = value;
2407 p->v.Starred.ctx = ctx;
2408 p->lineno = lineno;
2409 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002410 p->end_lineno = end_lineno;
2411 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002412 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002413}
2414
2415expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002416Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
2417 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002419 expr_ty p;
2420 if (!id) {
2421 PyErr_SetString(PyExc_ValueError,
2422 "field id is required for Name");
2423 return NULL;
2424 }
2425 if (!ctx) {
2426 PyErr_SetString(PyExc_ValueError,
2427 "field ctx is required for Name");
2428 return NULL;
2429 }
2430 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2431 if (!p)
2432 return NULL;
2433 p->kind = Name_kind;
2434 p->v.Name.id = id;
2435 p->v.Name.ctx = ctx;
2436 p->lineno = lineno;
2437 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002438 p->end_lineno = end_lineno;
2439 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002440 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441}
2442
2443expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002444List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2445 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002447 expr_ty p;
2448 if (!ctx) {
2449 PyErr_SetString(PyExc_ValueError,
2450 "field ctx is required for List");
2451 return NULL;
2452 }
2453 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2454 if (!p)
2455 return NULL;
2456 p->kind = List_kind;
2457 p->v.List.elts = elts;
2458 p->v.List.ctx = ctx;
2459 p->lineno = lineno;
2460 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002461 p->end_lineno = end_lineno;
2462 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002463 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464}
2465
2466expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002467Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
2468 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002470 expr_ty p;
2471 if (!ctx) {
2472 PyErr_SetString(PyExc_ValueError,
2473 "field ctx is required for Tuple");
2474 return NULL;
2475 }
2476 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2477 if (!p)
2478 return NULL;
2479 p->kind = Tuple_kind;
2480 p->v.Tuple.elts = elts;
2481 p->v.Tuple.ctx = ctx;
2482 p->lineno = lineno;
2483 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002484 p->end_lineno = end_lineno;
2485 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002486 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487}
2488
2489slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002490Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002492 slice_ty p;
2493 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2494 if (!p)
2495 return NULL;
2496 p->kind = Slice_kind;
2497 p->v.Slice.lower = lower;
2498 p->v.Slice.upper = upper;
2499 p->v.Slice.step = step;
2500 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002501}
2502
2503slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002504ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002506 slice_ty p;
2507 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2508 if (!p)
2509 return NULL;
2510 p->kind = ExtSlice_kind;
2511 p->v.ExtSlice.dims = dims;
2512 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513}
2514
2515slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002516Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002518 slice_ty p;
2519 if (!value) {
2520 PyErr_SetString(PyExc_ValueError,
2521 "field value is required for Index");
2522 return NULL;
2523 }
2524 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2525 if (!p)
2526 return NULL;
2527 p->kind = Index_kind;
2528 p->v.Index.value = value;
2529 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530}
2531
2532comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002533comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2534 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002536 comprehension_ty p;
2537 if (!target) {
2538 PyErr_SetString(PyExc_ValueError,
2539 "field target is required for comprehension");
2540 return NULL;
2541 }
2542 if (!iter) {
2543 PyErr_SetString(PyExc_ValueError,
2544 "field iter is required for comprehension");
2545 return NULL;
2546 }
2547 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2548 if (!p)
2549 return NULL;
2550 p->target = target;
2551 p->iter = iter;
2552 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002553 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002554 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555}
2556
2557excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002558ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002559 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002561 excepthandler_ty p;
2562 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2563 if (!p)
2564 return NULL;
2565 p->kind = ExceptHandler_kind;
2566 p->v.ExceptHandler.type = type;
2567 p->v.ExceptHandler.name = name;
2568 p->v.ExceptHandler.body = body;
2569 p->lineno = lineno;
2570 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002571 p->end_lineno = end_lineno;
2572 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002573 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574}
2575
2576arguments_ty
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002577arguments(asdl_seq * args, asdl_seq * posonlyargs, arg_ty vararg, asdl_seq *
2578 kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, asdl_seq *
2579 defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002581 arguments_ty p;
2582 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2583 if (!p)
2584 return NULL;
2585 p->args = args;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002586 p->posonlyargs = posonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002587 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002588 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002589 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002590 p->kwarg = kwarg;
2591 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002592 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593}
2594
Neal Norwitzc1505362006-12-28 06:47:50 +00002595arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002596arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
2597 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002598{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002599 arg_ty p;
2600 if (!arg) {
2601 PyErr_SetString(PyExc_ValueError,
2602 "field arg is required for arg");
2603 return NULL;
2604 }
2605 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2606 if (!p)
2607 return NULL;
2608 p->arg = arg;
2609 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002610 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01002611 p->lineno = lineno;
2612 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002613 p->end_lineno = end_lineno;
2614 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002615 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002616}
2617
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002619keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002621 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002622 if (!value) {
2623 PyErr_SetString(PyExc_ValueError,
2624 "field value is required for keyword");
2625 return NULL;
2626 }
2627 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2628 if (!p)
2629 return NULL;
2630 p->arg = arg;
2631 p->value = value;
2632 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633}
2634
2635alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002636alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002638 alias_ty p;
2639 if (!name) {
2640 PyErr_SetString(PyExc_ValueError,
2641 "field name is required for alias");
2642 return NULL;
2643 }
2644 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2645 if (!p)
2646 return NULL;
2647 p->name = name;
2648 p->asname = asname;
2649 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650}
2651
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002652withitem_ty
2653withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2654{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002655 withitem_ty p;
2656 if (!context_expr) {
2657 PyErr_SetString(PyExc_ValueError,
2658 "field context_expr is required for withitem");
2659 return NULL;
2660 }
2661 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2662 if (!p)
2663 return NULL;
2664 p->context_expr = context_expr;
2665 p->optional_vars = optional_vars;
2666 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002667}
2668
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002669type_ignore_ty
2670TypeIgnore(int lineno, PyArena *arena)
2671{
2672 type_ignore_ty p;
2673 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
2674 if (!p)
2675 return NULL;
2676 p->kind = TypeIgnore_kind;
2677 p->v.TypeIgnore.lineno = lineno;
2678 return p;
2679}
2680
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002681
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002682PyObject*
2683ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002684{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002685 mod_ty o = (mod_ty)_o;
2686 PyObject *result = NULL, *value = NULL;
2687 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002688 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002689 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002690
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002691 switch (o->kind) {
2692 case Module_kind:
2693 result = PyType_GenericNew(Module_type, NULL, NULL);
2694 if (!result) goto failed;
2695 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2696 if (!value) goto failed;
2697 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2698 goto failed;
2699 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002700 value = ast2obj_list(o->v.Module.type_ignores, ast2obj_type_ignore);
2701 if (!value) goto failed;
2702 if (_PyObject_SetAttrId(result, &PyId_type_ignores, value) == -1)
2703 goto failed;
2704 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002705 break;
2706 case Interactive_kind:
2707 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2708 if (!result) goto failed;
2709 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2710 if (!value) goto failed;
2711 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2712 goto failed;
2713 Py_DECREF(value);
2714 break;
2715 case Expression_kind:
2716 result = PyType_GenericNew(Expression_type, NULL, NULL);
2717 if (!result) goto failed;
2718 value = ast2obj_expr(o->v.Expression.body);
2719 if (!value) goto failed;
2720 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2721 goto failed;
2722 Py_DECREF(value);
2723 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002724 case FunctionType_kind:
2725 result = PyType_GenericNew(FunctionType_type, NULL, NULL);
2726 if (!result) goto failed;
2727 value = ast2obj_list(o->v.FunctionType.argtypes, ast2obj_expr);
2728 if (!value) goto failed;
2729 if (_PyObject_SetAttrId(result, &PyId_argtypes, value) == -1)
2730 goto failed;
2731 Py_DECREF(value);
2732 value = ast2obj_expr(o->v.FunctionType.returns);
2733 if (!value) goto failed;
2734 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2735 goto failed;
2736 Py_DECREF(value);
2737 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002738 case Suite_kind:
2739 result = PyType_GenericNew(Suite_type, NULL, NULL);
2740 if (!result) goto failed;
2741 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2742 if (!value) goto failed;
2743 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2744 goto failed;
2745 Py_DECREF(value);
2746 break;
2747 }
2748 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002749failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002750 Py_XDECREF(value);
2751 Py_XDECREF(result);
2752 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753}
2754
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002755PyObject*
2756ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002758 stmt_ty o = (stmt_ty)_o;
2759 PyObject *result = NULL, *value = NULL;
2760 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002761 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002762 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002763
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002764 switch (o->kind) {
2765 case FunctionDef_kind:
2766 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2767 if (!result) goto failed;
2768 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002769 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002770 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2771 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002772 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002773 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002774 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002775 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2776 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002777 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002778 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2779 if (!value) goto failed;
2780 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2781 goto failed;
2782 Py_DECREF(value);
2783 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2784 if (!value) goto failed;
2785 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2786 goto failed;
2787 Py_DECREF(value);
2788 value = ast2obj_expr(o->v.FunctionDef.returns);
2789 if (!value) goto failed;
2790 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2791 goto failed;
2792 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002793 value = ast2obj_string(o->v.FunctionDef.type_comment);
2794 if (!value) goto failed;
2795 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2796 goto failed;
2797 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002798 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002799 case AsyncFunctionDef_kind:
2800 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2801 if (!result) goto failed;
2802 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2803 if (!value) goto failed;
2804 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2805 goto failed;
2806 Py_DECREF(value);
2807 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2808 if (!value) goto failed;
2809 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2810 goto failed;
2811 Py_DECREF(value);
2812 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2813 if (!value) goto failed;
2814 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2815 goto failed;
2816 Py_DECREF(value);
2817 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2818 ast2obj_expr);
2819 if (!value) goto failed;
2820 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2821 goto failed;
2822 Py_DECREF(value);
2823 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2824 if (!value) goto failed;
2825 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2826 goto failed;
2827 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002828 value = ast2obj_string(o->v.AsyncFunctionDef.type_comment);
2829 if (!value) goto failed;
2830 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2831 goto failed;
2832 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04002833 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002834 case ClassDef_kind:
2835 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2836 if (!result) goto failed;
2837 value = ast2obj_identifier(o->v.ClassDef.name);
2838 if (!value) goto failed;
2839 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2840 goto failed;
2841 Py_DECREF(value);
2842 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2843 if (!value) goto failed;
2844 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2845 goto failed;
2846 Py_DECREF(value);
2847 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2848 if (!value) goto failed;
2849 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2850 goto failed;
2851 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002852 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2853 if (!value) goto failed;
2854 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2855 goto failed;
2856 Py_DECREF(value);
2857 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2858 if (!value) goto failed;
2859 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2860 goto failed;
2861 Py_DECREF(value);
2862 break;
2863 case Return_kind:
2864 result = PyType_GenericNew(Return_type, NULL, NULL);
2865 if (!result) goto failed;
2866 value = ast2obj_expr(o->v.Return.value);
2867 if (!value) goto failed;
2868 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2869 goto failed;
2870 Py_DECREF(value);
2871 break;
2872 case Delete_kind:
2873 result = PyType_GenericNew(Delete_type, NULL, NULL);
2874 if (!result) goto failed;
2875 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2876 if (!value) goto failed;
2877 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2878 goto failed;
2879 Py_DECREF(value);
2880 break;
2881 case Assign_kind:
2882 result = PyType_GenericNew(Assign_type, NULL, NULL);
2883 if (!result) goto failed;
2884 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2885 if (!value) goto failed;
2886 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2887 goto failed;
2888 Py_DECREF(value);
2889 value = ast2obj_expr(o->v.Assign.value);
2890 if (!value) goto failed;
2891 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2892 goto failed;
2893 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002894 value = ast2obj_string(o->v.Assign.type_comment);
2895 if (!value) goto failed;
2896 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2897 goto failed;
2898 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002899 break;
2900 case AugAssign_kind:
2901 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2902 if (!result) goto failed;
2903 value = ast2obj_expr(o->v.AugAssign.target);
2904 if (!value) goto failed;
2905 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2906 goto failed;
2907 Py_DECREF(value);
2908 value = ast2obj_operator(o->v.AugAssign.op);
2909 if (!value) goto failed;
2910 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2911 goto failed;
2912 Py_DECREF(value);
2913 value = ast2obj_expr(o->v.AugAssign.value);
2914 if (!value) goto failed;
2915 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2916 goto failed;
2917 Py_DECREF(value);
2918 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002919 case AnnAssign_kind:
2920 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2921 if (!result) goto failed;
2922 value = ast2obj_expr(o->v.AnnAssign.target);
2923 if (!value) goto failed;
2924 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2925 goto failed;
2926 Py_DECREF(value);
2927 value = ast2obj_expr(o->v.AnnAssign.annotation);
2928 if (!value) goto failed;
2929 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2930 goto failed;
2931 Py_DECREF(value);
2932 value = ast2obj_expr(o->v.AnnAssign.value);
2933 if (!value) goto failed;
2934 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2935 goto failed;
2936 Py_DECREF(value);
2937 value = ast2obj_int(o->v.AnnAssign.simple);
2938 if (!value) goto failed;
2939 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2940 goto failed;
2941 Py_DECREF(value);
2942 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002943 case For_kind:
2944 result = PyType_GenericNew(For_type, NULL, NULL);
2945 if (!result) goto failed;
2946 value = ast2obj_expr(o->v.For.target);
2947 if (!value) goto failed;
2948 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2949 goto failed;
2950 Py_DECREF(value);
2951 value = ast2obj_expr(o->v.For.iter);
2952 if (!value) goto failed;
2953 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2954 goto failed;
2955 Py_DECREF(value);
2956 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2957 if (!value) goto failed;
2958 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2959 goto failed;
2960 Py_DECREF(value);
2961 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2962 if (!value) goto failed;
2963 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2964 goto failed;
2965 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002966 value = ast2obj_string(o->v.For.type_comment);
2967 if (!value) goto failed;
2968 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2969 goto failed;
2970 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002971 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002972 case AsyncFor_kind:
2973 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2974 if (!result) goto failed;
2975 value = ast2obj_expr(o->v.AsyncFor.target);
2976 if (!value) goto failed;
2977 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2978 goto failed;
2979 Py_DECREF(value);
2980 value = ast2obj_expr(o->v.AsyncFor.iter);
2981 if (!value) goto failed;
2982 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2983 goto failed;
2984 Py_DECREF(value);
2985 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2986 if (!value) goto failed;
2987 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2988 goto failed;
2989 Py_DECREF(value);
2990 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2991 if (!value) goto failed;
2992 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2993 goto failed;
2994 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002995 value = ast2obj_string(o->v.AsyncFor.type_comment);
2996 if (!value) goto failed;
2997 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
2998 goto failed;
2999 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003000 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003001 case While_kind:
3002 result = PyType_GenericNew(While_type, NULL, NULL);
3003 if (!result) goto failed;
3004 value = ast2obj_expr(o->v.While.test);
3005 if (!value) goto failed;
3006 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3007 goto failed;
3008 Py_DECREF(value);
3009 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
3010 if (!value) goto failed;
3011 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3012 goto failed;
3013 Py_DECREF(value);
3014 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
3015 if (!value) goto failed;
3016 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3017 goto failed;
3018 Py_DECREF(value);
3019 break;
3020 case If_kind:
3021 result = PyType_GenericNew(If_type, NULL, NULL);
3022 if (!result) goto failed;
3023 value = ast2obj_expr(o->v.If.test);
3024 if (!value) goto failed;
3025 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3026 goto failed;
3027 Py_DECREF(value);
3028 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
3029 if (!value) goto failed;
3030 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3031 goto failed;
3032 Py_DECREF(value);
3033 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
3034 if (!value) goto failed;
3035 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3036 goto failed;
3037 Py_DECREF(value);
3038 break;
3039 case With_kind:
3040 result = PyType_GenericNew(With_type, NULL, NULL);
3041 if (!result) goto failed;
3042 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
3043 if (!value) goto failed;
3044 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3045 goto failed;
3046 Py_DECREF(value);
3047 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
3048 if (!value) goto failed;
3049 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3050 goto failed;
3051 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003052 value = ast2obj_string(o->v.With.type_comment);
3053 if (!value) goto failed;
3054 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3055 goto failed;
3056 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003057 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003058 case AsyncWith_kind:
3059 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
3060 if (!result) goto failed;
3061 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
3062 if (!value) goto failed;
3063 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
3064 goto failed;
3065 Py_DECREF(value);
3066 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
3067 if (!value) goto failed;
3068 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3069 goto failed;
3070 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003071 value = ast2obj_string(o->v.AsyncWith.type_comment);
3072 if (!value) goto failed;
3073 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
3074 goto failed;
3075 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003076 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003077 case Raise_kind:
3078 result = PyType_GenericNew(Raise_type, NULL, NULL);
3079 if (!result) goto failed;
3080 value = ast2obj_expr(o->v.Raise.exc);
3081 if (!value) goto failed;
3082 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
3083 goto failed;
3084 Py_DECREF(value);
3085 value = ast2obj_expr(o->v.Raise.cause);
3086 if (!value) goto failed;
3087 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
3088 goto failed;
3089 Py_DECREF(value);
3090 break;
3091 case Try_kind:
3092 result = PyType_GenericNew(Try_type, NULL, NULL);
3093 if (!result) goto failed;
3094 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
3095 if (!value) goto failed;
3096 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3097 goto failed;
3098 Py_DECREF(value);
3099 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
3100 if (!value) goto failed;
3101 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
3102 goto failed;
3103 Py_DECREF(value);
3104 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
3105 if (!value) goto failed;
3106 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3107 goto failed;
3108 Py_DECREF(value);
3109 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
3110 if (!value) goto failed;
3111 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
3112 goto failed;
3113 Py_DECREF(value);
3114 break;
3115 case Assert_kind:
3116 result = PyType_GenericNew(Assert_type, NULL, NULL);
3117 if (!result) goto failed;
3118 value = ast2obj_expr(o->v.Assert.test);
3119 if (!value) goto failed;
3120 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3121 goto failed;
3122 Py_DECREF(value);
3123 value = ast2obj_expr(o->v.Assert.msg);
3124 if (!value) goto failed;
3125 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
3126 goto failed;
3127 Py_DECREF(value);
3128 break;
3129 case Import_kind:
3130 result = PyType_GenericNew(Import_type, NULL, NULL);
3131 if (!result) goto failed;
3132 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
3133 if (!value) goto failed;
3134 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3135 goto failed;
3136 Py_DECREF(value);
3137 break;
3138 case ImportFrom_kind:
3139 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
3140 if (!result) goto failed;
3141 value = ast2obj_identifier(o->v.ImportFrom.module);
3142 if (!value) goto failed;
3143 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
3144 goto failed;
3145 Py_DECREF(value);
3146 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
3147 if (!value) goto failed;
3148 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3149 goto failed;
3150 Py_DECREF(value);
3151 value = ast2obj_int(o->v.ImportFrom.level);
3152 if (!value) goto failed;
3153 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
3154 goto failed;
3155 Py_DECREF(value);
3156 break;
3157 case Global_kind:
3158 result = PyType_GenericNew(Global_type, NULL, NULL);
3159 if (!result) goto failed;
3160 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
3161 if (!value) goto failed;
3162 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3163 goto failed;
3164 Py_DECREF(value);
3165 break;
3166 case Nonlocal_kind:
3167 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
3168 if (!result) goto failed;
3169 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
3170 if (!value) goto failed;
3171 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
3172 goto failed;
3173 Py_DECREF(value);
3174 break;
3175 case Expr_kind:
3176 result = PyType_GenericNew(Expr_type, NULL, NULL);
3177 if (!result) goto failed;
3178 value = ast2obj_expr(o->v.Expr.value);
3179 if (!value) goto failed;
3180 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3181 goto failed;
3182 Py_DECREF(value);
3183 break;
3184 case Pass_kind:
3185 result = PyType_GenericNew(Pass_type, NULL, NULL);
3186 if (!result) goto failed;
3187 break;
3188 case Break_kind:
3189 result = PyType_GenericNew(Break_type, NULL, NULL);
3190 if (!result) goto failed;
3191 break;
3192 case Continue_kind:
3193 result = PyType_GenericNew(Continue_type, NULL, NULL);
3194 if (!result) goto failed;
3195 break;
3196 }
3197 value = ast2obj_int(o->lineno);
3198 if (!value) goto failed;
3199 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3200 goto failed;
3201 Py_DECREF(value);
3202 value = ast2obj_int(o->col_offset);
3203 if (!value) goto failed;
3204 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3205 goto failed;
3206 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003207 value = ast2obj_int(o->end_lineno);
3208 if (!value) goto failed;
3209 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3210 goto failed;
3211 Py_DECREF(value);
3212 value = ast2obj_int(o->end_col_offset);
3213 if (!value) goto failed;
3214 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3215 goto failed;
3216 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003217 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003218failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003219 Py_XDECREF(value);
3220 Py_XDECREF(result);
3221 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222}
3223
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003224PyObject*
3225ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003227 expr_ty o = (expr_ty)_o;
3228 PyObject *result = NULL, *value = NULL;
3229 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003230 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003231 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003232
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003233 switch (o->kind) {
3234 case BoolOp_kind:
3235 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
3236 if (!result) goto failed;
3237 value = ast2obj_boolop(o->v.BoolOp.op);
3238 if (!value) goto failed;
3239 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3240 goto failed;
3241 Py_DECREF(value);
3242 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
3243 if (!value) goto failed;
3244 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3245 goto failed;
3246 Py_DECREF(value);
3247 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003248 case NamedExpr_kind:
3249 result = PyType_GenericNew(NamedExpr_type, NULL, NULL);
3250 if (!result) goto failed;
3251 value = ast2obj_expr(o->v.NamedExpr.target);
3252 if (!value) goto failed;
3253 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3254 goto failed;
3255 Py_DECREF(value);
3256 value = ast2obj_expr(o->v.NamedExpr.value);
3257 if (!value) goto failed;
3258 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3259 goto failed;
3260 Py_DECREF(value);
3261 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003262 case BinOp_kind:
3263 result = PyType_GenericNew(BinOp_type, NULL, NULL);
3264 if (!result) goto failed;
3265 value = ast2obj_expr(o->v.BinOp.left);
3266 if (!value) goto failed;
3267 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3268 goto failed;
3269 Py_DECREF(value);
3270 value = ast2obj_operator(o->v.BinOp.op);
3271 if (!value) goto failed;
3272 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3273 goto failed;
3274 Py_DECREF(value);
3275 value = ast2obj_expr(o->v.BinOp.right);
3276 if (!value) goto failed;
3277 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
3278 goto failed;
3279 Py_DECREF(value);
3280 break;
3281 case UnaryOp_kind:
3282 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
3283 if (!result) goto failed;
3284 value = ast2obj_unaryop(o->v.UnaryOp.op);
3285 if (!value) goto failed;
3286 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
3287 goto failed;
3288 Py_DECREF(value);
3289 value = ast2obj_expr(o->v.UnaryOp.operand);
3290 if (!value) goto failed;
3291 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
3292 goto failed;
3293 Py_DECREF(value);
3294 break;
3295 case Lambda_kind:
3296 result = PyType_GenericNew(Lambda_type, NULL, NULL);
3297 if (!result) goto failed;
3298 value = ast2obj_arguments(o->v.Lambda.args);
3299 if (!value) goto failed;
3300 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3301 goto failed;
3302 Py_DECREF(value);
3303 value = ast2obj_expr(o->v.Lambda.body);
3304 if (!value) goto failed;
3305 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3306 goto failed;
3307 Py_DECREF(value);
3308 break;
3309 case IfExp_kind:
3310 result = PyType_GenericNew(IfExp_type, NULL, NULL);
3311 if (!result) goto failed;
3312 value = ast2obj_expr(o->v.IfExp.test);
3313 if (!value) goto failed;
3314 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
3315 goto failed;
3316 Py_DECREF(value);
3317 value = ast2obj_expr(o->v.IfExp.body);
3318 if (!value) goto failed;
3319 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3320 goto failed;
3321 Py_DECREF(value);
3322 value = ast2obj_expr(o->v.IfExp.orelse);
3323 if (!value) goto failed;
3324 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
3325 goto failed;
3326 Py_DECREF(value);
3327 break;
3328 case Dict_kind:
3329 result = PyType_GenericNew(Dict_type, NULL, NULL);
3330 if (!result) goto failed;
3331 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
3332 if (!value) goto failed;
3333 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
3334 goto failed;
3335 Py_DECREF(value);
3336 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
3337 if (!value) goto failed;
3338 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3339 goto failed;
3340 Py_DECREF(value);
3341 break;
3342 case Set_kind:
3343 result = PyType_GenericNew(Set_type, NULL, NULL);
3344 if (!result) goto failed;
3345 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3346 if (!value) goto failed;
3347 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3348 goto failed;
3349 Py_DECREF(value);
3350 break;
3351 case ListComp_kind:
3352 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3353 if (!result) goto failed;
3354 value = ast2obj_expr(o->v.ListComp.elt);
3355 if (!value) goto failed;
3356 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3357 goto failed;
3358 Py_DECREF(value);
3359 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3360 if (!value) goto failed;
3361 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3362 goto failed;
3363 Py_DECREF(value);
3364 break;
3365 case SetComp_kind:
3366 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3367 if (!result) goto failed;
3368 value = ast2obj_expr(o->v.SetComp.elt);
3369 if (!value) goto failed;
3370 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3371 goto failed;
3372 Py_DECREF(value);
3373 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3374 if (!value) goto failed;
3375 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3376 goto failed;
3377 Py_DECREF(value);
3378 break;
3379 case DictComp_kind:
3380 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3381 if (!result) goto failed;
3382 value = ast2obj_expr(o->v.DictComp.key);
3383 if (!value) goto failed;
3384 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3385 goto failed;
3386 Py_DECREF(value);
3387 value = ast2obj_expr(o->v.DictComp.value);
3388 if (!value) goto failed;
3389 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3390 goto failed;
3391 Py_DECREF(value);
3392 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3393 if (!value) goto failed;
3394 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3395 goto failed;
3396 Py_DECREF(value);
3397 break;
3398 case GeneratorExp_kind:
3399 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3400 if (!result) goto failed;
3401 value = ast2obj_expr(o->v.GeneratorExp.elt);
3402 if (!value) goto failed;
3403 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3404 goto failed;
3405 Py_DECREF(value);
3406 value = ast2obj_list(o->v.GeneratorExp.generators,
3407 ast2obj_comprehension);
3408 if (!value) goto failed;
3409 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3410 goto failed;
3411 Py_DECREF(value);
3412 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003413 case Await_kind:
3414 result = PyType_GenericNew(Await_type, NULL, NULL);
3415 if (!result) goto failed;
3416 value = ast2obj_expr(o->v.Await.value);
3417 if (!value) goto failed;
3418 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3419 goto failed;
3420 Py_DECREF(value);
3421 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003422 case Yield_kind:
3423 result = PyType_GenericNew(Yield_type, NULL, NULL);
3424 if (!result) goto failed;
3425 value = ast2obj_expr(o->v.Yield.value);
3426 if (!value) goto failed;
3427 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3428 goto failed;
3429 Py_DECREF(value);
3430 break;
3431 case YieldFrom_kind:
3432 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3433 if (!result) goto failed;
3434 value = ast2obj_expr(o->v.YieldFrom.value);
3435 if (!value) goto failed;
3436 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3437 goto failed;
3438 Py_DECREF(value);
3439 break;
3440 case Compare_kind:
3441 result = PyType_GenericNew(Compare_type, NULL, NULL);
3442 if (!result) goto failed;
3443 value = ast2obj_expr(o->v.Compare.left);
3444 if (!value) goto failed;
3445 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3446 goto failed;
3447 Py_DECREF(value);
3448 {
3449 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3450 value = PyList_New(n);
3451 if (!value) goto failed;
3452 for(i = 0; i < n; i++)
3453 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003454 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003455 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003456 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3457 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003458 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003459 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003460 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003461 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3462 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003463 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003464 break;
3465 case Call_kind:
3466 result = PyType_GenericNew(Call_type, NULL, NULL);
3467 if (!result) goto failed;
3468 value = ast2obj_expr(o->v.Call.func);
3469 if (!value) goto failed;
3470 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3471 goto failed;
3472 Py_DECREF(value);
3473 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3474 if (!value) goto failed;
3475 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3476 goto failed;
3477 Py_DECREF(value);
3478 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3479 if (!value) goto failed;
3480 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3481 goto failed;
3482 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003483 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003484 case FormattedValue_kind:
3485 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3486 if (!result) goto failed;
3487 value = ast2obj_expr(o->v.FormattedValue.value);
3488 if (!value) goto failed;
3489 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3490 goto failed;
3491 Py_DECREF(value);
3492 value = ast2obj_int(o->v.FormattedValue.conversion);
3493 if (!value) goto failed;
3494 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3495 goto failed;
3496 Py_DECREF(value);
3497 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3498 if (!value) goto failed;
3499 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3500 goto failed;
3501 Py_DECREF(value);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003502 value = ast2obj_string(o->v.FormattedValue.expr_text);
3503 if (!value) goto failed;
3504 if (_PyObject_SetAttrId(result, &PyId_expr_text, value) == -1)
3505 goto failed;
3506 Py_DECREF(value);
Eric V. Smith235a6f02015-09-19 14:51:32 -04003507 break;
3508 case JoinedStr_kind:
3509 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3510 if (!result) goto failed;
3511 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3512 if (!value) goto failed;
3513 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3514 goto failed;
3515 Py_DECREF(value);
3516 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003517 case Constant_kind:
3518 result = PyType_GenericNew(Constant_type, NULL, NULL);
3519 if (!result) goto failed;
3520 value = ast2obj_constant(o->v.Constant.value);
3521 if (!value) goto failed;
3522 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3523 goto failed;
3524 Py_DECREF(value);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003525 value = ast2obj_string(o->v.Constant.kind);
3526 if (!value) goto failed;
3527 if (_PyObject_SetAttrId(result, &PyId_kind, value) == -1)
3528 goto failed;
3529 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003530 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003531 case Attribute_kind:
3532 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3533 if (!result) goto failed;
3534 value = ast2obj_expr(o->v.Attribute.value);
3535 if (!value) goto failed;
3536 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3537 goto failed;
3538 Py_DECREF(value);
3539 value = ast2obj_identifier(o->v.Attribute.attr);
3540 if (!value) goto failed;
3541 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3542 goto failed;
3543 Py_DECREF(value);
3544 value = ast2obj_expr_context(o->v.Attribute.ctx);
3545 if (!value) goto failed;
3546 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3547 goto failed;
3548 Py_DECREF(value);
3549 break;
3550 case Subscript_kind:
3551 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3552 if (!result) goto failed;
3553 value = ast2obj_expr(o->v.Subscript.value);
3554 if (!value) goto failed;
3555 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3556 goto failed;
3557 Py_DECREF(value);
3558 value = ast2obj_slice(o->v.Subscript.slice);
3559 if (!value) goto failed;
3560 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3561 goto failed;
3562 Py_DECREF(value);
3563 value = ast2obj_expr_context(o->v.Subscript.ctx);
3564 if (!value) goto failed;
3565 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3566 goto failed;
3567 Py_DECREF(value);
3568 break;
3569 case Starred_kind:
3570 result = PyType_GenericNew(Starred_type, NULL, NULL);
3571 if (!result) goto failed;
3572 value = ast2obj_expr(o->v.Starred.value);
3573 if (!value) goto failed;
3574 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3575 goto failed;
3576 Py_DECREF(value);
3577 value = ast2obj_expr_context(o->v.Starred.ctx);
3578 if (!value) goto failed;
3579 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3580 goto failed;
3581 Py_DECREF(value);
3582 break;
3583 case Name_kind:
3584 result = PyType_GenericNew(Name_type, NULL, NULL);
3585 if (!result) goto failed;
3586 value = ast2obj_identifier(o->v.Name.id);
3587 if (!value) goto failed;
3588 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3589 goto failed;
3590 Py_DECREF(value);
3591 value = ast2obj_expr_context(o->v.Name.ctx);
3592 if (!value) goto failed;
3593 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3594 goto failed;
3595 Py_DECREF(value);
3596 break;
3597 case List_kind:
3598 result = PyType_GenericNew(List_type, NULL, NULL);
3599 if (!result) goto failed;
3600 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3601 if (!value) goto failed;
3602 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3603 goto failed;
3604 Py_DECREF(value);
3605 value = ast2obj_expr_context(o->v.List.ctx);
3606 if (!value) goto failed;
3607 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3608 goto failed;
3609 Py_DECREF(value);
3610 break;
3611 case Tuple_kind:
3612 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3613 if (!result) goto failed;
3614 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3615 if (!value) goto failed;
3616 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3617 goto failed;
3618 Py_DECREF(value);
3619 value = ast2obj_expr_context(o->v.Tuple.ctx);
3620 if (!value) goto failed;
3621 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3622 goto failed;
3623 Py_DECREF(value);
3624 break;
3625 }
3626 value = ast2obj_int(o->lineno);
3627 if (!value) goto failed;
3628 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3629 goto failed;
3630 Py_DECREF(value);
3631 value = ast2obj_int(o->col_offset);
3632 if (!value) goto failed;
3633 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3634 goto failed;
3635 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003636 value = ast2obj_int(o->end_lineno);
3637 if (!value) goto failed;
3638 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3639 goto failed;
3640 Py_DECREF(value);
3641 value = ast2obj_int(o->end_col_offset);
3642 if (!value) goto failed;
3643 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3644 goto failed;
3645 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003646 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003647failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003648 Py_XDECREF(value);
3649 Py_XDECREF(result);
3650 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003651}
3652
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003653PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003655 switch(o) {
3656 case Load:
3657 Py_INCREF(Load_singleton);
3658 return Load_singleton;
3659 case Store:
3660 Py_INCREF(Store_singleton);
3661 return Store_singleton;
3662 case Del:
3663 Py_INCREF(Del_singleton);
3664 return Del_singleton;
3665 case AugLoad:
3666 Py_INCREF(AugLoad_singleton);
3667 return AugLoad_singleton;
3668 case AugStore:
3669 Py_INCREF(AugStore_singleton);
3670 return AugStore_singleton;
3671 case Param:
3672 Py_INCREF(Param_singleton);
3673 return Param_singleton;
3674 default:
3675 /* should never happen, but just in case ... */
3676 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3677 return NULL;
3678 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003679}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003680PyObject*
3681ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003683 slice_ty o = (slice_ty)_o;
3684 PyObject *result = NULL, *value = NULL;
3685 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003686 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003687 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003688
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003689 switch (o->kind) {
3690 case Slice_kind:
3691 result = PyType_GenericNew(Slice_type, NULL, NULL);
3692 if (!result) goto failed;
3693 value = ast2obj_expr(o->v.Slice.lower);
3694 if (!value) goto failed;
3695 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3696 goto failed;
3697 Py_DECREF(value);
3698 value = ast2obj_expr(o->v.Slice.upper);
3699 if (!value) goto failed;
3700 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3701 goto failed;
3702 Py_DECREF(value);
3703 value = ast2obj_expr(o->v.Slice.step);
3704 if (!value) goto failed;
3705 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3706 goto failed;
3707 Py_DECREF(value);
3708 break;
3709 case ExtSlice_kind:
3710 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3711 if (!result) goto failed;
3712 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3713 if (!value) goto failed;
3714 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3715 goto failed;
3716 Py_DECREF(value);
3717 break;
3718 case Index_kind:
3719 result = PyType_GenericNew(Index_type, NULL, NULL);
3720 if (!result) goto failed;
3721 value = ast2obj_expr(o->v.Index.value);
3722 if (!value) goto failed;
3723 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3724 goto failed;
3725 Py_DECREF(value);
3726 break;
3727 }
3728 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003729failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003730 Py_XDECREF(value);
3731 Py_XDECREF(result);
3732 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003733}
3734
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003735PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003736{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003737 switch(o) {
3738 case And:
3739 Py_INCREF(And_singleton);
3740 return And_singleton;
3741 case Or:
3742 Py_INCREF(Or_singleton);
3743 return Or_singleton;
3744 default:
3745 /* should never happen, but just in case ... */
3746 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3747 return NULL;
3748 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003749}
3750PyObject* ast2obj_operator(operator_ty o)
3751{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003752 switch(o) {
3753 case Add:
3754 Py_INCREF(Add_singleton);
3755 return Add_singleton;
3756 case Sub:
3757 Py_INCREF(Sub_singleton);
3758 return Sub_singleton;
3759 case Mult:
3760 Py_INCREF(Mult_singleton);
3761 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003762 case MatMult:
3763 Py_INCREF(MatMult_singleton);
3764 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003765 case Div:
3766 Py_INCREF(Div_singleton);
3767 return Div_singleton;
3768 case Mod:
3769 Py_INCREF(Mod_singleton);
3770 return Mod_singleton;
3771 case Pow:
3772 Py_INCREF(Pow_singleton);
3773 return Pow_singleton;
3774 case LShift:
3775 Py_INCREF(LShift_singleton);
3776 return LShift_singleton;
3777 case RShift:
3778 Py_INCREF(RShift_singleton);
3779 return RShift_singleton;
3780 case BitOr:
3781 Py_INCREF(BitOr_singleton);
3782 return BitOr_singleton;
3783 case BitXor:
3784 Py_INCREF(BitXor_singleton);
3785 return BitXor_singleton;
3786 case BitAnd:
3787 Py_INCREF(BitAnd_singleton);
3788 return BitAnd_singleton;
3789 case FloorDiv:
3790 Py_INCREF(FloorDiv_singleton);
3791 return FloorDiv_singleton;
3792 default:
3793 /* should never happen, but just in case ... */
3794 PyErr_Format(PyExc_SystemError, "unknown operator found");
3795 return NULL;
3796 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003797}
3798PyObject* ast2obj_unaryop(unaryop_ty o)
3799{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003800 switch(o) {
3801 case Invert:
3802 Py_INCREF(Invert_singleton);
3803 return Invert_singleton;
3804 case Not:
3805 Py_INCREF(Not_singleton);
3806 return Not_singleton;
3807 case UAdd:
3808 Py_INCREF(UAdd_singleton);
3809 return UAdd_singleton;
3810 case USub:
3811 Py_INCREF(USub_singleton);
3812 return USub_singleton;
3813 default:
3814 /* should never happen, but just in case ... */
3815 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3816 return NULL;
3817 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003818}
3819PyObject* ast2obj_cmpop(cmpop_ty o)
3820{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003821 switch(o) {
3822 case Eq:
3823 Py_INCREF(Eq_singleton);
3824 return Eq_singleton;
3825 case NotEq:
3826 Py_INCREF(NotEq_singleton);
3827 return NotEq_singleton;
3828 case Lt:
3829 Py_INCREF(Lt_singleton);
3830 return Lt_singleton;
3831 case LtE:
3832 Py_INCREF(LtE_singleton);
3833 return LtE_singleton;
3834 case Gt:
3835 Py_INCREF(Gt_singleton);
3836 return Gt_singleton;
3837 case GtE:
3838 Py_INCREF(GtE_singleton);
3839 return GtE_singleton;
3840 case Is:
3841 Py_INCREF(Is_singleton);
3842 return Is_singleton;
3843 case IsNot:
3844 Py_INCREF(IsNot_singleton);
3845 return IsNot_singleton;
3846 case In:
3847 Py_INCREF(In_singleton);
3848 return In_singleton;
3849 case NotIn:
3850 Py_INCREF(NotIn_singleton);
3851 return NotIn_singleton;
3852 default:
3853 /* should never happen, but just in case ... */
3854 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3855 return NULL;
3856 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003857}
3858PyObject*
3859ast2obj_comprehension(void* _o)
3860{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003861 comprehension_ty o = (comprehension_ty)_o;
3862 PyObject *result = NULL, *value = NULL;
3863 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003864 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003865 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003866
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003867 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3868 if (!result) return NULL;
3869 value = ast2obj_expr(o->target);
3870 if (!value) goto failed;
3871 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3872 goto failed;
3873 Py_DECREF(value);
3874 value = ast2obj_expr(o->iter);
3875 if (!value) goto failed;
3876 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3877 goto failed;
3878 Py_DECREF(value);
3879 value = ast2obj_list(o->ifs, ast2obj_expr);
3880 if (!value) goto failed;
3881 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3882 goto failed;
3883 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003884 value = ast2obj_int(o->is_async);
3885 if (!value) goto failed;
3886 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3887 goto failed;
3888 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003889 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003890failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003891 Py_XDECREF(value);
3892 Py_XDECREF(result);
3893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003894}
3895
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003896PyObject*
3897ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003898{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003899 excepthandler_ty o = (excepthandler_ty)_o;
3900 PyObject *result = NULL, *value = NULL;
3901 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003902 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003903 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003904
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003905 switch (o->kind) {
3906 case ExceptHandler_kind:
3907 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3908 if (!result) goto failed;
3909 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003910 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003911 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3912 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003913 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003914 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003915 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003916 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3917 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003918 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003919 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3920 if (!value) goto failed;
3921 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3922 goto failed;
3923 Py_DECREF(value);
3924 break;
3925 }
3926 value = ast2obj_int(o->lineno);
3927 if (!value) goto failed;
3928 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3929 goto failed;
3930 Py_DECREF(value);
3931 value = ast2obj_int(o->col_offset);
3932 if (!value) goto failed;
3933 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3934 goto failed;
3935 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003936 value = ast2obj_int(o->end_lineno);
3937 if (!value) goto failed;
3938 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
3939 goto failed;
3940 Py_DECREF(value);
3941 value = ast2obj_int(o->end_col_offset);
3942 if (!value) goto failed;
3943 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
3944 goto failed;
3945 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003946 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003947failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003948 Py_XDECREF(value);
3949 Py_XDECREF(result);
3950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003951}
3952
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003953PyObject*
3954ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003955{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003956 arguments_ty o = (arguments_ty)_o;
3957 PyObject *result = NULL, *value = NULL;
3958 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003959 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003960 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003961
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003962 result = PyType_GenericNew(arguments_type, NULL, NULL);
3963 if (!result) return NULL;
3964 value = ast2obj_list(o->args, ast2obj_arg);
3965 if (!value) goto failed;
3966 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3967 goto failed;
3968 Py_DECREF(value);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003969 value = ast2obj_list(o->posonlyargs, ast2obj_arg);
3970 if (!value) goto failed;
3971 if (_PyObject_SetAttrId(result, &PyId_posonlyargs, value) == -1)
3972 goto failed;
3973 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003974 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003975 if (!value) goto failed;
3976 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3977 goto failed;
3978 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003979 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3980 if (!value) goto failed;
3981 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3982 goto failed;
3983 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003984 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003985 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003986 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003987 goto failed;
3988 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003989 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003990 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003991 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003992 goto failed;
3993 Py_DECREF(value);
3994 value = ast2obj_list(o->defaults, ast2obj_expr);
3995 if (!value) goto failed;
3996 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3997 goto failed;
3998 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003999 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004000failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004001 Py_XDECREF(value);
4002 Py_XDECREF(result);
4003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004004}
4005
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004006PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00004007ast2obj_arg(void* _o)
4008{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004009 arg_ty o = (arg_ty)_o;
4010 PyObject *result = NULL, *value = NULL;
4011 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004012 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004013 }
Neal Norwitzc1505362006-12-28 06:47:50 +00004014
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004015 result = PyType_GenericNew(arg_type, NULL, NULL);
4016 if (!result) return NULL;
4017 value = ast2obj_identifier(o->arg);
4018 if (!value) goto failed;
4019 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4020 goto failed;
4021 Py_DECREF(value);
4022 value = ast2obj_expr(o->annotation);
4023 if (!value) goto failed;
4024 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
4025 goto failed;
4026 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004027 value = ast2obj_string(o->type_comment);
4028 if (!value) goto failed;
4029 if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1)
4030 goto failed;
4031 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004032 value = ast2obj_int(o->lineno);
4033 if (!value) goto failed;
4034 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
4035 goto failed;
4036 Py_DECREF(value);
4037 value = ast2obj_int(o->col_offset);
4038 if (!value) goto failed;
4039 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
4040 goto failed;
4041 Py_DECREF(value);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004042 value = ast2obj_int(o->end_lineno);
4043 if (!value) goto failed;
4044 if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0)
4045 goto failed;
4046 Py_DECREF(value);
4047 value = ast2obj_int(o->end_col_offset);
4048 if (!value) goto failed;
4049 if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0)
4050 goto failed;
4051 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004052 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004053failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004054 Py_XDECREF(value);
4055 Py_XDECREF(result);
4056 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004057}
4058
4059PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004060ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004061{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004062 keyword_ty o = (keyword_ty)_o;
4063 PyObject *result = NULL, *value = NULL;
4064 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004065 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004066 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004067
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004068 result = PyType_GenericNew(keyword_type, NULL, NULL);
4069 if (!result) return NULL;
4070 value = ast2obj_identifier(o->arg);
4071 if (!value) goto failed;
4072 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
4073 goto failed;
4074 Py_DECREF(value);
4075 value = ast2obj_expr(o->value);
4076 if (!value) goto failed;
4077 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
4078 goto failed;
4079 Py_DECREF(value);
4080 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004081failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 Py_XDECREF(value);
4083 Py_XDECREF(result);
4084 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004085}
4086
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004087PyObject*
4088ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004089{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004090 alias_ty o = (alias_ty)_o;
4091 PyObject *result = NULL, *value = NULL;
4092 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004093 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004094 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004095
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004096 result = PyType_GenericNew(alias_type, NULL, NULL);
4097 if (!result) return NULL;
4098 value = ast2obj_identifier(o->name);
4099 if (!value) goto failed;
4100 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
4101 goto failed;
4102 Py_DECREF(value);
4103 value = ast2obj_identifier(o->asname);
4104 if (!value) goto failed;
4105 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
4106 goto failed;
4107 Py_DECREF(value);
4108 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004109failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004110 Py_XDECREF(value);
4111 Py_XDECREF(result);
4112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004113}
4114
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004115PyObject*
4116ast2obj_withitem(void* _o)
4117{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004118 withitem_ty o = (withitem_ty)_o;
4119 PyObject *result = NULL, *value = NULL;
4120 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004121 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004122 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004123
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004124 result = PyType_GenericNew(withitem_type, NULL, NULL);
4125 if (!result) return NULL;
4126 value = ast2obj_expr(o->context_expr);
4127 if (!value) goto failed;
4128 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
4129 goto failed;
4130 Py_DECREF(value);
4131 value = ast2obj_expr(o->optional_vars);
4132 if (!value) goto failed;
4133 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
4134 goto failed;
4135 Py_DECREF(value);
4136 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004137failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004138 Py_XDECREF(value);
4139 Py_XDECREF(result);
4140 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004141}
4142
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004143PyObject*
4144ast2obj_type_ignore(void* _o)
4145{
4146 type_ignore_ty o = (type_ignore_ty)_o;
4147 PyObject *result = NULL, *value = NULL;
4148 if (!o) {
4149 Py_RETURN_NONE;
4150 }
4151
4152 switch (o->kind) {
4153 case TypeIgnore_kind:
4154 result = PyType_GenericNew(TypeIgnore_type, NULL, NULL);
4155 if (!result) goto failed;
4156 value = ast2obj_int(o->v.TypeIgnore.lineno);
4157 if (!value) goto failed;
4158 if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1)
4159 goto failed;
4160 Py_DECREF(value);
4161 break;
4162 }
4163 return result;
4164failed:
4165 Py_XDECREF(value);
4166 Py_XDECREF(result);
4167 return NULL;
4168}
4169
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004170
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004171int
4172obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
4173{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004174 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004175
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004176 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004177
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004178 if (obj == Py_None) {
4179 *out = NULL;
4180 return 0;
4181 }
4182 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
4183 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004184 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004185 }
4186 if (isinstance) {
4187 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004188 asdl_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004189
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004190 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4191 return 1;
4192 }
4193 if (tmp == NULL) {
4194 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4195 return 1;
4196 }
4197 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004198 int res;
4199 Py_ssize_t len;
4200 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004201 if (!PyList_Check(tmp)) {
4202 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4203 goto failed;
4204 }
4205 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004206 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004207 if (body == NULL) goto failed;
4208 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004209 stmt_ty val;
4210 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004211 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004212 if (len != PyList_GET_SIZE(tmp)) {
4213 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
4214 goto failed;
4215 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004216 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004217 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004218 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004219 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004220 if (_PyObject_LookupAttrId(obj, &PyId_type_ignores, &tmp) < 0) {
4221 return 1;
4222 }
4223 if (tmp == NULL) {
4224 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
4225 return 1;
4226 }
4227 else {
4228 int res;
4229 Py_ssize_t len;
4230 Py_ssize_t i;
4231 if (!PyList_Check(tmp)) {
4232 PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4233 goto failed;
4234 }
4235 len = PyList_GET_SIZE(tmp);
4236 type_ignores = _Py_asdl_seq_new(len, arena);
4237 if (type_ignores == NULL) goto failed;
4238 for (i = 0; i < len; i++) {
4239 type_ignore_ty val;
4240 res = obj2ast_type_ignore(PyList_GET_ITEM(tmp, i), &val, arena);
4241 if (res != 0) goto failed;
4242 if (len != PyList_GET_SIZE(tmp)) {
4243 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
4244 goto failed;
4245 }
4246 asdl_seq_SET(type_ignores, i, val);
4247 }
4248 Py_CLEAR(tmp);
4249 }
4250 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004251 if (*out == NULL) goto failed;
4252 return 0;
4253 }
4254 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
4255 if (isinstance == -1) {
4256 return 1;
4257 }
4258 if (isinstance) {
4259 asdl_seq* body;
4260
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004261 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4262 return 1;
4263 }
4264 if (tmp == NULL) {
4265 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
4266 return 1;
4267 }
4268 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004269 int res;
4270 Py_ssize_t len;
4271 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004272 if (!PyList_Check(tmp)) {
4273 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4274 goto failed;
4275 }
4276 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004277 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004278 if (body == NULL) goto failed;
4279 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004280 stmt_ty val;
4281 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004282 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004283 if (len != PyList_GET_SIZE(tmp)) {
4284 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
4285 goto failed;
4286 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004287 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004288 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004289 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004290 }
4291 *out = Interactive(body, arena);
4292 if (*out == NULL) goto failed;
4293 return 0;
4294 }
4295 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
4296 if (isinstance == -1) {
4297 return 1;
4298 }
4299 if (isinstance) {
4300 expr_ty body;
4301
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004302 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4303 return 1;
4304 }
4305 if (tmp == NULL) {
4306 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
4307 return 1;
4308 }
4309 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004310 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004311 res = obj2ast_expr(tmp, &body, arena);
4312 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004313 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004314 }
4315 *out = Expression(body, arena);
4316 if (*out == NULL) goto failed;
4317 return 0;
4318 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004319 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionType_type);
4320 if (isinstance == -1) {
4321 return 1;
4322 }
4323 if (isinstance) {
4324 asdl_seq* argtypes;
4325 expr_ty returns;
4326
4327 if (_PyObject_LookupAttrId(obj, &PyId_argtypes, &tmp) < 0) {
4328 return 1;
4329 }
4330 if (tmp == NULL) {
4331 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
4332 return 1;
4333 }
4334 else {
4335 int res;
4336 Py_ssize_t len;
4337 Py_ssize_t i;
4338 if (!PyList_Check(tmp)) {
4339 PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4340 goto failed;
4341 }
4342 len = PyList_GET_SIZE(tmp);
4343 argtypes = _Py_asdl_seq_new(len, arena);
4344 if (argtypes == NULL) goto failed;
4345 for (i = 0; i < len; i++) {
4346 expr_ty val;
4347 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
4348 if (res != 0) goto failed;
4349 if (len != PyList_GET_SIZE(tmp)) {
4350 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
4351 goto failed;
4352 }
4353 asdl_seq_SET(argtypes, i, val);
4354 }
4355 Py_CLEAR(tmp);
4356 }
4357 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
4358 return 1;
4359 }
4360 if (tmp == NULL) {
4361 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
4362 return 1;
4363 }
4364 else {
4365 int res;
4366 res = obj2ast_expr(tmp, &returns, arena);
4367 if (res != 0) goto failed;
4368 Py_CLEAR(tmp);
4369 }
4370 *out = FunctionType(argtypes, returns, arena);
4371 if (*out == NULL) goto failed;
4372 return 0;
4373 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004374 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
4375 if (isinstance == -1) {
4376 return 1;
4377 }
4378 if (isinstance) {
4379 asdl_seq* body;
4380
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004381 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
4382 return 1;
4383 }
4384 if (tmp == NULL) {
4385 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
4386 return 1;
4387 }
4388 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004389 int res;
4390 Py_ssize_t len;
4391 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004392 if (!PyList_Check(tmp)) {
4393 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4394 goto failed;
4395 }
4396 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004397 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004398 if (body == NULL) goto failed;
4399 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004400 stmt_ty val;
4401 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004402 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004403 if (len != PyList_GET_SIZE(tmp)) {
4404 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
4405 goto failed;
4406 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004407 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004408 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004409 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004410 }
4411 *out = Suite(body, arena);
4412 if (*out == NULL) goto failed;
4413 return 0;
4414 }
4415
4416 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
4417 failed:
4418 Py_XDECREF(tmp);
4419 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004420}
4421
4422int
4423obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
4424{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004425 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004426
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004427 PyObject *tmp = NULL;
4428 int lineno;
4429 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004430 int end_lineno;
4431 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004432
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004433 if (obj == Py_None) {
4434 *out = NULL;
4435 return 0;
4436 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004437 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
4438 return 1;
4439 }
4440 if (tmp == NULL) {
4441 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
4442 return 1;
4443 }
4444 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004445 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004446 res = obj2ast_int(tmp, &lineno, arena);
4447 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004448 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004449 }
4450 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004451 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004452 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004453 if (tmp == NULL) {
4454 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
4455 return 1;
4456 }
4457 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004458 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004459 res = obj2ast_int(tmp, &col_offset, arena);
4460 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004461 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004462 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004463 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
4464 return 1;
4465 }
4466 if (tmp == NULL || tmp == Py_None) {
4467 Py_CLEAR(tmp);
4468 end_lineno = 0;
4469 }
4470 else {
4471 int res;
4472 res = obj2ast_int(tmp, &end_lineno, arena);
4473 if (res != 0) goto failed;
4474 Py_CLEAR(tmp);
4475 }
4476 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
4477 return 1;
4478 }
4479 if (tmp == NULL || tmp == Py_None) {
4480 Py_CLEAR(tmp);
4481 end_col_offset = 0;
4482 }
4483 else {
4484 int res;
4485 res = obj2ast_int(tmp, &end_col_offset, arena);
4486 if (res != 0) goto failed;
4487 Py_CLEAR(tmp);
4488 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004489 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
4490 if (isinstance == -1) {
4491 return 1;
4492 }
4493 if (isinstance) {
4494 identifier name;
4495 arguments_ty args;
4496 asdl_seq* body;
4497 asdl_seq* decorator_list;
4498 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004499 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004500
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004501 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4502 return 1;
4503 }
4504 if (tmp == NULL) {
4505 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
4506 return 1;
4507 }
4508 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004509 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004510 res = obj2ast_identifier(tmp, &name, arena);
4511 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004512 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004513 }
4514 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004515 return 1;
4516 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004517 if (tmp == NULL) {
4518 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
4519 return 1;
4520 }
4521 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004522 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004523 res = obj2ast_arguments(tmp, &args, arena);
4524 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004525 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004526 }
4527 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004528 return 1;
4529 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004530 if (tmp == NULL) {
4531 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
4532 return 1;
4533 }
4534 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004535 int res;
4536 Py_ssize_t len;
4537 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004538 if (!PyList_Check(tmp)) {
4539 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4540 goto failed;
4541 }
4542 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004543 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004544 if (body == NULL) goto failed;
4545 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004546 stmt_ty val;
4547 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004548 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004549 if (len != PyList_GET_SIZE(tmp)) {
4550 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4551 goto failed;
4552 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004553 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004554 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004555 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004556 }
4557 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004558 return 1;
4559 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004560 if (tmp == NULL) {
4561 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4562 return 1;
4563 }
4564 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004565 int res;
4566 Py_ssize_t len;
4567 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004568 if (!PyList_Check(tmp)) {
4569 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4570 goto failed;
4571 }
4572 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004573 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004574 if (decorator_list == NULL) goto failed;
4575 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004576 expr_ty val;
4577 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004578 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004579 if (len != PyList_GET_SIZE(tmp)) {
4580 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4581 goto failed;
4582 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004583 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004584 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004585 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004586 }
4587 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004588 return 1;
4589 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004590 if (tmp == NULL || tmp == Py_None) {
4591 Py_CLEAR(tmp);
4592 returns = NULL;
4593 }
4594 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004595 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004596 res = obj2ast_expr(tmp, &returns, arena);
4597 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004598 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004599 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004600 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4601 return 1;
4602 }
4603 if (tmp == NULL || tmp == Py_None) {
4604 Py_CLEAR(tmp);
4605 type_comment = NULL;
4606 }
4607 else {
4608 int res;
4609 res = obj2ast_string(tmp, &type_comment, arena);
4610 if (res != 0) goto failed;
4611 Py_CLEAR(tmp);
4612 }
4613 *out = FunctionDef(name, args, body, decorator_list, returns,
4614 type_comment, lineno, col_offset, end_lineno,
4615 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004616 if (*out == NULL) goto failed;
4617 return 0;
4618 }
Yury Selivanov75445082015-05-11 22:57:16 -04004619 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4620 if (isinstance == -1) {
4621 return 1;
4622 }
4623 if (isinstance) {
4624 identifier name;
4625 arguments_ty args;
4626 asdl_seq* body;
4627 asdl_seq* decorator_list;
4628 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004629 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04004630
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004631 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4632 return 1;
4633 }
4634 if (tmp == NULL) {
4635 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4636 return 1;
4637 }
4638 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004639 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004640 res = obj2ast_identifier(tmp, &name, arena);
4641 if (res != 0) goto failed;
4642 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004643 }
4644 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004645 return 1;
4646 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004647 if (tmp == NULL) {
4648 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4649 return 1;
4650 }
4651 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004652 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004653 res = obj2ast_arguments(tmp, &args, arena);
4654 if (res != 0) goto failed;
4655 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004656 }
4657 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004658 return 1;
4659 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004660 if (tmp == NULL) {
4661 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4662 return 1;
4663 }
4664 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004665 int res;
4666 Py_ssize_t len;
4667 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004668 if (!PyList_Check(tmp)) {
4669 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4670 goto failed;
4671 }
4672 len = PyList_GET_SIZE(tmp);
4673 body = _Py_asdl_seq_new(len, arena);
4674 if (body == NULL) goto failed;
4675 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004676 stmt_ty val;
4677 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004678 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004679 if (len != PyList_GET_SIZE(tmp)) {
4680 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4681 goto failed;
4682 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004683 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004684 }
4685 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004686 }
4687 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004688 return 1;
4689 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004690 if (tmp == NULL) {
4691 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4692 return 1;
4693 }
4694 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004695 int res;
4696 Py_ssize_t len;
4697 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004698 if (!PyList_Check(tmp)) {
4699 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4700 goto failed;
4701 }
4702 len = PyList_GET_SIZE(tmp);
4703 decorator_list = _Py_asdl_seq_new(len, arena);
4704 if (decorator_list == NULL) goto failed;
4705 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004706 expr_ty val;
4707 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004708 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004709 if (len != PyList_GET_SIZE(tmp)) {
4710 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4711 goto failed;
4712 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004713 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004714 }
4715 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004716 }
4717 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004718 return 1;
4719 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004720 if (tmp == NULL || tmp == Py_None) {
4721 Py_CLEAR(tmp);
4722 returns = NULL;
4723 }
4724 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004725 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004726 res = obj2ast_expr(tmp, &returns, arena);
4727 if (res != 0) goto failed;
4728 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004729 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004730 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
4731 return 1;
4732 }
4733 if (tmp == NULL || tmp == Py_None) {
4734 Py_CLEAR(tmp);
4735 type_comment = NULL;
4736 }
4737 else {
4738 int res;
4739 res = obj2ast_string(tmp, &type_comment, arena);
4740 if (res != 0) goto failed;
4741 Py_CLEAR(tmp);
4742 }
Yury Selivanov75445082015-05-11 22:57:16 -04004743 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004744 type_comment, lineno, col_offset, end_lineno,
4745 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004746 if (*out == NULL) goto failed;
4747 return 0;
4748 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004749 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4750 if (isinstance == -1) {
4751 return 1;
4752 }
4753 if (isinstance) {
4754 identifier name;
4755 asdl_seq* bases;
4756 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004757 asdl_seq* body;
4758 asdl_seq* decorator_list;
4759
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004760 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4761 return 1;
4762 }
4763 if (tmp == NULL) {
4764 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4765 return 1;
4766 }
4767 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004768 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004769 res = obj2ast_identifier(tmp, &name, arena);
4770 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004771 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004772 }
4773 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004774 return 1;
4775 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004776 if (tmp == NULL) {
4777 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4778 return 1;
4779 }
4780 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004781 int res;
4782 Py_ssize_t len;
4783 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004784 if (!PyList_Check(tmp)) {
4785 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4786 goto failed;
4787 }
4788 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004789 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004790 if (bases == NULL) goto failed;
4791 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004792 expr_ty val;
4793 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004794 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004795 if (len != PyList_GET_SIZE(tmp)) {
4796 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4797 goto failed;
4798 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004799 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004800 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004801 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004802 }
4803 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004804 return 1;
4805 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004806 if (tmp == NULL) {
4807 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4808 return 1;
4809 }
4810 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004811 int res;
4812 Py_ssize_t len;
4813 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004814 if (!PyList_Check(tmp)) {
4815 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4816 goto failed;
4817 }
4818 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004819 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004820 if (keywords == NULL) goto failed;
4821 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004822 keyword_ty val;
4823 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004824 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004825 if (len != PyList_GET_SIZE(tmp)) {
4826 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4827 goto failed;
4828 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004829 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004830 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004831 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004832 }
4833 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004834 return 1;
4835 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004836 if (tmp == NULL) {
4837 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4838 return 1;
4839 }
4840 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004841 int res;
4842 Py_ssize_t len;
4843 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004844 if (!PyList_Check(tmp)) {
4845 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4846 goto failed;
4847 }
4848 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004849 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004850 if (body == NULL) goto failed;
4851 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004852 stmt_ty val;
4853 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004854 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004855 if (len != PyList_GET_SIZE(tmp)) {
4856 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4857 goto failed;
4858 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004859 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004860 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004861 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004862 }
4863 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004864 return 1;
4865 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004866 if (tmp == NULL) {
4867 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4868 return 1;
4869 }
4870 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004871 int res;
4872 Py_ssize_t len;
4873 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004874 if (!PyList_Check(tmp)) {
4875 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4876 goto failed;
4877 }
4878 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004879 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004880 if (decorator_list == NULL) goto failed;
4881 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004882 expr_ty val;
4883 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004884 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004885 if (len != PyList_GET_SIZE(tmp)) {
4886 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4887 goto failed;
4888 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004889 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004890 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004891 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004892 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004893 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004894 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004895 if (*out == NULL) goto failed;
4896 return 0;
4897 }
4898 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4899 if (isinstance == -1) {
4900 return 1;
4901 }
4902 if (isinstance) {
4903 expr_ty value;
4904
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004905 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4906 return 1;
4907 }
4908 if (tmp == NULL || tmp == Py_None) {
4909 Py_CLEAR(tmp);
4910 value = NULL;
4911 }
4912 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004913 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004914 res = obj2ast_expr(tmp, &value, arena);
4915 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004916 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004917 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004918 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
4919 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004920 if (*out == NULL) goto failed;
4921 return 0;
4922 }
4923 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4924 if (isinstance == -1) {
4925 return 1;
4926 }
4927 if (isinstance) {
4928 asdl_seq* targets;
4929
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004930 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4931 return 1;
4932 }
4933 if (tmp == NULL) {
4934 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4935 return 1;
4936 }
4937 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004938 int res;
4939 Py_ssize_t len;
4940 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004941 if (!PyList_Check(tmp)) {
4942 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4943 goto failed;
4944 }
4945 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004946 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004947 if (targets == NULL) goto failed;
4948 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004949 expr_ty val;
4950 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004951 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004952 if (len != PyList_GET_SIZE(tmp)) {
4953 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4954 goto failed;
4955 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004956 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004957 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004958 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004959 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004960 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
4961 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004962 if (*out == NULL) goto failed;
4963 return 0;
4964 }
4965 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4966 if (isinstance == -1) {
4967 return 1;
4968 }
4969 if (isinstance) {
4970 asdl_seq* targets;
4971 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004972 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004973
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004974 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4975 return 1;
4976 }
4977 if (tmp == NULL) {
4978 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4979 return 1;
4980 }
4981 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004982 int res;
4983 Py_ssize_t len;
4984 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004985 if (!PyList_Check(tmp)) {
4986 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4987 goto failed;
4988 }
4989 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004990 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004991 if (targets == NULL) goto failed;
4992 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004993 expr_ty val;
4994 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004995 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004996 if (len != PyList_GET_SIZE(tmp)) {
4997 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4998 goto failed;
4999 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005000 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005001 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005002 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005003 }
5004 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005005 return 1;
5006 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005007 if (tmp == NULL) {
5008 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
5009 return 1;
5010 }
5011 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005012 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005013 res = obj2ast_expr(tmp, &value, arena);
5014 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005015 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005016 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005017 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5018 return 1;
5019 }
5020 if (tmp == NULL || tmp == Py_None) {
5021 Py_CLEAR(tmp);
5022 type_comment = NULL;
5023 }
5024 else {
5025 int res;
5026 res = obj2ast_string(tmp, &type_comment, arena);
5027 if (res != 0) goto failed;
5028 Py_CLEAR(tmp);
5029 }
5030 *out = Assign(targets, value, type_comment, lineno, col_offset,
5031 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005032 if (*out == NULL) goto failed;
5033 return 0;
5034 }
5035 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
5036 if (isinstance == -1) {
5037 return 1;
5038 }
5039 if (isinstance) {
5040 expr_ty target;
5041 operator_ty op;
5042 expr_ty value;
5043
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005044 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5045 return 1;
5046 }
5047 if (tmp == NULL) {
5048 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
5049 return 1;
5050 }
5051 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005052 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005053 res = obj2ast_expr(tmp, &target, arena);
5054 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005055 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005056 }
5057 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005058 return 1;
5059 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005060 if (tmp == NULL) {
5061 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
5062 return 1;
5063 }
5064 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005065 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005066 res = obj2ast_operator(tmp, &op, arena);
5067 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005068 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005069 }
5070 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005071 return 1;
5072 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005073 if (tmp == NULL) {
5074 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
5075 return 1;
5076 }
5077 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005078 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005079 res = obj2ast_expr(tmp, &value, arena);
5080 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005081 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005082 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005083 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
5084 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005085 if (*out == NULL) goto failed;
5086 return 0;
5087 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005088 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
5089 if (isinstance == -1) {
5090 return 1;
5091 }
5092 if (isinstance) {
5093 expr_ty target;
5094 expr_ty annotation;
5095 expr_ty value;
5096 int simple;
5097
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005098 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5099 return 1;
5100 }
5101 if (tmp == NULL) {
5102 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
5103 return 1;
5104 }
5105 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005106 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005107 res = obj2ast_expr(tmp, &target, arena);
5108 if (res != 0) goto failed;
5109 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005110 }
5111 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005112 return 1;
5113 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005114 if (tmp == NULL) {
5115 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
5116 return 1;
5117 }
5118 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005119 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005120 res = obj2ast_expr(tmp, &annotation, arena);
5121 if (res != 0) goto failed;
5122 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005123 }
5124 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005125 return 1;
5126 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005127 if (tmp == NULL || tmp == Py_None) {
5128 Py_CLEAR(tmp);
5129 value = NULL;
5130 }
5131 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005132 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005133 res = obj2ast_expr(tmp, &value, arena);
5134 if (res != 0) goto failed;
5135 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005136 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005137 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
5138 return 1;
5139 }
5140 if (tmp == NULL) {
5141 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
5142 return 1;
5143 }
5144 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005145 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005146 res = obj2ast_int(tmp, &simple, arena);
5147 if (res != 0) goto failed;
5148 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005149 }
5150 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005151 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005152 if (*out == NULL) goto failed;
5153 return 0;
5154 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005155 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
5156 if (isinstance == -1) {
5157 return 1;
5158 }
5159 if (isinstance) {
5160 expr_ty target;
5161 expr_ty iter;
5162 asdl_seq* body;
5163 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005164 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005165
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005166 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5167 return 1;
5168 }
5169 if (tmp == NULL) {
5170 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
5171 return 1;
5172 }
5173 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005174 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005175 res = obj2ast_expr(tmp, &target, arena);
5176 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005177 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005178 }
5179 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005180 return 1;
5181 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005182 if (tmp == NULL) {
5183 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
5184 return 1;
5185 }
5186 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005187 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005188 res = obj2ast_expr(tmp, &iter, arena);
5189 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005190 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005191 }
5192 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005193 return 1;
5194 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005195 if (tmp == NULL) {
5196 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
5197 return 1;
5198 }
5199 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005200 int res;
5201 Py_ssize_t len;
5202 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005203 if (!PyList_Check(tmp)) {
5204 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5205 goto failed;
5206 }
5207 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005208 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005209 if (body == NULL) goto failed;
5210 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005211 stmt_ty val;
5212 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005213 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005214 if (len != PyList_GET_SIZE(tmp)) {
5215 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
5216 goto failed;
5217 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005218 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005219 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005220 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005221 }
5222 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005223 return 1;
5224 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005225 if (tmp == NULL) {
5226 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
5227 return 1;
5228 }
5229 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005230 int res;
5231 Py_ssize_t len;
5232 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005233 if (!PyList_Check(tmp)) {
5234 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5235 goto failed;
5236 }
5237 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005238 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005239 if (orelse == NULL) goto failed;
5240 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005241 stmt_ty val;
5242 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005243 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005244 if (len != PyList_GET_SIZE(tmp)) {
5245 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
5246 goto failed;
5247 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005248 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005249 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005250 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005251 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005252 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5253 return 1;
5254 }
5255 if (tmp == NULL || tmp == Py_None) {
5256 Py_CLEAR(tmp);
5257 type_comment = NULL;
5258 }
5259 else {
5260 int res;
5261 res = obj2ast_string(tmp, &type_comment, arena);
5262 if (res != 0) goto failed;
5263 Py_CLEAR(tmp);
5264 }
5265 *out = For(target, iter, body, orelse, type_comment, lineno,
5266 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005267 if (*out == NULL) goto failed;
5268 return 0;
5269 }
Yury Selivanov75445082015-05-11 22:57:16 -04005270 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
5271 if (isinstance == -1) {
5272 return 1;
5273 }
5274 if (isinstance) {
5275 expr_ty target;
5276 expr_ty iter;
5277 asdl_seq* body;
5278 asdl_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005279 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005280
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005281 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
5282 return 1;
5283 }
5284 if (tmp == NULL) {
5285 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
5286 return 1;
5287 }
5288 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005289 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04005290 res = obj2ast_expr(tmp, &target, arena);
5291 if (res != 0) goto failed;
5292 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005293 }
5294 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005295 return 1;
5296 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005297 if (tmp == NULL) {
5298 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
5299 return 1;
5300 }
5301 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005302 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04005303 res = obj2ast_expr(tmp, &iter, arena);
5304 if (res != 0) goto failed;
5305 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005306 }
5307 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005308 return 1;
5309 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005310 if (tmp == NULL) {
5311 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
5312 return 1;
5313 }
5314 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005315 int res;
5316 Py_ssize_t len;
5317 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005318 if (!PyList_Check(tmp)) {
5319 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5320 goto failed;
5321 }
5322 len = PyList_GET_SIZE(tmp);
5323 body = _Py_asdl_seq_new(len, arena);
5324 if (body == NULL) goto failed;
5325 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005326 stmt_ty val;
5327 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005328 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005329 if (len != PyList_GET_SIZE(tmp)) {
5330 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
5331 goto failed;
5332 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005333 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005334 }
5335 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005336 }
5337 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005338 return 1;
5339 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005340 if (tmp == NULL) {
5341 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
5342 return 1;
5343 }
5344 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005345 int res;
5346 Py_ssize_t len;
5347 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005348 if (!PyList_Check(tmp)) {
5349 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5350 goto failed;
5351 }
5352 len = PyList_GET_SIZE(tmp);
5353 orelse = _Py_asdl_seq_new(len, arena);
5354 if (orelse == NULL) goto failed;
5355 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005356 stmt_ty val;
5357 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005358 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005359 if (len != PyList_GET_SIZE(tmp)) {
5360 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
5361 goto failed;
5362 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005363 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005364 }
5365 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005366 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005367 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5368 return 1;
5369 }
5370 if (tmp == NULL || tmp == Py_None) {
5371 Py_CLEAR(tmp);
5372 type_comment = NULL;
5373 }
5374 else {
5375 int res;
5376 res = obj2ast_string(tmp, &type_comment, arena);
5377 if (res != 0) goto failed;
5378 Py_CLEAR(tmp);
5379 }
5380 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
5381 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005382 if (*out == NULL) goto failed;
5383 return 0;
5384 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005385 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
5386 if (isinstance == -1) {
5387 return 1;
5388 }
5389 if (isinstance) {
5390 expr_ty test;
5391 asdl_seq* body;
5392 asdl_seq* orelse;
5393
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005394 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5395 return 1;
5396 }
5397 if (tmp == NULL) {
5398 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
5399 return 1;
5400 }
5401 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005402 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005403 res = obj2ast_expr(tmp, &test, arena);
5404 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005405 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005406 }
5407 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005408 return 1;
5409 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005410 if (tmp == NULL) {
5411 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
5412 return 1;
5413 }
5414 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005415 int res;
5416 Py_ssize_t len;
5417 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005418 if (!PyList_Check(tmp)) {
5419 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5420 goto failed;
5421 }
5422 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005423 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005424 if (body == NULL) goto failed;
5425 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005426 stmt_ty val;
5427 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005428 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005429 if (len != PyList_GET_SIZE(tmp)) {
5430 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
5431 goto failed;
5432 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005433 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005434 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005435 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005436 }
5437 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005438 return 1;
5439 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005440 if (tmp == NULL) {
5441 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
5442 return 1;
5443 }
5444 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005445 int res;
5446 Py_ssize_t len;
5447 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005448 if (!PyList_Check(tmp)) {
5449 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5450 goto failed;
5451 }
5452 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005453 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005454 if (orelse == NULL) goto failed;
5455 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005456 stmt_ty val;
5457 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005458 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005459 if (len != PyList_GET_SIZE(tmp)) {
5460 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
5461 goto failed;
5462 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005463 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005464 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005465 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005466 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005467 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
5468 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005469 if (*out == NULL) goto failed;
5470 return 0;
5471 }
5472 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
5473 if (isinstance == -1) {
5474 return 1;
5475 }
5476 if (isinstance) {
5477 expr_ty test;
5478 asdl_seq* body;
5479 asdl_seq* orelse;
5480
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005481 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5482 return 1;
5483 }
5484 if (tmp == NULL) {
5485 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
5486 return 1;
5487 }
5488 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005489 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005490 res = obj2ast_expr(tmp, &test, arena);
5491 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005492 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005493 }
5494 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005495 return 1;
5496 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005497 if (tmp == NULL) {
5498 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
5499 return 1;
5500 }
5501 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005502 int res;
5503 Py_ssize_t len;
5504 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005505 if (!PyList_Check(tmp)) {
5506 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5507 goto failed;
5508 }
5509 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005510 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005511 if (body == NULL) goto failed;
5512 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005513 stmt_ty val;
5514 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005515 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005516 if (len != PyList_GET_SIZE(tmp)) {
5517 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
5518 goto failed;
5519 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005520 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005521 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005522 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005523 }
5524 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005525 return 1;
5526 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005527 if (tmp == NULL) {
5528 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
5529 return 1;
5530 }
5531 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005532 int res;
5533 Py_ssize_t len;
5534 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005535 if (!PyList_Check(tmp)) {
5536 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5537 goto failed;
5538 }
5539 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005540 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005541 if (orelse == NULL) goto failed;
5542 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005543 stmt_ty val;
5544 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005545 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005546 if (len != PyList_GET_SIZE(tmp)) {
5547 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
5548 goto failed;
5549 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005550 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005551 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005552 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005553 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005554 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
5555 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005556 if (*out == NULL) goto failed;
5557 return 0;
5558 }
5559 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
5560 if (isinstance == -1) {
5561 return 1;
5562 }
5563 if (isinstance) {
5564 asdl_seq* items;
5565 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005566 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005567
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005568 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5569 return 1;
5570 }
5571 if (tmp == NULL) {
5572 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
5573 return 1;
5574 }
5575 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005576 int res;
5577 Py_ssize_t len;
5578 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005579 if (!PyList_Check(tmp)) {
5580 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5581 goto failed;
5582 }
5583 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005584 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005585 if (items == NULL) goto failed;
5586 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005587 withitem_ty val;
5588 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005589 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005590 if (len != PyList_GET_SIZE(tmp)) {
5591 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
5592 goto failed;
5593 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005594 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005595 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005596 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005597 }
5598 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005599 return 1;
5600 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005601 if (tmp == NULL) {
5602 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
5603 return 1;
5604 }
5605 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005606 int res;
5607 Py_ssize_t len;
5608 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005609 if (!PyList_Check(tmp)) {
5610 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5611 goto failed;
5612 }
5613 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005614 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005615 if (body == NULL) goto failed;
5616 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005617 stmt_ty val;
5618 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005619 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005620 if (len != PyList_GET_SIZE(tmp)) {
5621 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5622 goto failed;
5623 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005624 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005625 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005626 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005627 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005628 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5629 return 1;
5630 }
5631 if (tmp == NULL || tmp == Py_None) {
5632 Py_CLEAR(tmp);
5633 type_comment = NULL;
5634 }
5635 else {
5636 int res;
5637 res = obj2ast_string(tmp, &type_comment, arena);
5638 if (res != 0) goto failed;
5639 Py_CLEAR(tmp);
5640 }
5641 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005642 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005643 if (*out == NULL) goto failed;
5644 return 0;
5645 }
Yury Selivanov75445082015-05-11 22:57:16 -04005646 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5647 if (isinstance == -1) {
5648 return 1;
5649 }
5650 if (isinstance) {
5651 asdl_seq* items;
5652 asdl_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005653 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005654
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005655 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5656 return 1;
5657 }
5658 if (tmp == NULL) {
5659 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5660 return 1;
5661 }
5662 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005663 int res;
5664 Py_ssize_t len;
5665 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005666 if (!PyList_Check(tmp)) {
5667 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5668 goto failed;
5669 }
5670 len = PyList_GET_SIZE(tmp);
5671 items = _Py_asdl_seq_new(len, arena);
5672 if (items == NULL) goto failed;
5673 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005674 withitem_ty val;
5675 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005676 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005677 if (len != PyList_GET_SIZE(tmp)) {
5678 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5679 goto failed;
5680 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005681 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005682 }
5683 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005684 }
5685 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005686 return 1;
5687 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005688 if (tmp == NULL) {
5689 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5690 return 1;
5691 }
5692 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005693 int res;
5694 Py_ssize_t len;
5695 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005696 if (!PyList_Check(tmp)) {
5697 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5698 goto failed;
5699 }
5700 len = PyList_GET_SIZE(tmp);
5701 body = _Py_asdl_seq_new(len, arena);
5702 if (body == NULL) goto failed;
5703 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005704 stmt_ty val;
5705 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005706 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005707 if (len != PyList_GET_SIZE(tmp)) {
5708 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5709 goto failed;
5710 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005711 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005712 }
5713 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005714 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005715 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
5716 return 1;
5717 }
5718 if (tmp == NULL || tmp == Py_None) {
5719 Py_CLEAR(tmp);
5720 type_comment = NULL;
5721 }
5722 else {
5723 int res;
5724 res = obj2ast_string(tmp, &type_comment, arena);
5725 if (res != 0) goto failed;
5726 Py_CLEAR(tmp);
5727 }
5728 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
5729 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005730 if (*out == NULL) goto failed;
5731 return 0;
5732 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005733 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5734 if (isinstance == -1) {
5735 return 1;
5736 }
5737 if (isinstance) {
5738 expr_ty exc;
5739 expr_ty cause;
5740
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005741 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5742 return 1;
5743 }
5744 if (tmp == NULL || tmp == Py_None) {
5745 Py_CLEAR(tmp);
5746 exc = NULL;
5747 }
5748 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005749 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005750 res = obj2ast_expr(tmp, &exc, arena);
5751 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005752 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005753 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005754 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5755 return 1;
5756 }
5757 if (tmp == NULL || tmp == Py_None) {
5758 Py_CLEAR(tmp);
5759 cause = NULL;
5760 }
5761 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005762 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005763 res = obj2ast_expr(tmp, &cause, arena);
5764 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005765 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005766 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005767 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
5768 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005769 if (*out == NULL) goto failed;
5770 return 0;
5771 }
5772 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5773 if (isinstance == -1) {
5774 return 1;
5775 }
5776 if (isinstance) {
5777 asdl_seq* body;
5778 asdl_seq* handlers;
5779 asdl_seq* orelse;
5780 asdl_seq* finalbody;
5781
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005782 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5783 return 1;
5784 }
5785 if (tmp == NULL) {
5786 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5787 return 1;
5788 }
5789 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005790 int res;
5791 Py_ssize_t len;
5792 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005793 if (!PyList_Check(tmp)) {
5794 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5795 goto failed;
5796 }
5797 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005798 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005799 if (body == NULL) goto failed;
5800 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005801 stmt_ty val;
5802 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005803 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005804 if (len != PyList_GET_SIZE(tmp)) {
5805 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5806 goto failed;
5807 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005808 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005809 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005810 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005811 }
5812 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005813 return 1;
5814 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005815 if (tmp == NULL) {
5816 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5817 return 1;
5818 }
5819 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005820 int res;
5821 Py_ssize_t len;
5822 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005823 if (!PyList_Check(tmp)) {
5824 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5825 goto failed;
5826 }
5827 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005828 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005829 if (handlers == NULL) goto failed;
5830 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005831 excepthandler_ty val;
5832 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005833 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005834 if (len != PyList_GET_SIZE(tmp)) {
5835 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5836 goto failed;
5837 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005838 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005839 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005840 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005841 }
5842 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005843 return 1;
5844 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005845 if (tmp == NULL) {
5846 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5847 return 1;
5848 }
5849 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005850 int res;
5851 Py_ssize_t len;
5852 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005853 if (!PyList_Check(tmp)) {
5854 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5855 goto failed;
5856 }
5857 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005858 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005859 if (orelse == NULL) goto failed;
5860 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005861 stmt_ty val;
5862 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005863 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005864 if (len != PyList_GET_SIZE(tmp)) {
5865 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5866 goto failed;
5867 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005868 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005869 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005870 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005871 }
5872 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005873 return 1;
5874 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005875 if (tmp == NULL) {
5876 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5877 return 1;
5878 }
5879 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005880 int res;
5881 Py_ssize_t len;
5882 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005883 if (!PyList_Check(tmp)) {
5884 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5885 goto failed;
5886 }
5887 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005888 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005889 if (finalbody == NULL) goto failed;
5890 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005891 stmt_ty val;
5892 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005893 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005894 if (len != PyList_GET_SIZE(tmp)) {
5895 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5896 goto failed;
5897 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005898 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005899 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005900 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005901 }
5902 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005903 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005904 if (*out == NULL) goto failed;
5905 return 0;
5906 }
5907 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5908 if (isinstance == -1) {
5909 return 1;
5910 }
5911 if (isinstance) {
5912 expr_ty test;
5913 expr_ty msg;
5914
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005915 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5916 return 1;
5917 }
5918 if (tmp == NULL) {
5919 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5920 return 1;
5921 }
5922 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005923 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005924 res = obj2ast_expr(tmp, &test, arena);
5925 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005926 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005927 }
5928 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005929 return 1;
5930 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005931 if (tmp == NULL || tmp == Py_None) {
5932 Py_CLEAR(tmp);
5933 msg = NULL;
5934 }
5935 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005936 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005937 res = obj2ast_expr(tmp, &msg, arena);
5938 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005939 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005940 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005941 *out = Assert(test, msg, lineno, col_offset, end_lineno,
5942 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005943 if (*out == NULL) goto failed;
5944 return 0;
5945 }
5946 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5947 if (isinstance == -1) {
5948 return 1;
5949 }
5950 if (isinstance) {
5951 asdl_seq* names;
5952
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005953 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5954 return 1;
5955 }
5956 if (tmp == NULL) {
5957 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5958 return 1;
5959 }
5960 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005961 int res;
5962 Py_ssize_t len;
5963 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005964 if (!PyList_Check(tmp)) {
5965 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5966 goto failed;
5967 }
5968 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005969 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005970 if (names == NULL) goto failed;
5971 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005972 alias_ty val;
5973 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005974 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005975 if (len != PyList_GET_SIZE(tmp)) {
5976 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5977 goto failed;
5978 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005979 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005980 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005981 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005982 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005983 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
5984 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005985 if (*out == NULL) goto failed;
5986 return 0;
5987 }
5988 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5989 if (isinstance == -1) {
5990 return 1;
5991 }
5992 if (isinstance) {
5993 identifier module;
5994 asdl_seq* names;
5995 int level;
5996
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005997 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5998 return 1;
5999 }
6000 if (tmp == NULL || tmp == Py_None) {
6001 Py_CLEAR(tmp);
6002 module = NULL;
6003 }
6004 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006005 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006006 res = obj2ast_identifier(tmp, &module, arena);
6007 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006008 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006009 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006010 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6011 return 1;
6012 }
6013 if (tmp == NULL) {
6014 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
6015 return 1;
6016 }
6017 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006018 int res;
6019 Py_ssize_t len;
6020 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006021 if (!PyList_Check(tmp)) {
6022 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6023 goto failed;
6024 }
6025 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006026 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006027 if (names == NULL) goto failed;
6028 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006029 alias_ty val;
6030 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006031 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006032 if (len != PyList_GET_SIZE(tmp)) {
6033 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
6034 goto failed;
6035 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006036 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006037 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006038 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006039 }
6040 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006041 return 1;
6042 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006043 if (tmp == NULL || tmp == Py_None) {
6044 Py_CLEAR(tmp);
6045 level = 0;
6046 }
6047 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006048 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006049 res = obj2ast_int(tmp, &level, arena);
6050 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006051 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006052 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006053 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
6054 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006055 if (*out == NULL) goto failed;
6056 return 0;
6057 }
6058 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
6059 if (isinstance == -1) {
6060 return 1;
6061 }
6062 if (isinstance) {
6063 asdl_seq* names;
6064
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006065 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6066 return 1;
6067 }
6068 if (tmp == NULL) {
6069 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
6070 return 1;
6071 }
6072 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006073 int res;
6074 Py_ssize_t len;
6075 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006076 if (!PyList_Check(tmp)) {
6077 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6078 goto failed;
6079 }
6080 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006081 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006082 if (names == NULL) goto failed;
6083 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006084 identifier val;
6085 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006086 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006087 if (len != PyList_GET_SIZE(tmp)) {
6088 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
6089 goto failed;
6090 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006091 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006092 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006093 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006094 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006095 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
6096 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006097 if (*out == NULL) goto failed;
6098 return 0;
6099 }
6100 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
6101 if (isinstance == -1) {
6102 return 1;
6103 }
6104 if (isinstance) {
6105 asdl_seq* names;
6106
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006107 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
6108 return 1;
6109 }
6110 if (tmp == NULL) {
6111 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
6112 return 1;
6113 }
6114 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006115 int res;
6116 Py_ssize_t len;
6117 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006118 if (!PyList_Check(tmp)) {
6119 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6120 goto failed;
6121 }
6122 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006123 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006124 if (names == NULL) goto failed;
6125 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006126 identifier val;
6127 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006128 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006129 if (len != PyList_GET_SIZE(tmp)) {
6130 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
6131 goto failed;
6132 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006133 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006134 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006135 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006136 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006137 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
6138 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006139 if (*out == NULL) goto failed;
6140 return 0;
6141 }
6142 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
6143 if (isinstance == -1) {
6144 return 1;
6145 }
6146 if (isinstance) {
6147 expr_ty value;
6148
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006149 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6150 return 1;
6151 }
6152 if (tmp == NULL) {
6153 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
6154 return 1;
6155 }
6156 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006157 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006158 res = obj2ast_expr(tmp, &value, arena);
6159 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006160 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006161 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006162 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
6163 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006164 if (*out == NULL) goto failed;
6165 return 0;
6166 }
6167 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
6168 if (isinstance == -1) {
6169 return 1;
6170 }
6171 if (isinstance) {
6172
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006173 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006174 if (*out == NULL) goto failed;
6175 return 0;
6176 }
6177 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
6178 if (isinstance == -1) {
6179 return 1;
6180 }
6181 if (isinstance) {
6182
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006183 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006184 if (*out == NULL) goto failed;
6185 return 0;
6186 }
6187 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
6188 if (isinstance == -1) {
6189 return 1;
6190 }
6191 if (isinstance) {
6192
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006193 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006194 if (*out == NULL) goto failed;
6195 return 0;
6196 }
6197
6198 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
6199 failed:
6200 Py_XDECREF(tmp);
6201 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006202}
6203
6204int
6205obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
6206{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006207 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006208
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006209 PyObject *tmp = NULL;
6210 int lineno;
6211 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006212 int end_lineno;
6213 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006214
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006215 if (obj == Py_None) {
6216 *out = NULL;
6217 return 0;
6218 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006219 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
6220 return 1;
6221 }
6222 if (tmp == NULL) {
6223 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
6224 return 1;
6225 }
6226 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006227 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006228 res = obj2ast_int(tmp, &lineno, arena);
6229 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006230 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006231 }
6232 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006233 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006234 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006235 if (tmp == NULL) {
6236 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
6237 return 1;
6238 }
6239 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006240 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006241 res = obj2ast_int(tmp, &col_offset, arena);
6242 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006243 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006244 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006245 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
6246 return 1;
6247 }
6248 if (tmp == NULL || tmp == Py_None) {
6249 Py_CLEAR(tmp);
6250 end_lineno = 0;
6251 }
6252 else {
6253 int res;
6254 res = obj2ast_int(tmp, &end_lineno, arena);
6255 if (res != 0) goto failed;
6256 Py_CLEAR(tmp);
6257 }
6258 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
6259 return 1;
6260 }
6261 if (tmp == NULL || tmp == Py_None) {
6262 Py_CLEAR(tmp);
6263 end_col_offset = 0;
6264 }
6265 else {
6266 int res;
6267 res = obj2ast_int(tmp, &end_col_offset, arena);
6268 if (res != 0) goto failed;
6269 Py_CLEAR(tmp);
6270 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006271 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
6272 if (isinstance == -1) {
6273 return 1;
6274 }
6275 if (isinstance) {
6276 boolop_ty op;
6277 asdl_seq* values;
6278
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006279 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6280 return 1;
6281 }
6282 if (tmp == NULL) {
6283 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
6284 return 1;
6285 }
6286 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006287 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006288 res = obj2ast_boolop(tmp, &op, arena);
6289 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006290 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006291 }
6292 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006293 return 1;
6294 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006295 if (tmp == NULL) {
6296 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
6297 return 1;
6298 }
6299 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006300 int res;
6301 Py_ssize_t len;
6302 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006303 if (!PyList_Check(tmp)) {
6304 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6305 goto failed;
6306 }
6307 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006308 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006309 if (values == NULL) goto failed;
6310 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006311 expr_ty val;
6312 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006313 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006314 if (len != PyList_GET_SIZE(tmp)) {
6315 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
6316 goto failed;
6317 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006318 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006319 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006320 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006321 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006322 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
6323 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006324 if (*out == NULL) goto failed;
6325 return 0;
6326 }
Emily Morehouse8f59ee02019-01-24 16:49:56 -07006327 isinstance = PyObject_IsInstance(obj, (PyObject*)NamedExpr_type);
6328 if (isinstance == -1) {
6329 return 1;
6330 }
6331 if (isinstance) {
6332 expr_ty target;
6333 expr_ty value;
6334
6335 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
6336 return 1;
6337 }
6338 if (tmp == NULL) {
6339 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
6340 return 1;
6341 }
6342 else {
6343 int res;
6344 res = obj2ast_expr(tmp, &target, arena);
6345 if (res != 0) goto failed;
6346 Py_CLEAR(tmp);
6347 }
6348 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6349 return 1;
6350 }
6351 if (tmp == NULL) {
6352 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
6353 return 1;
6354 }
6355 else {
6356 int res;
6357 res = obj2ast_expr(tmp, &value, arena);
6358 if (res != 0) goto failed;
6359 Py_CLEAR(tmp);
6360 }
6361 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
6362 end_col_offset, arena);
6363 if (*out == NULL) goto failed;
6364 return 0;
6365 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006366 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
6367 if (isinstance == -1) {
6368 return 1;
6369 }
6370 if (isinstance) {
6371 expr_ty left;
6372 operator_ty op;
6373 expr_ty right;
6374
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006375 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6376 return 1;
6377 }
6378 if (tmp == NULL) {
6379 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
6380 return 1;
6381 }
6382 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006383 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006384 res = obj2ast_expr(tmp, &left, arena);
6385 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006386 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006387 }
6388 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006389 return 1;
6390 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006391 if (tmp == NULL) {
6392 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
6393 return 1;
6394 }
6395 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006396 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006397 res = obj2ast_operator(tmp, &op, arena);
6398 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006399 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006400 }
6401 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006402 return 1;
6403 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006404 if (tmp == NULL) {
6405 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
6406 return 1;
6407 }
6408 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006409 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006410 res = obj2ast_expr(tmp, &right, arena);
6411 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006412 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006413 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006414 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
6415 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006416 if (*out == NULL) goto failed;
6417 return 0;
6418 }
6419 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
6420 if (isinstance == -1) {
6421 return 1;
6422 }
6423 if (isinstance) {
6424 unaryop_ty op;
6425 expr_ty operand;
6426
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006427 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
6428 return 1;
6429 }
6430 if (tmp == NULL) {
6431 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
6432 return 1;
6433 }
6434 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006435 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006436 res = obj2ast_unaryop(tmp, &op, arena);
6437 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006438 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006439 }
6440 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006441 return 1;
6442 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006443 if (tmp == NULL) {
6444 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
6445 return 1;
6446 }
6447 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006448 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006449 res = obj2ast_expr(tmp, &operand, arena);
6450 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006451 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006452 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006453 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
6454 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006455 if (*out == NULL) goto failed;
6456 return 0;
6457 }
6458 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
6459 if (isinstance == -1) {
6460 return 1;
6461 }
6462 if (isinstance) {
6463 arguments_ty args;
6464 expr_ty body;
6465
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006466 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
6467 return 1;
6468 }
6469 if (tmp == NULL) {
6470 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
6471 return 1;
6472 }
6473 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006474 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006475 res = obj2ast_arguments(tmp, &args, arena);
6476 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006477 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006478 }
6479 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006480 return 1;
6481 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006482 if (tmp == NULL) {
6483 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
6484 return 1;
6485 }
6486 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006487 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006488 res = obj2ast_expr(tmp, &body, arena);
6489 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006490 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006491 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006492 *out = Lambda(args, body, lineno, col_offset, end_lineno,
6493 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006494 if (*out == NULL) goto failed;
6495 return 0;
6496 }
6497 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
6498 if (isinstance == -1) {
6499 return 1;
6500 }
6501 if (isinstance) {
6502 expr_ty test;
6503 expr_ty body;
6504 expr_ty orelse;
6505
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006506 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
6507 return 1;
6508 }
6509 if (tmp == NULL) {
6510 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
6511 return 1;
6512 }
6513 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006514 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006515 res = obj2ast_expr(tmp, &test, arena);
6516 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006517 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006518 }
6519 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006520 return 1;
6521 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006522 if (tmp == NULL) {
6523 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
6524 return 1;
6525 }
6526 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006527 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006528 res = obj2ast_expr(tmp, &body, arena);
6529 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006530 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006531 }
6532 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006533 return 1;
6534 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006535 if (tmp == NULL) {
6536 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
6537 return 1;
6538 }
6539 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006540 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006541 res = obj2ast_expr(tmp, &orelse, arena);
6542 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006543 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006544 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006545 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
6546 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006547 if (*out == NULL) goto failed;
6548 return 0;
6549 }
6550 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
6551 if (isinstance == -1) {
6552 return 1;
6553 }
6554 if (isinstance) {
6555 asdl_seq* keys;
6556 asdl_seq* values;
6557
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006558 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
6559 return 1;
6560 }
6561 if (tmp == NULL) {
6562 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
6563 return 1;
6564 }
6565 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006566 int res;
6567 Py_ssize_t len;
6568 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006569 if (!PyList_Check(tmp)) {
6570 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6571 goto failed;
6572 }
6573 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006574 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006575 if (keys == NULL) goto failed;
6576 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006577 expr_ty val;
6578 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006579 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006580 if (len != PyList_GET_SIZE(tmp)) {
6581 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
6582 goto failed;
6583 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006584 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006585 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006586 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006587 }
6588 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006589 return 1;
6590 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006591 if (tmp == NULL) {
6592 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
6593 return 1;
6594 }
6595 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006596 int res;
6597 Py_ssize_t len;
6598 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006599 if (!PyList_Check(tmp)) {
6600 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6601 goto failed;
6602 }
6603 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006604 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006605 if (values == NULL) goto failed;
6606 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006607 expr_ty val;
6608 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006609 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006610 if (len != PyList_GET_SIZE(tmp)) {
6611 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
6612 goto failed;
6613 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006614 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006615 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006616 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006617 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006618 *out = Dict(keys, values, lineno, col_offset, end_lineno,
6619 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006620 if (*out == NULL) goto failed;
6621 return 0;
6622 }
6623 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
6624 if (isinstance == -1) {
6625 return 1;
6626 }
6627 if (isinstance) {
6628 asdl_seq* elts;
6629
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006630 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6631 return 1;
6632 }
6633 if (tmp == NULL) {
6634 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
6635 return 1;
6636 }
6637 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006638 int res;
6639 Py_ssize_t len;
6640 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006641 if (!PyList_Check(tmp)) {
6642 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6643 goto failed;
6644 }
6645 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006646 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006647 if (elts == NULL) goto failed;
6648 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006649 expr_ty val;
6650 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006651 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006652 if (len != PyList_GET_SIZE(tmp)) {
6653 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
6654 goto failed;
6655 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006656 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006657 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006658 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006659 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006660 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006661 if (*out == NULL) goto failed;
6662 return 0;
6663 }
6664 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
6665 if (isinstance == -1) {
6666 return 1;
6667 }
6668 if (isinstance) {
6669 expr_ty elt;
6670 asdl_seq* generators;
6671
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006672 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6673 return 1;
6674 }
6675 if (tmp == NULL) {
6676 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
6677 return 1;
6678 }
6679 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006680 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006681 res = obj2ast_expr(tmp, &elt, arena);
6682 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006683 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006684 }
6685 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006686 return 1;
6687 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006688 if (tmp == NULL) {
6689 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
6690 return 1;
6691 }
6692 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006693 int res;
6694 Py_ssize_t len;
6695 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006696 if (!PyList_Check(tmp)) {
6697 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6698 goto failed;
6699 }
6700 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006701 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006702 if (generators == NULL) goto failed;
6703 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006704 comprehension_ty val;
6705 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006706 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006707 if (len != PyList_GET_SIZE(tmp)) {
6708 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
6709 goto failed;
6710 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006711 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006712 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006713 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006714 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006715 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
6716 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006717 if (*out == NULL) goto failed;
6718 return 0;
6719 }
6720 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
6721 if (isinstance == -1) {
6722 return 1;
6723 }
6724 if (isinstance) {
6725 expr_ty elt;
6726 asdl_seq* generators;
6727
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006728 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6729 return 1;
6730 }
6731 if (tmp == NULL) {
6732 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6733 return 1;
6734 }
6735 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006736 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006737 res = obj2ast_expr(tmp, &elt, arena);
6738 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006739 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006740 }
6741 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006742 return 1;
6743 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006744 if (tmp == NULL) {
6745 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6746 return 1;
6747 }
6748 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006749 int res;
6750 Py_ssize_t len;
6751 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006752 if (!PyList_Check(tmp)) {
6753 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6754 goto failed;
6755 }
6756 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006757 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006758 if (generators == NULL) goto failed;
6759 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006760 comprehension_ty val;
6761 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006762 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006763 if (len != PyList_GET_SIZE(tmp)) {
6764 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6765 goto failed;
6766 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006767 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006768 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006769 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006770 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006771 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
6772 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006773 if (*out == NULL) goto failed;
6774 return 0;
6775 }
6776 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6777 if (isinstance == -1) {
6778 return 1;
6779 }
6780 if (isinstance) {
6781 expr_ty key;
6782 expr_ty value;
6783 asdl_seq* generators;
6784
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006785 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6786 return 1;
6787 }
6788 if (tmp == NULL) {
6789 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6790 return 1;
6791 }
6792 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006793 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006794 res = obj2ast_expr(tmp, &key, arena);
6795 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006796 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006797 }
6798 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006799 return 1;
6800 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006801 if (tmp == NULL) {
6802 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6803 return 1;
6804 }
6805 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006806 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006807 res = obj2ast_expr(tmp, &value, arena);
6808 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006809 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006810 }
6811 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006812 return 1;
6813 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006814 if (tmp == NULL) {
6815 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6816 return 1;
6817 }
6818 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006819 int res;
6820 Py_ssize_t len;
6821 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006822 if (!PyList_Check(tmp)) {
6823 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6824 goto failed;
6825 }
6826 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006827 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006828 if (generators == NULL) goto failed;
6829 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006830 comprehension_ty val;
6831 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006832 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006833 if (len != PyList_GET_SIZE(tmp)) {
6834 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6835 goto failed;
6836 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006837 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006838 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006839 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006840 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006841 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
6842 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006843 if (*out == NULL) goto failed;
6844 return 0;
6845 }
6846 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6847 if (isinstance == -1) {
6848 return 1;
6849 }
6850 if (isinstance) {
6851 expr_ty elt;
6852 asdl_seq* generators;
6853
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006854 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6855 return 1;
6856 }
6857 if (tmp == NULL) {
6858 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6859 return 1;
6860 }
6861 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006862 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006863 res = obj2ast_expr(tmp, &elt, arena);
6864 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006865 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006866 }
6867 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006868 return 1;
6869 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006870 if (tmp == NULL) {
6871 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6872 return 1;
6873 }
6874 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006875 int res;
6876 Py_ssize_t len;
6877 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006878 if (!PyList_Check(tmp)) {
6879 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6880 goto failed;
6881 }
6882 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006883 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006884 if (generators == NULL) goto failed;
6885 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006886 comprehension_ty val;
6887 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006888 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006889 if (len != PyList_GET_SIZE(tmp)) {
6890 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6891 goto failed;
6892 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006893 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006894 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006895 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006896 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006897 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
6898 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006899 if (*out == NULL) goto failed;
6900 return 0;
6901 }
Yury Selivanov75445082015-05-11 22:57:16 -04006902 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6903 if (isinstance == -1) {
6904 return 1;
6905 }
6906 if (isinstance) {
6907 expr_ty value;
6908
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006909 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6910 return 1;
6911 }
6912 if (tmp == NULL) {
6913 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6914 return 1;
6915 }
6916 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006917 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006918 res = obj2ast_expr(tmp, &value, arena);
6919 if (res != 0) goto failed;
6920 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006921 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006922 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
6923 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006924 if (*out == NULL) goto failed;
6925 return 0;
6926 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006927 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6928 if (isinstance == -1) {
6929 return 1;
6930 }
6931 if (isinstance) {
6932 expr_ty value;
6933
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006934 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6935 return 1;
6936 }
6937 if (tmp == NULL || tmp == Py_None) {
6938 Py_CLEAR(tmp);
6939 value = NULL;
6940 }
6941 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006942 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006943 res = obj2ast_expr(tmp, &value, arena);
6944 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006945 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006946 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006947 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
6948 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006949 if (*out == NULL) goto failed;
6950 return 0;
6951 }
6952 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6953 if (isinstance == -1) {
6954 return 1;
6955 }
6956 if (isinstance) {
6957 expr_ty value;
6958
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006959 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6960 return 1;
6961 }
6962 if (tmp == NULL) {
6963 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6964 return 1;
6965 }
6966 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006967 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006968 res = obj2ast_expr(tmp, &value, arena);
6969 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006970 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006971 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006972 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
6973 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006974 if (*out == NULL) goto failed;
6975 return 0;
6976 }
6977 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6978 if (isinstance == -1) {
6979 return 1;
6980 }
6981 if (isinstance) {
6982 expr_ty left;
6983 asdl_int_seq* ops;
6984 asdl_seq* comparators;
6985
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006986 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6987 return 1;
6988 }
6989 if (tmp == NULL) {
6990 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6991 return 1;
6992 }
6993 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006994 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006995 res = obj2ast_expr(tmp, &left, arena);
6996 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006997 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006998 }
6999 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007000 return 1;
7001 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007002 if (tmp == NULL) {
7003 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
7004 return 1;
7005 }
7006 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007007 int res;
7008 Py_ssize_t len;
7009 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007010 if (!PyList_Check(tmp)) {
7011 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7012 goto failed;
7013 }
7014 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007015 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007016 if (ops == NULL) goto failed;
7017 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007018 cmpop_ty val;
7019 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007020 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007021 if (len != PyList_GET_SIZE(tmp)) {
7022 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
7023 goto failed;
7024 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007025 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007026 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007027 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007028 }
7029 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007030 return 1;
7031 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007032 if (tmp == NULL) {
7033 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
7034 return 1;
7035 }
7036 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007037 int res;
7038 Py_ssize_t len;
7039 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007040 if (!PyList_Check(tmp)) {
7041 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7042 goto failed;
7043 }
7044 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007045 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007046 if (comparators == NULL) goto failed;
7047 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007048 expr_ty val;
7049 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007050 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007051 if (len != PyList_GET_SIZE(tmp)) {
7052 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
7053 goto failed;
7054 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007055 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007056 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007057 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007058 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007059 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
7060 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007061 if (*out == NULL) goto failed;
7062 return 0;
7063 }
7064 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
7065 if (isinstance == -1) {
7066 return 1;
7067 }
7068 if (isinstance) {
7069 expr_ty func;
7070 asdl_seq* args;
7071 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007072
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007073 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
7074 return 1;
7075 }
7076 if (tmp == NULL) {
7077 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
7078 return 1;
7079 }
7080 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007081 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007082 res = obj2ast_expr(tmp, &func, arena);
7083 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007084 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007085 }
7086 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007087 return 1;
7088 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007089 if (tmp == NULL) {
7090 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
7091 return 1;
7092 }
7093 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007094 int res;
7095 Py_ssize_t len;
7096 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007097 if (!PyList_Check(tmp)) {
7098 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7099 goto failed;
7100 }
7101 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007102 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007103 if (args == NULL) goto failed;
7104 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007105 expr_ty val;
7106 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007107 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007108 if (len != PyList_GET_SIZE(tmp)) {
7109 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
7110 goto failed;
7111 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007112 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007113 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007114 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007115 }
7116 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007117 return 1;
7118 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007119 if (tmp == NULL) {
7120 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
7121 return 1;
7122 }
7123 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007124 int res;
7125 Py_ssize_t len;
7126 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007127 if (!PyList_Check(tmp)) {
7128 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7129 goto failed;
7130 }
7131 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007132 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007133 if (keywords == NULL) goto failed;
7134 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007135 keyword_ty val;
7136 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007137 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007138 if (len != PyList_GET_SIZE(tmp)) {
7139 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
7140 goto failed;
7141 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007142 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007143 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007144 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007145 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007146 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
7147 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007148 if (*out == NULL) goto failed;
7149 return 0;
7150 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04007151 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
7152 if (isinstance == -1) {
7153 return 1;
7154 }
7155 if (isinstance) {
7156 expr_ty value;
7157 int conversion;
7158 expr_ty format_spec;
Eric V. Smith9a4135e2019-05-08 16:28:48 -04007159 string expr_text;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007160
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007161 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7162 return 1;
7163 }
7164 if (tmp == NULL) {
7165 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
7166 return 1;
7167 }
7168 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007169 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007170 res = obj2ast_expr(tmp, &value, arena);
7171 if (res != 0) goto failed;
7172 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007173 }
7174 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007175 return 1;
7176 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007177 if (tmp == NULL || tmp == Py_None) {
7178 Py_CLEAR(tmp);
7179 conversion = 0;
7180 }
7181 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007182 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007183 res = obj2ast_int(tmp, &conversion, arena);
7184 if (res != 0) goto failed;
7185 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007186 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007187 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
7188 return 1;
7189 }
7190 if (tmp == NULL || tmp == Py_None) {
7191 Py_CLEAR(tmp);
7192 format_spec = NULL;
7193 }
7194 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007195 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007196 res = obj2ast_expr(tmp, &format_spec, arena);
7197 if (res != 0) goto failed;
7198 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007199 }
Eric V. Smith9a4135e2019-05-08 16:28:48 -04007200 if (_PyObject_LookupAttrId(obj, &PyId_expr_text, &tmp) < 0) {
7201 return 1;
7202 }
7203 if (tmp == NULL || tmp == Py_None) {
7204 Py_CLEAR(tmp);
7205 expr_text = NULL;
7206 }
7207 else {
7208 int res;
7209 res = obj2ast_string(tmp, &expr_text, arena);
7210 if (res != 0) goto failed;
7211 Py_CLEAR(tmp);
7212 }
7213 *out = FormattedValue(value, conversion, format_spec, expr_text,
7214 lineno, col_offset, end_lineno, end_col_offset,
7215 arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007216 if (*out == NULL) goto failed;
7217 return 0;
7218 }
7219 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
7220 if (isinstance == -1) {
7221 return 1;
7222 }
7223 if (isinstance) {
7224 asdl_seq* values;
7225
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007226 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
7227 return 1;
7228 }
7229 if (tmp == NULL) {
7230 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
7231 return 1;
7232 }
7233 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04007234 int res;
7235 Py_ssize_t len;
7236 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007237 if (!PyList_Check(tmp)) {
7238 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7239 goto failed;
7240 }
7241 len = PyList_GET_SIZE(tmp);
7242 values = _Py_asdl_seq_new(len, arena);
7243 if (values == NULL) goto failed;
7244 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007245 expr_ty val;
7246 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007247 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03007248 if (len != PyList_GET_SIZE(tmp)) {
7249 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
7250 goto failed;
7251 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007252 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007253 }
7254 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007255 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007256 *out = JoinedStr(values, lineno, col_offset, end_lineno,
7257 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04007258 if (*out == NULL) goto failed;
7259 return 0;
7260 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007261 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
7262 if (isinstance == -1) {
7263 return 1;
7264 }
7265 if (isinstance) {
7266 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007267 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007268
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007269 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7270 return 1;
7271 }
7272 if (tmp == NULL) {
7273 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
7274 return 1;
7275 }
7276 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007277 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007278 res = obj2ast_constant(tmp, &value, arena);
7279 if (res != 0) goto failed;
7280 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007281 }
Guido van Rossum10f8ce62019-03-13 13:00:46 -07007282 if (_PyObject_LookupAttrId(obj, &PyId_kind, &tmp) < 0) {
7283 return 1;
7284 }
7285 if (tmp == NULL || tmp == Py_None) {
7286 Py_CLEAR(tmp);
7287 kind = NULL;
7288 }
7289 else {
7290 int res;
7291 res = obj2ast_string(tmp, &kind, arena);
7292 if (res != 0) goto failed;
7293 Py_CLEAR(tmp);
7294 }
7295 *out = Constant(value, kind, lineno, col_offset, end_lineno,
7296 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007297 if (*out == NULL) goto failed;
7298 return 0;
7299 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007300 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
7301 if (isinstance == -1) {
7302 return 1;
7303 }
7304 if (isinstance) {
7305 expr_ty value;
7306 identifier attr;
7307 expr_context_ty ctx;
7308
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007309 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7310 return 1;
7311 }
7312 if (tmp == NULL) {
7313 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
7314 return 1;
7315 }
7316 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007317 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007318 res = obj2ast_expr(tmp, &value, arena);
7319 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007320 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007321 }
7322 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007323 return 1;
7324 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007325 if (tmp == NULL) {
7326 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
7327 return 1;
7328 }
7329 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007330 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007331 res = obj2ast_identifier(tmp, &attr, arena);
7332 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007333 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007334 }
7335 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007336 return 1;
7337 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007338 if (tmp == NULL) {
7339 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
7340 return 1;
7341 }
7342 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007343 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007344 res = obj2ast_expr_context(tmp, &ctx, arena);
7345 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007346 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007347 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007348 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
7349 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007350 if (*out == NULL) goto failed;
7351 return 0;
7352 }
7353 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
7354 if (isinstance == -1) {
7355 return 1;
7356 }
7357 if (isinstance) {
7358 expr_ty value;
7359 slice_ty slice;
7360 expr_context_ty ctx;
7361
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007362 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7363 return 1;
7364 }
7365 if (tmp == NULL) {
7366 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
7367 return 1;
7368 }
7369 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007370 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007371 res = obj2ast_expr(tmp, &value, arena);
7372 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007373 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007374 }
7375 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007376 return 1;
7377 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007378 if (tmp == NULL) {
7379 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
7380 return 1;
7381 }
7382 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007383 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007384 res = obj2ast_slice(tmp, &slice, arena);
7385 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007386 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007387 }
7388 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007389 return 1;
7390 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007391 if (tmp == NULL) {
7392 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
7393 return 1;
7394 }
7395 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007396 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007397 res = obj2ast_expr_context(tmp, &ctx, arena);
7398 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007399 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007400 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007401 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
7402 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007403 if (*out == NULL) goto failed;
7404 return 0;
7405 }
7406 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
7407 if (isinstance == -1) {
7408 return 1;
7409 }
7410 if (isinstance) {
7411 expr_ty value;
7412 expr_context_ty ctx;
7413
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007414 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7415 return 1;
7416 }
7417 if (tmp == NULL) {
7418 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
7419 return 1;
7420 }
7421 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007422 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007423 res = obj2ast_expr(tmp, &value, arena);
7424 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007425 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007426 }
7427 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007428 return 1;
7429 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007430 if (tmp == NULL) {
7431 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
7432 return 1;
7433 }
7434 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007435 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007436 res = obj2ast_expr_context(tmp, &ctx, arena);
7437 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007438 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007439 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007440 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
7441 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007442 if (*out == NULL) goto failed;
7443 return 0;
7444 }
7445 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
7446 if (isinstance == -1) {
7447 return 1;
7448 }
7449 if (isinstance) {
7450 identifier id;
7451 expr_context_ty ctx;
7452
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007453 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
7454 return 1;
7455 }
7456 if (tmp == NULL) {
7457 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
7458 return 1;
7459 }
7460 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007461 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007462 res = obj2ast_identifier(tmp, &id, arena);
7463 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007464 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007465 }
7466 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007467 return 1;
7468 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007469 if (tmp == NULL) {
7470 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
7471 return 1;
7472 }
7473 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007474 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007475 res = obj2ast_expr_context(tmp, &ctx, arena);
7476 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007477 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007478 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007479 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
7480 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007481 if (*out == NULL) goto failed;
7482 return 0;
7483 }
7484 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
7485 if (isinstance == -1) {
7486 return 1;
7487 }
7488 if (isinstance) {
7489 asdl_seq* elts;
7490 expr_context_ty ctx;
7491
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007492 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7493 return 1;
7494 }
7495 if (tmp == NULL) {
7496 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
7497 return 1;
7498 }
7499 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007500 int res;
7501 Py_ssize_t len;
7502 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007503 if (!PyList_Check(tmp)) {
7504 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7505 goto failed;
7506 }
7507 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007508 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007509 if (elts == NULL) goto failed;
7510 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007511 expr_ty val;
7512 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007513 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007514 if (len != PyList_GET_SIZE(tmp)) {
7515 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
7516 goto failed;
7517 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007518 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007519 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007520 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007521 }
7522 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007523 return 1;
7524 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007525 if (tmp == NULL) {
7526 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
7527 return 1;
7528 }
7529 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007530 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007531 res = obj2ast_expr_context(tmp, &ctx, arena);
7532 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007533 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007534 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007535 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7536 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007537 if (*out == NULL) goto failed;
7538 return 0;
7539 }
7540 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
7541 if (isinstance == -1) {
7542 return 1;
7543 }
7544 if (isinstance) {
7545 asdl_seq* elts;
7546 expr_context_ty ctx;
7547
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007548 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
7549 return 1;
7550 }
7551 if (tmp == NULL) {
7552 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
7553 return 1;
7554 }
7555 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007556 int res;
7557 Py_ssize_t len;
7558 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007559 if (!PyList_Check(tmp)) {
7560 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7561 goto failed;
7562 }
7563 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007564 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007565 if (elts == NULL) goto failed;
7566 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007567 expr_ty val;
7568 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007569 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007570 if (len != PyList_GET_SIZE(tmp)) {
7571 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
7572 goto failed;
7573 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007574 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007575 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007576 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007577 }
7578 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007579 return 1;
7580 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007581 if (tmp == NULL) {
7582 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
7583 return 1;
7584 }
7585 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007586 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007587 res = obj2ast_expr_context(tmp, &ctx, arena);
7588 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007589 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007590 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007591 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
7592 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007593 if (*out == NULL) goto failed;
7594 return 0;
7595 }
7596
7597 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
7598 failed:
7599 Py_XDECREF(tmp);
7600 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007601}
7602
7603int
7604obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
7605{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007606 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007607
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007608 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
7609 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007610 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007611 }
7612 if (isinstance) {
7613 *out = Load;
7614 return 0;
7615 }
7616 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
7617 if (isinstance == -1) {
7618 return 1;
7619 }
7620 if (isinstance) {
7621 *out = Store;
7622 return 0;
7623 }
7624 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
7625 if (isinstance == -1) {
7626 return 1;
7627 }
7628 if (isinstance) {
7629 *out = Del;
7630 return 0;
7631 }
7632 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
7633 if (isinstance == -1) {
7634 return 1;
7635 }
7636 if (isinstance) {
7637 *out = AugLoad;
7638 return 0;
7639 }
7640 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
7641 if (isinstance == -1) {
7642 return 1;
7643 }
7644 if (isinstance) {
7645 *out = AugStore;
7646 return 0;
7647 }
7648 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
7649 if (isinstance == -1) {
7650 return 1;
7651 }
7652 if (isinstance) {
7653 *out = Param;
7654 return 0;
7655 }
7656
7657 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
7658 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007659}
7660
7661int
7662obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
7663{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007664 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007665
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007666 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007667
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007668 if (obj == Py_None) {
7669 *out = NULL;
7670 return 0;
7671 }
7672 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
7673 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007674 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007675 }
7676 if (isinstance) {
7677 expr_ty lower;
7678 expr_ty upper;
7679 expr_ty step;
7680
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007681 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
7682 return 1;
7683 }
7684 if (tmp == NULL || tmp == Py_None) {
7685 Py_CLEAR(tmp);
7686 lower = NULL;
7687 }
7688 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007689 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007690 res = obj2ast_expr(tmp, &lower, arena);
7691 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007692 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007693 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007694 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
7695 return 1;
7696 }
7697 if (tmp == NULL || tmp == Py_None) {
7698 Py_CLEAR(tmp);
7699 upper = NULL;
7700 }
7701 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007702 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007703 res = obj2ast_expr(tmp, &upper, arena);
7704 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007705 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007706 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007707 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
7708 return 1;
7709 }
7710 if (tmp == NULL || tmp == Py_None) {
7711 Py_CLEAR(tmp);
7712 step = NULL;
7713 }
7714 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007715 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007716 res = obj2ast_expr(tmp, &step, arena);
7717 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007718 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007719 }
7720 *out = Slice(lower, upper, step, arena);
7721 if (*out == NULL) goto failed;
7722 return 0;
7723 }
7724 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
7725 if (isinstance == -1) {
7726 return 1;
7727 }
7728 if (isinstance) {
7729 asdl_seq* dims;
7730
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007731 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
7732 return 1;
7733 }
7734 if (tmp == NULL) {
7735 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
7736 return 1;
7737 }
7738 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007739 int res;
7740 Py_ssize_t len;
7741 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007742 if (!PyList_Check(tmp)) {
7743 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7744 goto failed;
7745 }
7746 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007747 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007748 if (dims == NULL) goto failed;
7749 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007750 slice_ty val;
7751 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007752 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007753 if (len != PyList_GET_SIZE(tmp)) {
7754 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
7755 goto failed;
7756 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007757 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007758 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007759 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007760 }
7761 *out = ExtSlice(dims, arena);
7762 if (*out == NULL) goto failed;
7763 return 0;
7764 }
7765 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
7766 if (isinstance == -1) {
7767 return 1;
7768 }
7769 if (isinstance) {
7770 expr_ty value;
7771
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007772 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7773 return 1;
7774 }
7775 if (tmp == NULL) {
7776 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7777 return 1;
7778 }
7779 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007780 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007781 res = obj2ast_expr(tmp, &value, arena);
7782 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007783 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007784 }
7785 *out = Index(value, arena);
7786 if (*out == NULL) goto failed;
7787 return 0;
7788 }
7789
7790 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7791 failed:
7792 Py_XDECREF(tmp);
7793 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007794}
7795
7796int
7797obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7798{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007799 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007800
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007801 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7802 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007803 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007804 }
7805 if (isinstance) {
7806 *out = And;
7807 return 0;
7808 }
7809 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7810 if (isinstance == -1) {
7811 return 1;
7812 }
7813 if (isinstance) {
7814 *out = Or;
7815 return 0;
7816 }
7817
7818 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7819 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007820}
7821
7822int
7823obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7824{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007825 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007826
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007827 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7828 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007829 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007830 }
7831 if (isinstance) {
7832 *out = Add;
7833 return 0;
7834 }
7835 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7836 if (isinstance == -1) {
7837 return 1;
7838 }
7839 if (isinstance) {
7840 *out = Sub;
7841 return 0;
7842 }
7843 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7844 if (isinstance == -1) {
7845 return 1;
7846 }
7847 if (isinstance) {
7848 *out = Mult;
7849 return 0;
7850 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007851 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7852 if (isinstance == -1) {
7853 return 1;
7854 }
7855 if (isinstance) {
7856 *out = MatMult;
7857 return 0;
7858 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007859 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7860 if (isinstance == -1) {
7861 return 1;
7862 }
7863 if (isinstance) {
7864 *out = Div;
7865 return 0;
7866 }
7867 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7868 if (isinstance == -1) {
7869 return 1;
7870 }
7871 if (isinstance) {
7872 *out = Mod;
7873 return 0;
7874 }
7875 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7876 if (isinstance == -1) {
7877 return 1;
7878 }
7879 if (isinstance) {
7880 *out = Pow;
7881 return 0;
7882 }
7883 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7884 if (isinstance == -1) {
7885 return 1;
7886 }
7887 if (isinstance) {
7888 *out = LShift;
7889 return 0;
7890 }
7891 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7892 if (isinstance == -1) {
7893 return 1;
7894 }
7895 if (isinstance) {
7896 *out = RShift;
7897 return 0;
7898 }
7899 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7900 if (isinstance == -1) {
7901 return 1;
7902 }
7903 if (isinstance) {
7904 *out = BitOr;
7905 return 0;
7906 }
7907 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7908 if (isinstance == -1) {
7909 return 1;
7910 }
7911 if (isinstance) {
7912 *out = BitXor;
7913 return 0;
7914 }
7915 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7916 if (isinstance == -1) {
7917 return 1;
7918 }
7919 if (isinstance) {
7920 *out = BitAnd;
7921 return 0;
7922 }
7923 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7924 if (isinstance == -1) {
7925 return 1;
7926 }
7927 if (isinstance) {
7928 *out = FloorDiv;
7929 return 0;
7930 }
7931
7932 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7933 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007934}
7935
7936int
7937obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7938{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007939 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007940
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007941 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7942 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007943 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007944 }
7945 if (isinstance) {
7946 *out = Invert;
7947 return 0;
7948 }
7949 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7950 if (isinstance == -1) {
7951 return 1;
7952 }
7953 if (isinstance) {
7954 *out = Not;
7955 return 0;
7956 }
7957 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7958 if (isinstance == -1) {
7959 return 1;
7960 }
7961 if (isinstance) {
7962 *out = UAdd;
7963 return 0;
7964 }
7965 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7966 if (isinstance == -1) {
7967 return 1;
7968 }
7969 if (isinstance) {
7970 *out = USub;
7971 return 0;
7972 }
7973
7974 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7975 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007976}
7977
7978int
7979obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7980{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007981 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007982
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007983 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7984 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007985 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007986 }
7987 if (isinstance) {
7988 *out = Eq;
7989 return 0;
7990 }
7991 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7992 if (isinstance == -1) {
7993 return 1;
7994 }
7995 if (isinstance) {
7996 *out = NotEq;
7997 return 0;
7998 }
7999 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
8000 if (isinstance == -1) {
8001 return 1;
8002 }
8003 if (isinstance) {
8004 *out = Lt;
8005 return 0;
8006 }
8007 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
8008 if (isinstance == -1) {
8009 return 1;
8010 }
8011 if (isinstance) {
8012 *out = LtE;
8013 return 0;
8014 }
8015 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
8016 if (isinstance == -1) {
8017 return 1;
8018 }
8019 if (isinstance) {
8020 *out = Gt;
8021 return 0;
8022 }
8023 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
8024 if (isinstance == -1) {
8025 return 1;
8026 }
8027 if (isinstance) {
8028 *out = GtE;
8029 return 0;
8030 }
8031 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
8032 if (isinstance == -1) {
8033 return 1;
8034 }
8035 if (isinstance) {
8036 *out = Is;
8037 return 0;
8038 }
8039 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
8040 if (isinstance == -1) {
8041 return 1;
8042 }
8043 if (isinstance) {
8044 *out = IsNot;
8045 return 0;
8046 }
8047 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
8048 if (isinstance == -1) {
8049 return 1;
8050 }
8051 if (isinstance) {
8052 *out = In;
8053 return 0;
8054 }
8055 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
8056 if (isinstance == -1) {
8057 return 1;
8058 }
8059 if (isinstance) {
8060 *out = NotIn;
8061 return 0;
8062 }
8063
8064 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
8065 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008066}
8067
8068int
8069obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
8070{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008071 PyObject* tmp = NULL;
8072 expr_ty target;
8073 expr_ty iter;
8074 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008075 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008076
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008077 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
8078 return 1;
8079 }
8080 if (tmp == NULL) {
8081 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
8082 return 1;
8083 }
8084 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008085 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008086 res = obj2ast_expr(tmp, &target, arena);
8087 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008088 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008089 }
8090 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008091 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008092 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008093 if (tmp == NULL) {
8094 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
8095 return 1;
8096 }
8097 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008098 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008099 res = obj2ast_expr(tmp, &iter, arena);
8100 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008101 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008102 }
8103 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008104 return 1;
8105 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008106 if (tmp == NULL) {
8107 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
8108 return 1;
8109 }
8110 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008111 int res;
8112 Py_ssize_t len;
8113 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008114 if (!PyList_Check(tmp)) {
8115 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8116 goto failed;
8117 }
8118 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008119 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008120 if (ifs == NULL) goto failed;
8121 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008122 expr_ty val;
8123 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008124 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008125 if (len != PyList_GET_SIZE(tmp)) {
8126 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
8127 goto failed;
8128 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008129 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008130 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008131 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008132 }
8133 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008134 return 1;
8135 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008136 if (tmp == NULL) {
8137 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
8138 return 1;
8139 }
8140 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008141 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008142 res = obj2ast_int(tmp, &is_async, arena);
8143 if (res != 0) goto failed;
8144 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008145 }
8146 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008147 return 0;
8148failed:
8149 Py_XDECREF(tmp);
8150 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008151}
8152
8153int
8154obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
8155{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008156 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00008157
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008158 PyObject *tmp = NULL;
8159 int lineno;
8160 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008161 int end_lineno;
8162 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008163
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008164 if (obj == Py_None) {
8165 *out = NULL;
8166 return 0;
8167 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008168 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8169 return 1;
8170 }
8171 if (tmp == NULL) {
8172 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
8173 return 1;
8174 }
8175 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008176 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008177 res = obj2ast_int(tmp, &lineno, arena);
8178 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008179 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008180 }
8181 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008182 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008183 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008184 if (tmp == NULL) {
8185 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
8186 return 1;
8187 }
8188 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008189 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008190 res = obj2ast_int(tmp, &col_offset, arena);
8191 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008192 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008193 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008194 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8195 return 1;
8196 }
8197 if (tmp == NULL || tmp == Py_None) {
8198 Py_CLEAR(tmp);
8199 end_lineno = 0;
8200 }
8201 else {
8202 int res;
8203 res = obj2ast_int(tmp, &end_lineno, arena);
8204 if (res != 0) goto failed;
8205 Py_CLEAR(tmp);
8206 }
8207 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8208 return 1;
8209 }
8210 if (tmp == NULL || tmp == Py_None) {
8211 Py_CLEAR(tmp);
8212 end_col_offset = 0;
8213 }
8214 else {
8215 int res;
8216 res = obj2ast_int(tmp, &end_col_offset, arena);
8217 if (res != 0) goto failed;
8218 Py_CLEAR(tmp);
8219 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008220 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
8221 if (isinstance == -1) {
8222 return 1;
8223 }
8224 if (isinstance) {
8225 expr_ty type;
8226 identifier name;
8227 asdl_seq* body;
8228
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008229 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
8230 return 1;
8231 }
8232 if (tmp == NULL || tmp == Py_None) {
8233 Py_CLEAR(tmp);
8234 type = NULL;
8235 }
8236 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008237 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008238 res = obj2ast_expr(tmp, &type, arena);
8239 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008240 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008241 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008242 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8243 return 1;
8244 }
8245 if (tmp == NULL || tmp == Py_None) {
8246 Py_CLEAR(tmp);
8247 name = NULL;
8248 }
8249 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008250 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008251 res = obj2ast_identifier(tmp, &name, arena);
8252 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008253 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008254 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008255 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
8256 return 1;
8257 }
8258 if (tmp == NULL) {
8259 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
8260 return 1;
8261 }
8262 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008263 int res;
8264 Py_ssize_t len;
8265 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008266 if (!PyList_Check(tmp)) {
8267 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8268 goto failed;
8269 }
8270 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008271 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008272 if (body == NULL) goto failed;
8273 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008274 stmt_ty val;
8275 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008276 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008277 if (len != PyList_GET_SIZE(tmp)) {
8278 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
8279 goto failed;
8280 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008281 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008282 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008283 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008284 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008285 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
8286 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008287 if (*out == NULL) goto failed;
8288 return 0;
8289 }
8290
8291 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
8292 failed:
8293 Py_XDECREF(tmp);
8294 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008295}
8296
8297int
8298obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
8299{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008300 PyObject* tmp = NULL;
8301 asdl_seq* args;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008302 asdl_seq* posonlyargs;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008303 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008304 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008305 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008306 arg_ty kwarg;
8307 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008308
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008309 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
8310 return 1;
8311 }
8312 if (tmp == NULL) {
8313 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
8314 return 1;
8315 }
8316 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008317 int res;
8318 Py_ssize_t len;
8319 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008320 if (!PyList_Check(tmp)) {
8321 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8322 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008323 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008324 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008325 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008326 if (args == NULL) goto failed;
8327 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008328 arg_ty val;
8329 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008330 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008331 if (len != PyList_GET_SIZE(tmp)) {
8332 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
8333 goto failed;
8334 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008335 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008336 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008337 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008338 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008339 if (_PyObject_LookupAttrId(obj, &PyId_posonlyargs, &tmp) < 0) {
8340 return 1;
8341 }
8342 if (tmp == NULL) {
8343 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
8344 return 1;
8345 }
8346 else {
8347 int res;
8348 Py_ssize_t len;
8349 Py_ssize_t i;
8350 if (!PyList_Check(tmp)) {
8351 PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8352 goto failed;
8353 }
8354 len = PyList_GET_SIZE(tmp);
8355 posonlyargs = _Py_asdl_seq_new(len, arena);
8356 if (posonlyargs == NULL) goto failed;
8357 for (i = 0; i < len; i++) {
8358 arg_ty val;
8359 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
8360 if (res != 0) goto failed;
8361 if (len != PyList_GET_SIZE(tmp)) {
8362 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
8363 goto failed;
8364 }
8365 asdl_seq_SET(posonlyargs, i, val);
8366 }
8367 Py_CLEAR(tmp);
8368 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008369 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008370 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008371 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008372 if (tmp == NULL || tmp == Py_None) {
8373 Py_CLEAR(tmp);
8374 vararg = NULL;
8375 }
8376 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008377 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008378 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008379 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008380 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008381 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008382 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
8383 return 1;
8384 }
8385 if (tmp == NULL) {
8386 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
8387 return 1;
8388 }
8389 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008390 int res;
8391 Py_ssize_t len;
8392 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008393 if (!PyList_Check(tmp)) {
8394 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8395 goto failed;
8396 }
8397 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008398 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008399 if (kwonlyargs == NULL) goto failed;
8400 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008401 arg_ty val;
8402 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008403 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008404 if (len != PyList_GET_SIZE(tmp)) {
8405 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
8406 goto failed;
8407 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008408 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008409 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008410 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008411 }
8412 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008413 return 1;
8414 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008415 if (tmp == NULL) {
8416 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
8417 return 1;
8418 }
8419 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008420 int res;
8421 Py_ssize_t len;
8422 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008423 if (!PyList_Check(tmp)) {
8424 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8425 goto failed;
8426 }
8427 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008428 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008429 if (kw_defaults == NULL) goto failed;
8430 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008431 expr_ty val;
8432 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008433 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008434 if (len != PyList_GET_SIZE(tmp)) {
8435 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
8436 goto failed;
8437 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008438 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008439 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008440 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008441 }
8442 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008443 return 1;
8444 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008445 if (tmp == NULL || tmp == Py_None) {
8446 Py_CLEAR(tmp);
8447 kwarg = NULL;
8448 }
8449 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008450 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008451 res = obj2ast_arg(tmp, &kwarg, arena);
8452 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02008453 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008454 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008455 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
8456 return 1;
8457 }
8458 if (tmp == NULL) {
8459 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
8460 return 1;
8461 }
8462 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02008463 int res;
8464 Py_ssize_t len;
8465 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008466 if (!PyList_Check(tmp)) {
8467 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
8468 goto failed;
8469 }
8470 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02008471 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008472 if (defaults == NULL) goto failed;
8473 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008474 expr_ty val;
8475 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008476 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008477 if (len != PyList_GET_SIZE(tmp)) {
8478 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
8479 goto failed;
8480 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008481 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008482 }
Victor Stinnerb3189902013-07-27 00:04:42 +02008483 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02008484 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01008485 *out = arguments(args, posonlyargs, vararg, kwonlyargs, kw_defaults, kwarg,
8486 defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008487 return 0;
8488failed:
8489 Py_XDECREF(tmp);
8490 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008491}
8492
8493int
8494obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
8495{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008496 PyObject* tmp = NULL;
8497 identifier arg;
8498 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008499 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01008500 int lineno;
8501 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008502 int end_lineno;
8503 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008504
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008505 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8506 return 1;
8507 }
8508 if (tmp == NULL) {
8509 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
8510 return 1;
8511 }
8512 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008513 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008514 res = obj2ast_identifier(tmp, &arg, arena);
8515 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008516 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008517 }
8518 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008519 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008520 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008521 if (tmp == NULL || tmp == Py_None) {
8522 Py_CLEAR(tmp);
8523 annotation = NULL;
8524 }
8525 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008526 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008527 res = obj2ast_expr(tmp, &annotation, arena);
8528 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008529 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008530 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008531 if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) {
8532 return 1;
8533 }
8534 if (tmp == NULL || tmp == Py_None) {
8535 Py_CLEAR(tmp);
8536 type_comment = NULL;
8537 }
8538 else {
8539 int res;
8540 res = obj2ast_string(tmp, &type_comment, arena);
8541 if (res != 0) goto failed;
8542 Py_CLEAR(tmp);
8543 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008544 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8545 return 1;
8546 }
8547 if (tmp == NULL) {
8548 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
8549 return 1;
8550 }
8551 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008552 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008553 res = obj2ast_int(tmp, &lineno, arena);
8554 if (res != 0) goto failed;
8555 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008556 }
8557 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01008558 return 1;
8559 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008560 if (tmp == NULL) {
8561 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
8562 return 1;
8563 }
8564 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01008565 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01008566 res = obj2ast_int(tmp, &col_offset, arena);
8567 if (res != 0) goto failed;
8568 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01008569 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008570 if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) {
8571 return 1;
8572 }
8573 if (tmp == NULL || tmp == Py_None) {
8574 Py_CLEAR(tmp);
8575 end_lineno = 0;
8576 }
8577 else {
8578 int res;
8579 res = obj2ast_int(tmp, &end_lineno, arena);
8580 if (res != 0) goto failed;
8581 Py_CLEAR(tmp);
8582 }
8583 if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) {
8584 return 1;
8585 }
8586 if (tmp == NULL || tmp == Py_None) {
8587 Py_CLEAR(tmp);
8588 end_col_offset = 0;
8589 }
8590 else {
8591 int res;
8592 res = obj2ast_int(tmp, &end_col_offset, arena);
8593 if (res != 0) goto failed;
8594 Py_CLEAR(tmp);
8595 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008596 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
8597 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008598 return 0;
8599failed:
8600 Py_XDECREF(tmp);
8601 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008602}
8603
8604int
8605obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
8606{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008607 PyObject* tmp = NULL;
8608 identifier arg;
8609 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008610
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008611 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
8612 return 1;
8613 }
8614 if (tmp == NULL || tmp == Py_None) {
8615 Py_CLEAR(tmp);
8616 arg = NULL;
8617 }
8618 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008619 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008620 res = obj2ast_identifier(tmp, &arg, arena);
8621 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008622 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008623 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008624 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
8625 return 1;
8626 }
8627 if (tmp == NULL) {
8628 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
8629 return 1;
8630 }
8631 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008632 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008633 res = obj2ast_expr(tmp, &value, arena);
8634 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008635 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008636 }
8637 *out = keyword(arg, value, arena);
8638 return 0;
8639failed:
8640 Py_XDECREF(tmp);
8641 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008642}
8643
8644int
8645obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
8646{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008647 PyObject* tmp = NULL;
8648 identifier name;
8649 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008650
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008651 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
8652 return 1;
8653 }
8654 if (tmp == NULL) {
8655 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
8656 return 1;
8657 }
8658 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008659 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008660 res = obj2ast_identifier(tmp, &name, arena);
8661 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008662 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008663 }
8664 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008665 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008666 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008667 if (tmp == NULL || tmp == Py_None) {
8668 Py_CLEAR(tmp);
8669 asname = NULL;
8670 }
8671 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008672 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008673 res = obj2ast_identifier(tmp, &asname, arena);
8674 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008675 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008676 }
8677 *out = alias(name, asname, arena);
8678 return 0;
8679failed:
8680 Py_XDECREF(tmp);
8681 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008682}
8683
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008684int
8685obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
8686{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008687 PyObject* tmp = NULL;
8688 expr_ty context_expr;
8689 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008690
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008691 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
8692 return 1;
8693 }
8694 if (tmp == NULL) {
8695 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
8696 return 1;
8697 }
8698 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008699 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008700 res = obj2ast_expr(tmp, &context_expr, arena);
8701 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008702 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008703 }
8704 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008705 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008706 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008707 if (tmp == NULL || tmp == Py_None) {
8708 Py_CLEAR(tmp);
8709 optional_vars = NULL;
8710 }
8711 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008712 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008713 res = obj2ast_expr(tmp, &optional_vars, arena);
8714 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008715 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008716 }
8717 *out = withitem(context_expr, optional_vars, arena);
8718 return 0;
8719failed:
8720 Py_XDECREF(tmp);
8721 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05008722}
8723
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008724int
8725obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena)
8726{
8727 int isinstance;
8728
8729 PyObject *tmp = NULL;
8730
8731 if (obj == Py_None) {
8732 *out = NULL;
8733 return 0;
8734 }
8735 isinstance = PyObject_IsInstance(obj, (PyObject*)TypeIgnore_type);
8736 if (isinstance == -1) {
8737 return 1;
8738 }
8739 if (isinstance) {
8740 int lineno;
8741
8742 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
8743 return 1;
8744 }
8745 if (tmp == NULL) {
8746 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
8747 return 1;
8748 }
8749 else {
8750 int res;
8751 res = obj2ast_int(tmp, &lineno, arena);
8752 if (res != 0) goto failed;
8753 Py_CLEAR(tmp);
8754 }
8755 *out = TypeIgnore(lineno, arena);
8756 if (*out == NULL) goto failed;
8757 return 0;
8758 }
8759
8760 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
8761 failed:
8762 Py_XDECREF(tmp);
8763 return 1;
8764}
8765
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008766
Martin v. Löwis1a214512008-06-11 05:26:20 +00008767static struct PyModuleDef _astmodule = {
8768 PyModuleDef_HEAD_INIT, "_ast"
8769};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008770PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00008771PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008772{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008773 PyObject *m, *d;
8774 if (!init_types()) return NULL;
8775 m = PyModule_Create(&_astmodule);
8776 if (!m) return NULL;
8777 d = PyModule_GetDict(m);
8778 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02008779 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008780 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008781 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)
8782 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008783 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
8784 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
8785 NULL;
8786 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
8787 0) return NULL;
8788 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
8789 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008790 if (PyDict_SetItemString(d, "FunctionType", (PyObject*)FunctionType_type) <
8791 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008792 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
8793 NULL;
8794 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
8795 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
8796 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008797 if (PyDict_SetItemString(d, "AsyncFunctionDef",
8798 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008799 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
8800 return NULL;
8801 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
8802 NULL;
8803 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
8804 NULL;
8805 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
8806 NULL;
8807 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
8808 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07008809 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
8810 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008811 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008812 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
8813 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008814 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
8815 NULL;
8816 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
8817 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008818 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
8819 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008820 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
8821 NULL;
8822 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
8823 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
8824 NULL;
8825 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
8826 NULL;
8827 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
8828 return NULL;
8829 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
8830 NULL;
8831 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
8832 return NULL;
8833 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
8834 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
8835 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
8836 NULL;
8837 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
8838 return NULL;
8839 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
8840 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
8841 NULL;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07008842 if (PyDict_SetItemString(d, "NamedExpr", (PyObject*)NamedExpr_type) < 0)
8843 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008844 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
8845 NULL;
8846 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
8847 NULL;
8848 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
8849 NULL;
8850 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
8851 NULL;
8852 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
8853 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
8854 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
8855 return NULL;
8856 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
8857 NULL;
8858 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
8859 return NULL;
8860 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
8861 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04008862 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
8863 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008864 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
8865 NULL;
8866 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
8867 return NULL;
8868 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
8869 NULL;
8870 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008871 if (PyDict_SetItemString(d, "FormattedValue",
8872 (PyObject*)FormattedValue_type) < 0) return NULL;
8873 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
8874 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008875 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
8876 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008877 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
8878 return NULL;
8879 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
8880 return NULL;
8881 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
8882 NULL;
8883 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
8884 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
8885 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
8886 NULL;
8887 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
8888 0) return NULL;
8889 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
8890 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
8891 NULL;
8892 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
8893 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
8894 NULL;
8895 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
8896 return NULL;
8897 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
8898 NULL;
8899 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
8900 NULL;
8901 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
8902 NULL;
8903 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
8904 return NULL;
8905 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
8906 NULL;
8907 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
8908 NULL;
8909 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
8910 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
8911 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
8912 return NULL;
8913 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
8914 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
8915 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04008916 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
8917 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008918 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
8919 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8920 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8921 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8922 NULL;
8923 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8924 NULL;
8925 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8926 NULL;
8927 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8928 NULL;
8929 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8930 NULL;
8931 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8932 return NULL;
8933 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8934 NULL;
8935 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8936 NULL;
8937 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8938 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8939 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8940 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8941 NULL;
8942 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8943 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8944 NULL;
8945 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8946 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8947 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8948 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8949 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8950 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8951 NULL;
8952 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8953 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8954 NULL;
8955 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8956 < 0) return NULL;
8957 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8958 < 0) return NULL;
8959 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8960 < 0) return NULL;
8961 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8962 return NULL;
8963 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8964 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8965 NULL;
8966 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8967 NULL;
8968 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8969 return NULL;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08008970 if (PyDict_SetItemString(d, "type_ignore", (PyObject*)type_ignore_type) <
8971 0) return NULL;
8972 if (PyDict_SetItemString(d, "TypeIgnore", (PyObject*)TypeIgnore_type) < 0)
8973 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008974 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008975}
8976
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008977
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008978PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008979{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008980 if (!init_types())
8981 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008982 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008983}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008984
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008985/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8986mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008987{
Guido van Rossum495da292019-03-07 12:38:08 -08008988 return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION);
8989}
8990
8991mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version)
8992{
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008993 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008994 PyObject *req_type[3];
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08008995 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008996 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008997
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008998 req_type[0] = (PyObject*)Module_type;
8999 req_type[1] = (PyObject*)Expression_type;
9000 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05009001
Guido van Rossum3a32e3b2019-02-01 11:37:34 -08009002 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +00009003
Victor Stinnerbdf630c2013-07-17 00:17:15 +02009004 if (!init_types())
9005 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00009006
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00009007 isinstance = PyObject_IsInstance(ast, req_type[mode]);
9008 if (isinstance == -1)
9009 return NULL;
9010 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00009011 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
9012 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009013 return NULL;
9014 }
9015 if (obj2ast_mod(ast, &res, arena) != 0)
9016 return NULL;
9017 else
9018 return res;
9019}
9020
9021int PyAST_Check(PyObject* obj)
9022{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02009023 if (!init_types())
9024 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00009025 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009026}
9027
Martin v. Löwis5b222132007-06-10 09:51:05 +00009028