blob: bbe8e69fdd504c7fa976ccedd04f5afc95a5f8ff [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);
Neal Norwitz53d960c2006-02-28 22:47:29 +000013static char *Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020014 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000015};
Neal Norwitz53d960c2006-02-28 22:47:29 +000016static PyTypeObject *Interactive_type;
17static char *Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020018 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000019};
Neal Norwitz53d960c2006-02-28 22:47:29 +000020static PyTypeObject *Expression_type;
21static char *Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020022 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000023};
Neal Norwitz53d960c2006-02-28 22:47:29 +000024static PyTypeObject *Suite_type;
25static char *Suite_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020026 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000027};
Neal Norwitz53d960c2006-02-28 22:47:29 +000028static PyTypeObject *stmt_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020029_Py_IDENTIFIER(lineno);
30_Py_IDENTIFIER(col_offset);
Neal Norwitz53d960c2006-02-28 22:47:29 +000031static char *stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +020032 "lineno",
33 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +000034};
Martin v. Löwisbd260da2006-02-26 19:42:26 +000035static PyObject* ast2obj_stmt(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000036static PyTypeObject *FunctionDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020037_Py_IDENTIFIER(name);
38_Py_IDENTIFIER(args);
39_Py_IDENTIFIER(decorator_list);
40_Py_IDENTIFIER(returns);
Neal Norwitz53d960c2006-02-28 22:47:29 +000041static char *FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020042 "name",
43 "args",
44 "body",
45 "decorator_list",
46 "returns",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000047};
Yury Selivanov75445082015-05-11 22:57:16 -040048static PyTypeObject *AsyncFunctionDef_type;
49static char *AsyncFunctionDef_fields[]={
50 "name",
51 "args",
52 "body",
53 "decorator_list",
54 "returns",
55};
Neal Norwitz53d960c2006-02-28 22:47:29 +000056static PyTypeObject *ClassDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020057_Py_IDENTIFIER(bases);
58_Py_IDENTIFIER(keywords);
Neal Norwitz53d960c2006-02-28 22:47:29 +000059static char *ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020060 "name",
61 "bases",
62 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +020063 "body",
64 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000065};
Neal Norwitz53d960c2006-02-28 22:47:29 +000066static PyTypeObject *Return_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020067_Py_IDENTIFIER(value);
Neal Norwitz53d960c2006-02-28 22:47:29 +000068static char *Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020069 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000070};
Neal Norwitz53d960c2006-02-28 22:47:29 +000071static PyTypeObject *Delete_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020072_Py_IDENTIFIER(targets);
Neal Norwitz53d960c2006-02-28 22:47:29 +000073static char *Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020074 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000075};
Neal Norwitz53d960c2006-02-28 22:47:29 +000076static PyTypeObject *Assign_type;
77static char *Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020078 "targets",
79 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000080};
Neal Norwitz53d960c2006-02-28 22:47:29 +000081static PyTypeObject *AugAssign_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020082_Py_IDENTIFIER(target);
83_Py_IDENTIFIER(op);
Neal Norwitz53d960c2006-02-28 22:47:29 +000084static char *AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +020085 "target",
86 "op",
87 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000088};
Yury Selivanovf8cb8a12016-09-08 20:50:03 -070089static PyTypeObject *AnnAssign_type;
90_Py_IDENTIFIER(annotation);
91_Py_IDENTIFIER(simple);
92static char *AnnAssign_fields[]={
93 "target",
94 "annotation",
95 "value",
96 "simple",
97};
Neal Norwitz53d960c2006-02-28 22:47:29 +000098static PyTypeObject *For_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020099_Py_IDENTIFIER(iter);
100_Py_IDENTIFIER(orelse);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000101static char *For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200102 "target",
103 "iter",
104 "body",
105 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000106};
Yury Selivanov75445082015-05-11 22:57:16 -0400107static PyTypeObject *AsyncFor_type;
108static char *AsyncFor_fields[]={
109 "target",
110 "iter",
111 "body",
112 "orelse",
113};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000114static PyTypeObject *While_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200115_Py_IDENTIFIER(test);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000116static char *While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200117 "test",
118 "body",
119 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000120};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000121static PyTypeObject *If_type;
122static char *If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200123 "test",
124 "body",
125 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000126};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000127static PyTypeObject *With_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200128_Py_IDENTIFIER(items);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000129static char *With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200130 "items",
131 "body",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000132};
Yury Selivanov75445082015-05-11 22:57:16 -0400133static PyTypeObject *AsyncWith_type;
134static char *AsyncWith_fields[]={
135 "items",
136 "body",
137};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000138static PyTypeObject *Raise_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200139_Py_IDENTIFIER(exc);
140_Py_IDENTIFIER(cause);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000141static char *Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200142 "exc",
143 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000144};
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500145static PyTypeObject *Try_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200146_Py_IDENTIFIER(handlers);
147_Py_IDENTIFIER(finalbody);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500148static char *Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200149 "body",
150 "handlers",
151 "orelse",
152 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000153};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000154static PyTypeObject *Assert_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200155_Py_IDENTIFIER(msg);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000156static char *Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200157 "test",
158 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000159};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000160static PyTypeObject *Import_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200161_Py_IDENTIFIER(names);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000162static char *Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200163 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000164};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000165static PyTypeObject *ImportFrom_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200166_Py_IDENTIFIER(module);
167_Py_IDENTIFIER(level);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000168static char *ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200169 "module",
170 "names",
171 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000172};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000173static PyTypeObject *Global_type;
174static char *Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200175 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000176};
Jeremy Hylton81e95022007-02-27 06:50:52 +0000177static PyTypeObject *Nonlocal_type;
178static char *Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200179 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000180};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000181static PyTypeObject *Expr_type;
182static char *Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200183 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000184};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000185static PyTypeObject *Pass_type;
186static PyTypeObject *Break_type;
187static PyTypeObject *Continue_type;
188static PyTypeObject *expr_type;
189static char *expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200190 "lineno",
191 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000192};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000193static PyObject* ast2obj_expr(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000194static PyTypeObject *BoolOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200195_Py_IDENTIFIER(values);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000196static char *BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200197 "op",
198 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000199};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000200static PyTypeObject *BinOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200201_Py_IDENTIFIER(left);
202_Py_IDENTIFIER(right);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000203static char *BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200204 "left",
205 "op",
206 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000207};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000208static PyTypeObject *UnaryOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200209_Py_IDENTIFIER(operand);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000210static char *UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200211 "op",
212 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000213};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000214static PyTypeObject *Lambda_type;
215static char *Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200216 "args",
217 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000218};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000219static PyTypeObject *IfExp_type;
220static char *IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200221 "test",
222 "body",
223 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000224};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000225static PyTypeObject *Dict_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200226_Py_IDENTIFIER(keys);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000227static char *Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200228 "keys",
229 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000230};
Guido van Rossum86e58e22006-08-28 15:27:34 +0000231static PyTypeObject *Set_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200232_Py_IDENTIFIER(elts);
Guido van Rossum86e58e22006-08-28 15:27:34 +0000233static char *Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200234 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000235};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000236static PyTypeObject *ListComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200237_Py_IDENTIFIER(elt);
238_Py_IDENTIFIER(generators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000239static char *ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200240 "elt",
241 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000242};
Nick Coghlan650f0d02007-04-15 12:05:43 +0000243static PyTypeObject *SetComp_type;
244static char *SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200245 "elt",
246 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000247};
Guido van Rossum992d4a32007-07-11 13:09:30 +0000248static PyTypeObject *DictComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200249_Py_IDENTIFIER(key);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000250static char *DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200251 "key",
252 "value",
253 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000254};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000255static PyTypeObject *GeneratorExp_type;
256static char *GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200257 "elt",
258 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000259};
Yury Selivanov75445082015-05-11 22:57:16 -0400260static PyTypeObject *Await_type;
261static char *Await_fields[]={
262 "value",
263};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000264static PyTypeObject *Yield_type;
265static char *Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200266 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500267};
268static PyTypeObject *YieldFrom_type;
269static char *YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200270 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000271};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000272static PyTypeObject *Compare_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200273_Py_IDENTIFIER(ops);
274_Py_IDENTIFIER(comparators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000275static char *Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200276 "left",
277 "ops",
278 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000279};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000280static PyTypeObject *Call_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200281_Py_IDENTIFIER(func);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000282static char *Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200283 "func",
284 "args",
285 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000286};
Eric V. Smith235a6f02015-09-19 14:51:32 -0400287static PyTypeObject *FormattedValue_type;
288_Py_IDENTIFIER(conversion);
289_Py_IDENTIFIER(format_spec);
290static char *FormattedValue_fields[]={
291 "value",
292 "conversion",
293 "format_spec",
294};
295static PyTypeObject *JoinedStr_type;
296static char *JoinedStr_fields[]={
297 "values",
298};
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100299static PyTypeObject *Constant_type;
300static char *Constant_fields[]={
301 "value",
302};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000303static PyTypeObject *Attribute_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200304_Py_IDENTIFIER(attr);
305_Py_IDENTIFIER(ctx);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000306static char *Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200307 "value",
308 "attr",
309 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000310};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000311static PyTypeObject *Subscript_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200312_Py_IDENTIFIER(slice);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000313static char *Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200314 "value",
315 "slice",
316 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000317};
Guido van Rossum0368b722007-05-11 16:50:42 +0000318static PyTypeObject *Starred_type;
319static char *Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200320 "value",
321 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000322};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000323static PyTypeObject *Name_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200324_Py_IDENTIFIER(id);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000325static char *Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200326 "id",
327 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000328};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000329static PyTypeObject *List_type;
330static char *List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200331 "elts",
332 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000333};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000334static PyTypeObject *Tuple_type;
335static char *Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200336 "elts",
337 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000338};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000339static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000340static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
341*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
342static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000343static PyTypeObject *Load_type;
344static PyTypeObject *Store_type;
345static PyTypeObject *Del_type;
346static PyTypeObject *AugLoad_type;
347static PyTypeObject *AugStore_type;
348static PyTypeObject *Param_type;
349static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000350static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000351static PyTypeObject *Slice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200352_Py_IDENTIFIER(lower);
353_Py_IDENTIFIER(upper);
354_Py_IDENTIFIER(step);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000355static char *Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200356 "lower",
357 "upper",
358 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000359};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000360static PyTypeObject *ExtSlice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200361_Py_IDENTIFIER(dims);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000362static char *ExtSlice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200363 "dims",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000364};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000365static PyTypeObject *Index_type;
366static char *Index_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200367 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000368};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000369static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000370static PyObject *And_singleton, *Or_singleton;
371static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000372static PyTypeObject *And_type;
373static PyTypeObject *Or_type;
374static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000375static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
Benjamin Petersond51374e2014-04-09 23:55:56 -0400376*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton,
377*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton,
378*BitAnd_singleton, *FloorDiv_singleton;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000379static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000380static PyTypeObject *Add_type;
381static PyTypeObject *Sub_type;
382static PyTypeObject *Mult_type;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400383static PyTypeObject *MatMult_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000384static PyTypeObject *Div_type;
385static PyTypeObject *Mod_type;
386static PyTypeObject *Pow_type;
387static PyTypeObject *LShift_type;
388static PyTypeObject *RShift_type;
389static PyTypeObject *BitOr_type;
390static PyTypeObject *BitXor_type;
391static PyTypeObject *BitAnd_type;
392static PyTypeObject *FloorDiv_type;
393static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000394static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
395*USub_singleton;
396static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000397static PyTypeObject *Invert_type;
398static PyTypeObject *Not_type;
399static PyTypeObject *UAdd_type;
400static PyTypeObject *USub_type;
401static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000402static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
403*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
404*NotIn_singleton;
405static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000406static PyTypeObject *Eq_type;
407static PyTypeObject *NotEq_type;
408static PyTypeObject *Lt_type;
409static PyTypeObject *LtE_type;
410static PyTypeObject *Gt_type;
411static PyTypeObject *GtE_type;
412static PyTypeObject *Is_type;
413static PyTypeObject *IsNot_type;
414static PyTypeObject *In_type;
415static PyTypeObject *NotIn_type;
416static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000417static PyObject* ast2obj_comprehension(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200418_Py_IDENTIFIER(ifs);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700419_Py_IDENTIFIER(is_async);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000420static char *comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200421 "target",
422 "iter",
423 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700424 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000425};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000426static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000427static char *excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200428 "lineno",
429 "col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000430};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000431static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000432static PyTypeObject *ExceptHandler_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200433_Py_IDENTIFIER(type);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000434static char *ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200435 "type",
436 "name",
437 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000438};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000439static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000440static PyObject* ast2obj_arguments(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200441_Py_IDENTIFIER(vararg);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200442_Py_IDENTIFIER(kwonlyargs);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200443_Py_IDENTIFIER(kw_defaults);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700444_Py_IDENTIFIER(kwarg);
445_Py_IDENTIFIER(defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000446static char *arguments_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200447 "args",
448 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200449 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200450 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200451 "kwarg",
452 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000453};
Neal Norwitzc1505362006-12-28 06:47:50 +0000454static PyTypeObject *arg_type;
455static PyObject* ast2obj_arg(void*);
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700456static char *arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200457 "lineno",
458 "col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700459};
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200460_Py_IDENTIFIER(arg);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000461static char *arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200462 "arg",
463 "annotation",
Neal Norwitzc1505362006-12-28 06:47:50 +0000464};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000465static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000466static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000467static char *keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200468 "arg",
469 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000470};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000471static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000472static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200473_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000474static char *alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200475 "name",
476 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000477};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500478static PyTypeObject *withitem_type;
479static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200480_Py_IDENTIFIER(context_expr);
481_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500482static char *withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200483 "context_expr",
484 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500485};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000486
487
INADA Naokifc489082017-01-25 22:33:43 +0900488_Py_IDENTIFIER(_fields);
489_Py_IDENTIFIER(_attributes);
490
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700491typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100492 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700493 PyObject *dict;
494} AST_object;
495
Benjamin Peterson1767e022012-03-14 21:50:29 -0500496static void
497ast_dealloc(AST_object *self)
498{
INADA Naokia6296d32017-08-24 14:55:17 +0900499 /* bpo-31095: UnTrack is needed before calling any callbacks */
500 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500501 Py_CLEAR(self->dict);
Antoine Pitrou50750742012-07-08 12:43:32 +0200502 Py_TYPE(self)->tp_free(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500503}
504
Neal Norwitz207c9f32008-03-31 04:42:11 +0000505static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700506ast_traverse(AST_object *self, visitproc visit, void *arg)
507{
508 Py_VISIT(self->dict);
509 return 0;
510}
511
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300512static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700513ast_clear(AST_object *self)
514{
515 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300516 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700517}
518
519static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000520ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
521{
522 Py_ssize_t i, numfields = 0;
523 int res = -1;
524 PyObject *key, *value, *fields;
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200525 if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) {
526 goto cleanup;
527 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000528 if (fields) {
529 numfields = PySequence_Size(fields);
530 if (numfields == -1)
531 goto cleanup;
532 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900533
Neal Norwitz207c9f32008-03-31 04:42:11 +0000534 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900535 if (numfields < PyTuple_GET_SIZE(args)) {
536 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
537 "%zd positional argument%s",
538 Py_TYPE(self)->tp_name,
539 numfields, numfields == 1 ? "" : "s");
540 res = -1;
541 goto cleanup;
542 }
543 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
544 /* cannot be reached when fields is NULL */
545 PyObject *name = PySequence_GetItem(fields, i);
546 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000547 res = -1;
548 goto cleanup;
549 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900550 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
551 Py_DECREF(name);
552 if (res < 0)
553 goto cleanup;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000554 }
555 if (kw) {
556 i = 0; /* needed by PyDict_Next */
557 while (PyDict_Next(kw, &i, &key, &value)) {
558 res = PyObject_SetAttr(self, key, value);
559 if (res < 0)
560 goto cleanup;
561 }
562 }
563 cleanup:
564 Py_XDECREF(fields);
565 return res;
566}
567
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000568/* Pickling support */
569static PyObject *
570ast_type_reduce(PyObject *self, PyObject *unused)
571{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200572 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200573 PyObject *dict;
574 if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) {
575 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000576 }
577 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200578 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000579 }
580 return Py_BuildValue("O()", Py_TYPE(self));
581}
582
583static PyMethodDef ast_type_methods[] = {
584 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
585 {NULL}
586};
587
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700588static PyGetSetDef ast_type_getsets[] = {
589 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
590 {NULL}
591};
592
Neal Norwitz207c9f32008-03-31 04:42:11 +0000593static PyTypeObject AST_type = {
594 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000595 "_ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700596 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000597 0,
Benjamin Peterson1767e022012-03-14 21:50:29 -0500598 (destructor)ast_dealloc, /* tp_dealloc */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000599 0, /* tp_print */
600 0, /* tp_getattr */
601 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000602 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000603 0, /* tp_repr */
604 0, /* tp_as_number */
605 0, /* tp_as_sequence */
606 0, /* tp_as_mapping */
607 0, /* tp_hash */
608 0, /* tp_call */
609 0, /* tp_str */
610 PyObject_GenericGetAttr, /* tp_getattro */
611 PyObject_GenericSetAttr, /* tp_setattro */
612 0, /* tp_as_buffer */
Benjamin Peterson81071762012-07-08 11:03:46 -0700613 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000614 0, /* tp_doc */
Benjamin Peterson81071762012-07-08 11:03:46 -0700615 (traverseproc)ast_traverse, /* tp_traverse */
616 (inquiry)ast_clear, /* tp_clear */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000617 0, /* tp_richcompare */
618 0, /* tp_weaklistoffset */
619 0, /* tp_iter */
620 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000621 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000622 0, /* tp_members */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700623 ast_type_getsets, /* tp_getset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000624 0, /* tp_base */
625 0, /* tp_dict */
626 0, /* tp_descr_get */
627 0, /* tp_descr_set */
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700628 offsetof(AST_object, dict),/* tp_dictoffset */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000629 (initproc)ast_type_init, /* tp_init */
630 PyType_GenericAlloc, /* tp_alloc */
631 PyType_GenericNew, /* tp_new */
Benjamin Peterson81071762012-07-08 11:03:46 -0700632 PyObject_GC_Del, /* tp_free */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000633};
634
635
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000636static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
637{
INADA Naokifc489082017-01-25 22:33:43 +0900638 _Py_IDENTIFIER(__module__);
639 _Py_IDENTIFIER(_ast);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000640 PyObject *fnames, *result;
641 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000642 fnames = PyTuple_New(num_fields);
643 if (!fnames) return NULL;
644 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000645 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000646 if (!field) {
647 Py_DECREF(fnames);
648 return NULL;
649 }
650 PyTuple_SET_ITEM(fnames, i, field);
651 }
INADA Naokifc489082017-01-25 22:33:43 +0900652 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}",
653 type, base,
654 _PyUnicode_FromId(&PyId__fields), fnames,
655 _PyUnicode_FromId(&PyId___module__),
656 _PyUnicode_FromId(&PyId__ast));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000657 Py_DECREF(fnames);
658 return (PyTypeObject*)result;
659}
660
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000661static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
662{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000663 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000664 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000665 if (!l)
666 return 0;
667 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000668 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000669 if (!s) {
670 Py_DECREF(l);
671 return 0;
672 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000673 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000674 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +0200675 result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000676 Py_DECREF(l);
677 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000678}
679
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000680/* Conversion AST -> Python */
681
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000682static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
683{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700684 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000685 PyObject *result = PyList_New(n);
686 PyObject *value;
687 if (!result)
688 return NULL;
689 for (i = 0; i < n; i++) {
690 value = func(asdl_seq_GET(seq, i));
691 if (!value) {
692 Py_DECREF(result);
693 return NULL;
694 }
695 PyList_SET_ITEM(result, i, value);
696 }
697 return result;
698}
699
700static PyObject* ast2obj_object(void *o)
701{
702 if (!o)
703 o = Py_None;
704 Py_INCREF((PyObject*)o);
705 return (PyObject*)o;
706}
Benjamin Peterson442f2092012-12-06 17:41:04 -0500707#define ast2obj_singleton ast2obj_object
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100708#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000709#define ast2obj_identifier ast2obj_object
710#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500711#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000712
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000713static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000714{
Christian Heimes217cfd12007-12-02 14:31:20 +0000715 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000716}
717
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000718/* Conversion Python -> AST */
719
720static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
721{
722 if (obj == Py_None)
723 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200724 if (obj) {
725 if (PyArena_AddPyObject(arena, obj) < 0) {
726 *out = NULL;
727 return -1;
728 }
729 Py_INCREF(obj);
730 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000731 *out = obj;
732 return 0;
733}
734
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100735static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena)
736{
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300737 if (PyArena_AddPyObject(arena, obj) < 0) {
738 *out = NULL;
739 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100740 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300741 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100742 *out = obj;
743 return 0;
744}
745
Benjamin Peterson180e6352011-07-22 11:09:07 -0500746static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500747{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500748 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
749 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500750 return 1;
751 }
752 return obj2ast_object(obj, out, arena);
753}
754
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000755static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
756{
757 int i;
758 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100759 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000760 return 1;
761 }
762
Serhiy Storchaka56f6e762015-09-06 21:25:30 +0300763 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000764 if (i == -1 && PyErr_Occurred())
765 return 1;
766 *out = i;
767 return 0;
768}
769
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000770static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000771{
772 PyObject *empty_tuple, *d;
773 if (PyType_Ready(&AST_type) < 0)
774 return -1;
775 d = AST_type.tp_dict;
776 empty_tuple = PyTuple_New(0);
777 if (!empty_tuple ||
INADA Naokifc489082017-01-25 22:33:43 +0900778 _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 ||
779 _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +0000780 Py_XDECREF(empty_tuple);
781 return -1;
782 }
783 Py_DECREF(empty_tuple);
784 return 0;
785}
786
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000787
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000788static int init_types(void)
789{
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200790 static int initialized;
791 if (initialized) return 1;
792 if (add_ast_fields() < 0) return 0;
793 mod_type = make_type("mod", &AST_type, NULL, 0);
794 if (!mod_type) return 0;
795 if (!add_attributes(mod_type, NULL, 0)) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300796 Module_type = make_type("Module", mod_type, Module_fields, 1);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200797 if (!Module_type) return 0;
798 Interactive_type = make_type("Interactive", mod_type, Interactive_fields,
799 1);
800 if (!Interactive_type) return 0;
801 Expression_type = make_type("Expression", mod_type, Expression_fields, 1);
802 if (!Expression_type) return 0;
803 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
804 if (!Suite_type) return 0;
805 stmt_type = make_type("stmt", &AST_type, NULL, 0);
806 if (!stmt_type) return 0;
807 if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
808 FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300809 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200810 if (!FunctionDef_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400811 AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300812 AsyncFunctionDef_fields, 5);
Yury Selivanov75445082015-05-11 22:57:16 -0400813 if (!AsyncFunctionDef_type) return 0;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300814 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200815 if (!ClassDef_type) return 0;
816 Return_type = make_type("Return", stmt_type, Return_fields, 1);
817 if (!Return_type) return 0;
818 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
819 if (!Delete_type) return 0;
820 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
821 if (!Assign_type) return 0;
822 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
823 if (!AugAssign_type) return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700824 AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4);
825 if (!AnnAssign_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200826 For_type = make_type("For", stmt_type, For_fields, 4);
827 if (!For_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400828 AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4);
829 if (!AsyncFor_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200830 While_type = make_type("While", stmt_type, While_fields, 3);
831 if (!While_type) return 0;
832 If_type = make_type("If", stmt_type, If_fields, 3);
833 if (!If_type) return 0;
834 With_type = make_type("With", stmt_type, With_fields, 2);
835 if (!With_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400836 AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 2);
837 if (!AsyncWith_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200838 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
839 if (!Raise_type) return 0;
840 Try_type = make_type("Try", stmt_type, Try_fields, 4);
841 if (!Try_type) return 0;
842 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
843 if (!Assert_type) return 0;
844 Import_type = make_type("Import", stmt_type, Import_fields, 1);
845 if (!Import_type) return 0;
846 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3);
847 if (!ImportFrom_type) return 0;
848 Global_type = make_type("Global", stmt_type, Global_fields, 1);
849 if (!Global_type) return 0;
850 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
851 if (!Nonlocal_type) return 0;
852 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
853 if (!Expr_type) return 0;
854 Pass_type = make_type("Pass", stmt_type, NULL, 0);
855 if (!Pass_type) return 0;
856 Break_type = make_type("Break", stmt_type, NULL, 0);
857 if (!Break_type) return 0;
858 Continue_type = make_type("Continue", stmt_type, NULL, 0);
859 if (!Continue_type) return 0;
860 expr_type = make_type("expr", &AST_type, NULL, 0);
861 if (!expr_type) return 0;
862 if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
863 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
864 if (!BoolOp_type) return 0;
865 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
866 if (!BinOp_type) return 0;
867 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
868 if (!UnaryOp_type) return 0;
869 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
870 if (!Lambda_type) return 0;
871 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
872 if (!IfExp_type) return 0;
873 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
874 if (!Dict_type) return 0;
875 Set_type = make_type("Set", expr_type, Set_fields, 1);
876 if (!Set_type) return 0;
877 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
878 if (!ListComp_type) return 0;
879 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
880 if (!SetComp_type) return 0;
881 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
882 if (!DictComp_type) return 0;
883 GeneratorExp_type = make_type("GeneratorExp", expr_type,
884 GeneratorExp_fields, 2);
885 if (!GeneratorExp_type) return 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400886 Await_type = make_type("Await", expr_type, Await_fields, 1);
887 if (!Await_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200888 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
889 if (!Yield_type) return 0;
890 YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
891 if (!YieldFrom_type) return 0;
892 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
893 if (!Compare_type) return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400894 Call_type = make_type("Call", expr_type, Call_fields, 3);
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200895 if (!Call_type) return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -0400896 FormattedValue_type = make_type("FormattedValue", expr_type,
897 FormattedValue_fields, 3);
898 if (!FormattedValue_type) return 0;
899 JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1);
900 if (!JoinedStr_type) return 0;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100901 Constant_type = make_type("Constant", expr_type, Constant_fields, 1);
902 if (!Constant_type) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200903 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
904 if (!Attribute_type) return 0;
905 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
906 if (!Subscript_type) return 0;
907 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
908 if (!Starred_type) return 0;
909 Name_type = make_type("Name", expr_type, Name_fields, 2);
910 if (!Name_type) return 0;
911 List_type = make_type("List", expr_type, List_fields, 2);
912 if (!List_type) return 0;
913 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
914 if (!Tuple_type) return 0;
915 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
916 if (!expr_context_type) return 0;
917 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
918 Load_type = make_type("Load", expr_context_type, NULL, 0);
919 if (!Load_type) return 0;
920 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
921 if (!Load_singleton) return 0;
922 Store_type = make_type("Store", expr_context_type, NULL, 0);
923 if (!Store_type) return 0;
924 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
925 if (!Store_singleton) return 0;
926 Del_type = make_type("Del", expr_context_type, NULL, 0);
927 if (!Del_type) return 0;
928 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
929 if (!Del_singleton) return 0;
930 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
931 if (!AugLoad_type) return 0;
932 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
933 if (!AugLoad_singleton) return 0;
934 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
935 if (!AugStore_type) return 0;
936 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
937 if (!AugStore_singleton) return 0;
938 Param_type = make_type("Param", expr_context_type, NULL, 0);
939 if (!Param_type) return 0;
940 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
941 if (!Param_singleton) return 0;
942 slice_type = make_type("slice", &AST_type, NULL, 0);
943 if (!slice_type) return 0;
944 if (!add_attributes(slice_type, NULL, 0)) return 0;
945 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
946 if (!Slice_type) return 0;
947 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
948 if (!ExtSlice_type) return 0;
949 Index_type = make_type("Index", slice_type, Index_fields, 1);
950 if (!Index_type) return 0;
951 boolop_type = make_type("boolop", &AST_type, NULL, 0);
952 if (!boolop_type) return 0;
953 if (!add_attributes(boolop_type, NULL, 0)) return 0;
954 And_type = make_type("And", boolop_type, NULL, 0);
955 if (!And_type) return 0;
956 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
957 if (!And_singleton) return 0;
958 Or_type = make_type("Or", boolop_type, NULL, 0);
959 if (!Or_type) return 0;
960 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
961 if (!Or_singleton) return 0;
962 operator_type = make_type("operator", &AST_type, NULL, 0);
963 if (!operator_type) return 0;
964 if (!add_attributes(operator_type, NULL, 0)) return 0;
965 Add_type = make_type("Add", operator_type, NULL, 0);
966 if (!Add_type) return 0;
967 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
968 if (!Add_singleton) return 0;
969 Sub_type = make_type("Sub", operator_type, NULL, 0);
970 if (!Sub_type) return 0;
971 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
972 if (!Sub_singleton) return 0;
973 Mult_type = make_type("Mult", operator_type, NULL, 0);
974 if (!Mult_type) return 0;
975 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
976 if (!Mult_singleton) return 0;
Benjamin Petersond51374e2014-04-09 23:55:56 -0400977 MatMult_type = make_type("MatMult", operator_type, NULL, 0);
978 if (!MatMult_type) return 0;
979 MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL);
980 if (!MatMult_singleton) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200981 Div_type = make_type("Div", operator_type, NULL, 0);
982 if (!Div_type) return 0;
983 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
984 if (!Div_singleton) return 0;
985 Mod_type = make_type("Mod", operator_type, NULL, 0);
986 if (!Mod_type) return 0;
987 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
988 if (!Mod_singleton) return 0;
989 Pow_type = make_type("Pow", operator_type, NULL, 0);
990 if (!Pow_type) return 0;
991 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
992 if (!Pow_singleton) return 0;
993 LShift_type = make_type("LShift", operator_type, NULL, 0);
994 if (!LShift_type) return 0;
995 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
996 if (!LShift_singleton) return 0;
997 RShift_type = make_type("RShift", operator_type, NULL, 0);
998 if (!RShift_type) return 0;
999 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
1000 if (!RShift_singleton) return 0;
1001 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
1002 if (!BitOr_type) return 0;
1003 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
1004 if (!BitOr_singleton) return 0;
1005 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
1006 if (!BitXor_type) return 0;
1007 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
1008 if (!BitXor_singleton) return 0;
1009 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
1010 if (!BitAnd_type) return 0;
1011 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
1012 if (!BitAnd_singleton) return 0;
1013 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
1014 if (!FloorDiv_type) return 0;
1015 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
1016 if (!FloorDiv_singleton) return 0;
1017 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
1018 if (!unaryop_type) return 0;
1019 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
1020 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
1021 if (!Invert_type) return 0;
1022 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
1023 if (!Invert_singleton) return 0;
1024 Not_type = make_type("Not", unaryop_type, NULL, 0);
1025 if (!Not_type) return 0;
1026 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
1027 if (!Not_singleton) return 0;
1028 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
1029 if (!UAdd_type) return 0;
1030 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
1031 if (!UAdd_singleton) return 0;
1032 USub_type = make_type("USub", unaryop_type, NULL, 0);
1033 if (!USub_type) return 0;
1034 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
1035 if (!USub_singleton) return 0;
1036 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
1037 if (!cmpop_type) return 0;
1038 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
1039 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
1040 if (!Eq_type) return 0;
1041 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
1042 if (!Eq_singleton) return 0;
1043 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
1044 if (!NotEq_type) return 0;
1045 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
1046 if (!NotEq_singleton) return 0;
1047 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
1048 if (!Lt_type) return 0;
1049 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
1050 if (!Lt_singleton) return 0;
1051 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
1052 if (!LtE_type) return 0;
1053 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
1054 if (!LtE_singleton) return 0;
1055 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
1056 if (!Gt_type) return 0;
1057 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
1058 if (!Gt_singleton) return 0;
1059 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
1060 if (!GtE_type) return 0;
1061 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
1062 if (!GtE_singleton) return 0;
1063 Is_type = make_type("Is", cmpop_type, NULL, 0);
1064 if (!Is_type) return 0;
1065 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
1066 if (!Is_singleton) return 0;
1067 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
1068 if (!IsNot_type) return 0;
1069 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
1070 if (!IsNot_singleton) return 0;
1071 In_type = make_type("In", cmpop_type, NULL, 0);
1072 if (!In_type) return 0;
1073 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
1074 if (!In_singleton) return 0;
1075 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
1076 if (!NotIn_type) return 0;
1077 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
1078 if (!NotIn_singleton) return 0;
1079 comprehension_type = make_type("comprehension", &AST_type,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001080 comprehension_fields, 4);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001081 if (!comprehension_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001082 if (!add_attributes(comprehension_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001083 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
1084 if (!excepthandler_type) return 0;
1085 if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
1086 return 0;
1087 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1088 ExceptHandler_fields, 3);
1089 if (!ExceptHandler_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001090 arguments_type = make_type("arguments", &AST_type, arguments_fields, 6);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001091 if (!arguments_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001092 if (!add_attributes(arguments_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001093 arg_type = make_type("arg", &AST_type, arg_fields, 2);
1094 if (!arg_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001095 if (!add_attributes(arg_type, arg_attributes, 2)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001096 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
1097 if (!keyword_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001098 if (!add_attributes(keyword_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001099 alias_type = make_type("alias", &AST_type, alias_fields, 2);
1100 if (!alias_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001101 if (!add_attributes(alias_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001102 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1103 if (!withitem_type) return 0;
Victor Stinneree4b59c2013-07-27 00:01:35 +02001104 if (!add_attributes(withitem_type, NULL, 0)) return 0;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001105 initialized = 1;
1106 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001107}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001108
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001109static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1110static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1111static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1112static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1113 arena);
1114static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1115static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1116static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1117static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1118static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1119static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1120 arena);
1121static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1122 arena);
1123static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1124static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1125static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1126static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001127static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001128
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129mod_ty
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001130Module(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001132 mod_ty p;
1133 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1134 if (!p)
1135 return NULL;
1136 p->kind = Module_kind;
1137 p->v.Module.body = body;
1138 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139}
1140
1141mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001142Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001144 mod_ty p;
1145 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1146 if (!p)
1147 return NULL;
1148 p->kind = Interactive_kind;
1149 p->v.Interactive.body = body;
1150 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151}
1152
1153mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001154Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001156 mod_ty p;
1157 if (!body) {
1158 PyErr_SetString(PyExc_ValueError,
1159 "field body is required for Expression");
1160 return NULL;
1161 }
1162 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1163 if (!p)
1164 return NULL;
1165 p->kind = Expression_kind;
1166 p->v.Expression.body = body;
1167 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168}
1169
1170mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001171Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001173 mod_ty p;
1174 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1175 if (!p)
1176 return NULL;
1177 p->kind = Suite_kind;
1178 p->v.Suite.body = body;
1179 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180}
1181
1182stmt_ty
1183FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001184 decorator_list, expr_ty returns, int lineno, int col_offset,
1185 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001187 stmt_ty p;
1188 if (!name) {
1189 PyErr_SetString(PyExc_ValueError,
1190 "field name is required for FunctionDef");
1191 return NULL;
1192 }
1193 if (!args) {
1194 PyErr_SetString(PyExc_ValueError,
1195 "field args is required for FunctionDef");
1196 return NULL;
1197 }
1198 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1199 if (!p)
1200 return NULL;
1201 p->kind = FunctionDef_kind;
1202 p->v.FunctionDef.name = name;
1203 p->v.FunctionDef.args = args;
1204 p->v.FunctionDef.body = body;
1205 p->v.FunctionDef.decorator_list = decorator_list;
1206 p->v.FunctionDef.returns = returns;
1207 p->lineno = lineno;
1208 p->col_offset = col_offset;
1209 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210}
1211
1212stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001213AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001214 * decorator_list, expr_ty returns, int lineno, int col_offset,
1215 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001216{
1217 stmt_ty p;
1218 if (!name) {
1219 PyErr_SetString(PyExc_ValueError,
1220 "field name is required for AsyncFunctionDef");
1221 return NULL;
1222 }
1223 if (!args) {
1224 PyErr_SetString(PyExc_ValueError,
1225 "field args is required for AsyncFunctionDef");
1226 return NULL;
1227 }
1228 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1229 if (!p)
1230 return NULL;
1231 p->kind = AsyncFunctionDef_kind;
1232 p->v.AsyncFunctionDef.name = name;
1233 p->v.AsyncFunctionDef.args = args;
1234 p->v.AsyncFunctionDef.body = body;
1235 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1236 p->v.AsyncFunctionDef.returns = returns;
1237 p->lineno = lineno;
1238 p->col_offset = col_offset;
1239 return p;
1240}
1241
1242stmt_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001243ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq *
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001244 body, asdl_seq * decorator_list, int lineno, int col_offset, PyArena
1245 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001247 stmt_ty p;
1248 if (!name) {
1249 PyErr_SetString(PyExc_ValueError,
1250 "field name is required for ClassDef");
1251 return NULL;
1252 }
1253 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1254 if (!p)
1255 return NULL;
1256 p->kind = ClassDef_kind;
1257 p->v.ClassDef.name = name;
1258 p->v.ClassDef.bases = bases;
1259 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001260 p->v.ClassDef.body = body;
1261 p->v.ClassDef.decorator_list = decorator_list;
1262 p->lineno = lineno;
1263 p->col_offset = col_offset;
1264 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265}
1266
1267stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001268Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001270 stmt_ty p;
1271 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1272 if (!p)
1273 return NULL;
1274 p->kind = Return_kind;
1275 p->v.Return.value = value;
1276 p->lineno = lineno;
1277 p->col_offset = col_offset;
1278 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279}
1280
1281stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001282Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001284 stmt_ty p;
1285 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1286 if (!p)
1287 return NULL;
1288 p->kind = Delete_kind;
1289 p->v.Delete.targets = targets;
1290 p->lineno = lineno;
1291 p->col_offset = col_offset;
1292 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293}
1294
1295stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001296Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1297 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001298{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001299 stmt_ty p;
1300 if (!value) {
1301 PyErr_SetString(PyExc_ValueError,
1302 "field value is required for Assign");
1303 return NULL;
1304 }
1305 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1306 if (!p)
1307 return NULL;
1308 p->kind = Assign_kind;
1309 p->v.Assign.targets = targets;
1310 p->v.Assign.value = value;
1311 p->lineno = lineno;
1312 p->col_offset = col_offset;
1313 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314}
1315
1316stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001317AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1318 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001320 stmt_ty p;
1321 if (!target) {
1322 PyErr_SetString(PyExc_ValueError,
1323 "field target is required for AugAssign");
1324 return NULL;
1325 }
1326 if (!op) {
1327 PyErr_SetString(PyExc_ValueError,
1328 "field op is required for AugAssign");
1329 return NULL;
1330 }
1331 if (!value) {
1332 PyErr_SetString(PyExc_ValueError,
1333 "field value is required for AugAssign");
1334 return NULL;
1335 }
1336 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1337 if (!p)
1338 return NULL;
1339 p->kind = AugAssign_kind;
1340 p->v.AugAssign.target = target;
1341 p->v.AugAssign.op = op;
1342 p->v.AugAssign.value = value;
1343 p->lineno = lineno;
1344 p->col_offset = col_offset;
1345 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346}
1347
1348stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001349AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
1350 lineno, int col_offset, PyArena *arena)
1351{
1352 stmt_ty p;
1353 if (!target) {
1354 PyErr_SetString(PyExc_ValueError,
1355 "field target is required for AnnAssign");
1356 return NULL;
1357 }
1358 if (!annotation) {
1359 PyErr_SetString(PyExc_ValueError,
1360 "field annotation is required for AnnAssign");
1361 return NULL;
1362 }
1363 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1364 if (!p)
1365 return NULL;
1366 p->kind = AnnAssign_kind;
1367 p->v.AnnAssign.target = target;
1368 p->v.AnnAssign.annotation = annotation;
1369 p->v.AnnAssign.value = value;
1370 p->v.AnnAssign.simple = simple;
1371 p->lineno = lineno;
1372 p->col_offset = col_offset;
1373 return p;
1374}
1375
1376stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001378 lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001380 stmt_ty p;
1381 if (!target) {
1382 PyErr_SetString(PyExc_ValueError,
1383 "field target is required for For");
1384 return NULL;
1385 }
1386 if (!iter) {
1387 PyErr_SetString(PyExc_ValueError,
1388 "field iter is required for For");
1389 return NULL;
1390 }
1391 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1392 if (!p)
1393 return NULL;
1394 p->kind = For_kind;
1395 p->v.For.target = target;
1396 p->v.For.iter = iter;
1397 p->v.For.body = body;
1398 p->v.For.orelse = orelse;
1399 p->lineno = lineno;
1400 p->col_offset = col_offset;
1401 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402}
1403
1404stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001405AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
1406 lineno, int col_offset, PyArena *arena)
1407{
1408 stmt_ty p;
1409 if (!target) {
1410 PyErr_SetString(PyExc_ValueError,
1411 "field target is required for AsyncFor");
1412 return NULL;
1413 }
1414 if (!iter) {
1415 PyErr_SetString(PyExc_ValueError,
1416 "field iter is required for AsyncFor");
1417 return NULL;
1418 }
1419 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1420 if (!p)
1421 return NULL;
1422 p->kind = AsyncFor_kind;
1423 p->v.AsyncFor.target = target;
1424 p->v.AsyncFor.iter = iter;
1425 p->v.AsyncFor.body = body;
1426 p->v.AsyncFor.orelse = orelse;
1427 p->lineno = lineno;
1428 p->col_offset = col_offset;
1429 return p;
1430}
1431
1432stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001433While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1434 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001436 stmt_ty p;
1437 if (!test) {
1438 PyErr_SetString(PyExc_ValueError,
1439 "field test is required for While");
1440 return NULL;
1441 }
1442 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1443 if (!p)
1444 return NULL;
1445 p->kind = While_kind;
1446 p->v.While.test = test;
1447 p->v.While.body = body;
1448 p->v.While.orelse = orelse;
1449 p->lineno = lineno;
1450 p->col_offset = col_offset;
1451 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452}
1453
1454stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001455If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1456 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001458 stmt_ty p;
1459 if (!test) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "field test is required for If");
1462 return NULL;
1463 }
1464 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1465 if (!p)
1466 return NULL;
1467 p->kind = If_kind;
1468 p->v.If.test = test;
1469 p->v.If.body = body;
1470 p->v.If.orelse = orelse;
1471 p->lineno = lineno;
1472 p->col_offset = col_offset;
1473 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474}
1475
1476stmt_ty
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001477With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
1478 *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001479{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001480 stmt_ty p;
1481 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1482 if (!p)
1483 return NULL;
1484 p->kind = With_kind;
1485 p->v.With.items = items;
1486 p->v.With.body = body;
1487 p->lineno = lineno;
1488 p->col_offset = col_offset;
1489 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001490}
1491
1492stmt_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001493AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset,
1494 PyArena *arena)
1495{
1496 stmt_ty p;
1497 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1498 if (!p)
1499 return NULL;
1500 p->kind = AsyncWith_kind;
1501 p->v.AsyncWith.items = items;
1502 p->v.AsyncWith.body = body;
1503 p->lineno = lineno;
1504 p->col_offset = col_offset;
1505 return p;
1506}
1507
1508stmt_ty
Collin Winter828f04a2007-08-31 00:04:24 +00001509Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001511 stmt_ty p;
1512 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1513 if (!p)
1514 return NULL;
1515 p->kind = Raise_kind;
1516 p->v.Raise.exc = exc;
1517 p->v.Raise.cause = cause;
1518 p->lineno = lineno;
1519 p->col_offset = col_offset;
1520 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521}
1522
1523stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001524Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
1525 finalbody, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001527 stmt_ty p;
1528 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1529 if (!p)
1530 return NULL;
1531 p->kind = Try_kind;
1532 p->v.Try.body = body;
1533 p->v.Try.handlers = handlers;
1534 p->v.Try.orelse = orelse;
1535 p->v.Try.finalbody = finalbody;
1536 p->lineno = lineno;
1537 p->col_offset = col_offset;
1538 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539}
1540
1541stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001542Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001544 stmt_ty p;
1545 if (!test) {
1546 PyErr_SetString(PyExc_ValueError,
1547 "field test is required for Assert");
1548 return NULL;
1549 }
1550 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1551 if (!p)
1552 return NULL;
1553 p->kind = Assert_kind;
1554 p->v.Assert.test = test;
1555 p->v.Assert.msg = msg;
1556 p->lineno = lineno;
1557 p->col_offset = col_offset;
1558 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559}
1560
1561stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001562Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001563{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001564 stmt_ty p;
1565 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1566 if (!p)
1567 return NULL;
1568 p->kind = Import_kind;
1569 p->v.Import.names = names;
1570 p->lineno = lineno;
1571 p->col_offset = col_offset;
1572 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573}
1574
1575stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001576ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1577 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001579 stmt_ty p;
1580 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1581 if (!p)
1582 return NULL;
1583 p->kind = ImportFrom_kind;
1584 p->v.ImportFrom.module = module;
1585 p->v.ImportFrom.names = names;
1586 p->v.ImportFrom.level = level;
1587 p->lineno = lineno;
1588 p->col_offset = col_offset;
1589 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590}
1591
1592stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001593Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001594{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001595 stmt_ty p;
1596 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1597 if (!p)
1598 return NULL;
1599 p->kind = Global_kind;
1600 p->v.Global.names = names;
1601 p->lineno = lineno;
1602 p->col_offset = col_offset;
1603 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604}
1605
1606stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00001607Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1608{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001609 stmt_ty p;
1610 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1611 if (!p)
1612 return NULL;
1613 p->kind = Nonlocal_kind;
1614 p->v.Nonlocal.names = names;
1615 p->lineno = lineno;
1616 p->col_offset = col_offset;
1617 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00001618}
1619
1620stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001621Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001622{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001623 stmt_ty p;
1624 if (!value) {
1625 PyErr_SetString(PyExc_ValueError,
1626 "field value is required for Expr");
1627 return NULL;
1628 }
1629 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1630 if (!p)
1631 return NULL;
1632 p->kind = Expr_kind;
1633 p->v.Expr.value = value;
1634 p->lineno = lineno;
1635 p->col_offset = col_offset;
1636 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001637}
1638
1639stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001640Pass(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001641{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001642 stmt_ty p;
1643 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1644 if (!p)
1645 return NULL;
1646 p->kind = Pass_kind;
1647 p->lineno = lineno;
1648 p->col_offset = col_offset;
1649 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001650}
1651
1652stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001653Break(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001654{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001655 stmt_ty p;
1656 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1657 if (!p)
1658 return NULL;
1659 p->kind = Break_kind;
1660 p->lineno = lineno;
1661 p->col_offset = col_offset;
1662 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663}
1664
1665stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001666Continue(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001668 stmt_ty p;
1669 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1670 if (!p)
1671 return NULL;
1672 p->kind = Continue_kind;
1673 p->lineno = lineno;
1674 p->col_offset = col_offset;
1675 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676}
1677
1678expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001679BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1680 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001682 expr_ty p;
1683 if (!op) {
1684 PyErr_SetString(PyExc_ValueError,
1685 "field op is required for BoolOp");
1686 return NULL;
1687 }
1688 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1689 if (!p)
1690 return NULL;
1691 p->kind = BoolOp_kind;
1692 p->v.BoolOp.op = op;
1693 p->v.BoolOp.values = values;
1694 p->lineno = lineno;
1695 p->col_offset = col_offset;
1696 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001697}
1698
1699expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001700BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1701 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001703 expr_ty p;
1704 if (!left) {
1705 PyErr_SetString(PyExc_ValueError,
1706 "field left is required for BinOp");
1707 return NULL;
1708 }
1709 if (!op) {
1710 PyErr_SetString(PyExc_ValueError,
1711 "field op is required for BinOp");
1712 return NULL;
1713 }
1714 if (!right) {
1715 PyErr_SetString(PyExc_ValueError,
1716 "field right is required for BinOp");
1717 return NULL;
1718 }
1719 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1720 if (!p)
1721 return NULL;
1722 p->kind = BinOp_kind;
1723 p->v.BinOp.left = left;
1724 p->v.BinOp.op = op;
1725 p->v.BinOp.right = right;
1726 p->lineno = lineno;
1727 p->col_offset = col_offset;
1728 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729}
1730
1731expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001732UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1733 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001735 expr_ty p;
1736 if (!op) {
1737 PyErr_SetString(PyExc_ValueError,
1738 "field op is required for UnaryOp");
1739 return NULL;
1740 }
1741 if (!operand) {
1742 PyErr_SetString(PyExc_ValueError,
1743 "field operand is required for UnaryOp");
1744 return NULL;
1745 }
1746 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1747 if (!p)
1748 return NULL;
1749 p->kind = UnaryOp_kind;
1750 p->v.UnaryOp.op = op;
1751 p->v.UnaryOp.operand = operand;
1752 p->lineno = lineno;
1753 p->col_offset = col_offset;
1754 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001755}
1756
1757expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001758Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
1759 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001761 expr_ty p;
1762 if (!args) {
1763 PyErr_SetString(PyExc_ValueError,
1764 "field args is required for Lambda");
1765 return NULL;
1766 }
1767 if (!body) {
1768 PyErr_SetString(PyExc_ValueError,
1769 "field body is required for Lambda");
1770 return NULL;
1771 }
1772 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1773 if (!p)
1774 return NULL;
1775 p->kind = Lambda_kind;
1776 p->v.Lambda.args = args;
1777 p->v.Lambda.body = body;
1778 p->lineno = lineno;
1779 p->col_offset = col_offset;
1780 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781}
1782
1783expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001784IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1785 PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001786{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001787 expr_ty p;
1788 if (!test) {
1789 PyErr_SetString(PyExc_ValueError,
1790 "field test is required for IfExp");
1791 return NULL;
1792 }
1793 if (!body) {
1794 PyErr_SetString(PyExc_ValueError,
1795 "field body is required for IfExp");
1796 return NULL;
1797 }
1798 if (!orelse) {
1799 PyErr_SetString(PyExc_ValueError,
1800 "field orelse is required for IfExp");
1801 return NULL;
1802 }
1803 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1804 if (!p)
1805 return NULL;
1806 p->kind = IfExp_kind;
1807 p->v.IfExp.test = test;
1808 p->v.IfExp.body = body;
1809 p->v.IfExp.orelse = orelse;
1810 p->lineno = lineno;
1811 p->col_offset = col_offset;
1812 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001813}
1814
1815expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001816Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1817 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001819 expr_ty p;
1820 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1821 if (!p)
1822 return NULL;
1823 p->kind = Dict_kind;
1824 p->v.Dict.keys = keys;
1825 p->v.Dict.values = values;
1826 p->lineno = lineno;
1827 p->col_offset = col_offset;
1828 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829}
1830
1831expr_ty
Guido van Rossum86e58e22006-08-28 15:27:34 +00001832Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1833{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001834 expr_ty p;
1835 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1836 if (!p)
1837 return NULL;
1838 p->kind = Set_kind;
1839 p->v.Set.elts = elts;
1840 p->lineno = lineno;
1841 p->col_offset = col_offset;
1842 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001843}
1844
1845expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001846ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1847 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001849 expr_ty p;
1850 if (!elt) {
1851 PyErr_SetString(PyExc_ValueError,
1852 "field elt is required for ListComp");
1853 return NULL;
1854 }
1855 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1856 if (!p)
1857 return NULL;
1858 p->kind = ListComp_kind;
1859 p->v.ListComp.elt = elt;
1860 p->v.ListComp.generators = generators;
1861 p->lineno = lineno;
1862 p->col_offset = col_offset;
1863 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864}
1865
1866expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001867SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1868 *arena)
1869{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001870 expr_ty p;
1871 if (!elt) {
1872 PyErr_SetString(PyExc_ValueError,
1873 "field elt is required for SetComp");
1874 return NULL;
1875 }
1876 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1877 if (!p)
1878 return NULL;
1879 p->kind = SetComp_kind;
1880 p->v.SetComp.elt = elt;
1881 p->v.SetComp.generators = generators;
1882 p->lineno = lineno;
1883 p->col_offset = col_offset;
1884 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001885}
1886
1887expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001888DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1889 col_offset, PyArena *arena)
1890{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001891 expr_ty p;
1892 if (!key) {
1893 PyErr_SetString(PyExc_ValueError,
1894 "field key is required for DictComp");
1895 return NULL;
1896 }
1897 if (!value) {
1898 PyErr_SetString(PyExc_ValueError,
1899 "field value is required for DictComp");
1900 return NULL;
1901 }
1902 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1903 if (!p)
1904 return NULL;
1905 p->kind = DictComp_kind;
1906 p->v.DictComp.key = key;
1907 p->v.DictComp.value = value;
1908 p->v.DictComp.generators = generators;
1909 p->lineno = lineno;
1910 p->col_offset = col_offset;
1911 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001912}
1913
1914expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001915GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1916 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001918 expr_ty p;
1919 if (!elt) {
1920 PyErr_SetString(PyExc_ValueError,
1921 "field elt is required for GeneratorExp");
1922 return NULL;
1923 }
1924 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1925 if (!p)
1926 return NULL;
1927 p->kind = GeneratorExp_kind;
1928 p->v.GeneratorExp.elt = elt;
1929 p->v.GeneratorExp.generators = generators;
1930 p->lineno = lineno;
1931 p->col_offset = col_offset;
1932 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933}
1934
1935expr_ty
Yury Selivanov75445082015-05-11 22:57:16 -04001936Await(expr_ty value, int lineno, int col_offset, PyArena *arena)
1937{
1938 expr_ty p;
1939 if (!value) {
1940 PyErr_SetString(PyExc_ValueError,
1941 "field value is required for Await");
1942 return NULL;
1943 }
1944 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1945 if (!p)
1946 return NULL;
1947 p->kind = Await_kind;
1948 p->v.Await.value = value;
1949 p->lineno = lineno;
1950 p->col_offset = col_offset;
1951 return p;
1952}
1953
1954expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05001955Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001957 expr_ty p;
1958 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1959 if (!p)
1960 return NULL;
1961 p->kind = Yield_kind;
1962 p->v.Yield.value = value;
1963 p->lineno = lineno;
1964 p->col_offset = col_offset;
1965 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966}
1967
1968expr_ty
Benjamin Peterson527c6222012-01-14 08:58:23 -05001969YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena)
1970{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001971 expr_ty p;
1972 if (!value) {
1973 PyErr_SetString(PyExc_ValueError,
1974 "field value is required for YieldFrom");
1975 return NULL;
1976 }
1977 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1978 if (!p)
1979 return NULL;
1980 p->kind = YieldFrom_kind;
1981 p->v.YieldFrom.value = value;
1982 p->lineno = lineno;
1983 p->col_offset = col_offset;
1984 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05001985}
1986
1987expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001988Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
1989 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001991 expr_ty p;
1992 if (!left) {
1993 PyErr_SetString(PyExc_ValueError,
1994 "field left is required for Compare");
1995 return NULL;
1996 }
1997 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1998 if (!p)
1999 return NULL;
2000 p->kind = Compare_kind;
2001 p->v.Compare.left = left;
2002 p->v.Compare.ops = ops;
2003 p->v.Compare.comparators = comparators;
2004 p->lineno = lineno;
2005 p->col_offset = col_offset;
2006 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007}
2008
2009expr_ty
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002010Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int
2011 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002013 expr_ty p;
2014 if (!func) {
2015 PyErr_SetString(PyExc_ValueError,
2016 "field func is required for Call");
2017 return NULL;
2018 }
2019 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2020 if (!p)
2021 return NULL;
2022 p->kind = Call_kind;
2023 p->v.Call.func = func;
2024 p->v.Call.args = args;
2025 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002026 p->lineno = lineno;
2027 p->col_offset = col_offset;
2028 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029}
2030
2031expr_ty
Eric V. Smith235a6f02015-09-19 14:51:32 -04002032FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
2033 int col_offset, PyArena *arena)
2034{
2035 expr_ty p;
2036 if (!value) {
2037 PyErr_SetString(PyExc_ValueError,
2038 "field value is required for FormattedValue");
2039 return NULL;
2040 }
2041 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2042 if (!p)
2043 return NULL;
2044 p->kind = FormattedValue_kind;
2045 p->v.FormattedValue.value = value;
2046 p->v.FormattedValue.conversion = conversion;
2047 p->v.FormattedValue.format_spec = format_spec;
2048 p->lineno = lineno;
2049 p->col_offset = col_offset;
2050 return p;
2051}
2052
2053expr_ty
2054JoinedStr(asdl_seq * values, int lineno, int col_offset, PyArena *arena)
2055{
2056 expr_ty p;
2057 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2058 if (!p)
2059 return NULL;
2060 p->kind = JoinedStr_kind;
2061 p->v.JoinedStr.values = values;
2062 p->lineno = lineno;
2063 p->col_offset = col_offset;
2064 return p;
2065}
2066
2067expr_ty
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002068Constant(constant value, int lineno, int col_offset, PyArena *arena)
2069{
2070 expr_ty p;
2071 if (!value) {
2072 PyErr_SetString(PyExc_ValueError,
2073 "field value is required for Constant");
2074 return NULL;
2075 }
2076 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2077 if (!p)
2078 return NULL;
2079 p->kind = Constant_kind;
2080 p->v.Constant.value = value;
2081 p->lineno = lineno;
2082 p->col_offset = col_offset;
2083 return p;
2084}
2085
2086expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002087Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
2088 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002090 expr_ty p;
2091 if (!value) {
2092 PyErr_SetString(PyExc_ValueError,
2093 "field value is required for Attribute");
2094 return NULL;
2095 }
2096 if (!attr) {
2097 PyErr_SetString(PyExc_ValueError,
2098 "field attr is required for Attribute");
2099 return NULL;
2100 }
2101 if (!ctx) {
2102 PyErr_SetString(PyExc_ValueError,
2103 "field ctx is required for Attribute");
2104 return NULL;
2105 }
2106 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2107 if (!p)
2108 return NULL;
2109 p->kind = Attribute_kind;
2110 p->v.Attribute.value = value;
2111 p->v.Attribute.attr = attr;
2112 p->v.Attribute.ctx = ctx;
2113 p->lineno = lineno;
2114 p->col_offset = col_offset;
2115 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116}
2117
2118expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002119Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
2120 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002122 expr_ty p;
2123 if (!value) {
2124 PyErr_SetString(PyExc_ValueError,
2125 "field value is required for Subscript");
2126 return NULL;
2127 }
2128 if (!slice) {
2129 PyErr_SetString(PyExc_ValueError,
2130 "field slice is required for Subscript");
2131 return NULL;
2132 }
2133 if (!ctx) {
2134 PyErr_SetString(PyExc_ValueError,
2135 "field ctx is required for Subscript");
2136 return NULL;
2137 }
2138 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2139 if (!p)
2140 return NULL;
2141 p->kind = Subscript_kind;
2142 p->v.Subscript.value = value;
2143 p->v.Subscript.slice = slice;
2144 p->v.Subscript.ctx = ctx;
2145 p->lineno = lineno;
2146 p->col_offset = col_offset;
2147 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148}
2149
2150expr_ty
Guido van Rossum0368b722007-05-11 16:50:42 +00002151Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
2152 *arena)
2153{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002154 expr_ty p;
2155 if (!value) {
2156 PyErr_SetString(PyExc_ValueError,
2157 "field value is required for Starred");
2158 return NULL;
2159 }
2160 if (!ctx) {
2161 PyErr_SetString(PyExc_ValueError,
2162 "field ctx is required for Starred");
2163 return NULL;
2164 }
2165 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2166 if (!p)
2167 return NULL;
2168 p->kind = Starred_kind;
2169 p->v.Starred.value = value;
2170 p->v.Starred.ctx = ctx;
2171 p->lineno = lineno;
2172 p->col_offset = col_offset;
2173 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00002174}
2175
2176expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002177Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
2178 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002180 expr_ty p;
2181 if (!id) {
2182 PyErr_SetString(PyExc_ValueError,
2183 "field id is required for Name");
2184 return NULL;
2185 }
2186 if (!ctx) {
2187 PyErr_SetString(PyExc_ValueError,
2188 "field ctx is required for Name");
2189 return NULL;
2190 }
2191 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2192 if (!p)
2193 return NULL;
2194 p->kind = Name_kind;
2195 p->v.Name.id = id;
2196 p->v.Name.ctx = ctx;
2197 p->lineno = lineno;
2198 p->col_offset = col_offset;
2199 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200}
2201
2202expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002203List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2204 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002206 expr_ty p;
2207 if (!ctx) {
2208 PyErr_SetString(PyExc_ValueError,
2209 "field ctx is required for List");
2210 return NULL;
2211 }
2212 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2213 if (!p)
2214 return NULL;
2215 p->kind = List_kind;
2216 p->v.List.elts = elts;
2217 p->v.List.ctx = ctx;
2218 p->lineno = lineno;
2219 p->col_offset = col_offset;
2220 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221}
2222
2223expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002224Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2225 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002227 expr_ty p;
2228 if (!ctx) {
2229 PyErr_SetString(PyExc_ValueError,
2230 "field ctx is required for Tuple");
2231 return NULL;
2232 }
2233 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2234 if (!p)
2235 return NULL;
2236 p->kind = Tuple_kind;
2237 p->v.Tuple.elts = elts;
2238 p->v.Tuple.ctx = ctx;
2239 p->lineno = lineno;
2240 p->col_offset = col_offset;
2241 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242}
2243
2244slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002245Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002247 slice_ty p;
2248 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2249 if (!p)
2250 return NULL;
2251 p->kind = Slice_kind;
2252 p->v.Slice.lower = lower;
2253 p->v.Slice.upper = upper;
2254 p->v.Slice.step = step;
2255 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256}
2257
2258slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002259ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002261 slice_ty p;
2262 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2263 if (!p)
2264 return NULL;
2265 p->kind = ExtSlice_kind;
2266 p->v.ExtSlice.dims = dims;
2267 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268}
2269
2270slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002271Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002273 slice_ty p;
2274 if (!value) {
2275 PyErr_SetString(PyExc_ValueError,
2276 "field value is required for Index");
2277 return NULL;
2278 }
2279 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2280 if (!p)
2281 return NULL;
2282 p->kind = Index_kind;
2283 p->v.Index.value = value;
2284 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285}
2286
2287comprehension_ty
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002288comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async,
2289 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002291 comprehension_ty p;
2292 if (!target) {
2293 PyErr_SetString(PyExc_ValueError,
2294 "field target is required for comprehension");
2295 return NULL;
2296 }
2297 if (!iter) {
2298 PyErr_SetString(PyExc_ValueError,
2299 "field iter is required for comprehension");
2300 return NULL;
2301 }
2302 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2303 if (!p)
2304 return NULL;
2305 p->target = target;
2306 p->iter = iter;
2307 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002308 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002309 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310}
2311
2312excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002313ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002314 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002316 excepthandler_ty p;
2317 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2318 if (!p)
2319 return NULL;
2320 p->kind = ExceptHandler_kind;
2321 p->v.ExceptHandler.type = type;
2322 p->v.ExceptHandler.name = name;
2323 p->v.ExceptHandler.body = body;
2324 p->lineno = lineno;
2325 p->col_offset = col_offset;
2326 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327}
2328
2329arguments_ty
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002330arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
2331 kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002333 arguments_ty p;
2334 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2335 if (!p)
2336 return NULL;
2337 p->args = args;
2338 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002339 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002340 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02002341 p->kwarg = kwarg;
2342 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002343 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344}
2345
Neal Norwitzc1505362006-12-28 06:47:50 +00002346arg_ty
Victor Stinnerc106c682015-11-06 17:01:48 +01002347arg(identifier arg, expr_ty annotation, int lineno, int col_offset, PyArena
2348 *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002349{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002350 arg_ty p;
2351 if (!arg) {
2352 PyErr_SetString(PyExc_ValueError,
2353 "field arg is required for arg");
2354 return NULL;
2355 }
2356 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
2357 if (!p)
2358 return NULL;
2359 p->arg = arg;
2360 p->annotation = annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01002361 p->lineno = lineno;
2362 p->col_offset = col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002363 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00002364}
2365
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002367keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002369 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002370 if (!value) {
2371 PyErr_SetString(PyExc_ValueError,
2372 "field value is required for keyword");
2373 return NULL;
2374 }
2375 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2376 if (!p)
2377 return NULL;
2378 p->arg = arg;
2379 p->value = value;
2380 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381}
2382
2383alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002384alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002386 alias_ty p;
2387 if (!name) {
2388 PyErr_SetString(PyExc_ValueError,
2389 "field name is required for alias");
2390 return NULL;
2391 }
2392 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2393 if (!p)
2394 return NULL;
2395 p->name = name;
2396 p->asname = asname;
2397 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398}
2399
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002400withitem_ty
2401withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2402{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002403 withitem_ty p;
2404 if (!context_expr) {
2405 PyErr_SetString(PyExc_ValueError,
2406 "field context_expr is required for withitem");
2407 return NULL;
2408 }
2409 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2410 if (!p)
2411 return NULL;
2412 p->context_expr = context_expr;
2413 p->optional_vars = optional_vars;
2414 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002415}
2416
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002417
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002418PyObject*
2419ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002420{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002421 mod_ty o = (mod_ty)_o;
2422 PyObject *result = NULL, *value = NULL;
2423 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002424 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002425 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002426
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002427 switch (o->kind) {
2428 case Module_kind:
2429 result = PyType_GenericNew(Module_type, NULL, NULL);
2430 if (!result) goto failed;
2431 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2432 if (!value) goto failed;
2433 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2434 goto failed;
2435 Py_DECREF(value);
2436 break;
2437 case Interactive_kind:
2438 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2439 if (!result) goto failed;
2440 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2441 if (!value) goto failed;
2442 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2443 goto failed;
2444 Py_DECREF(value);
2445 break;
2446 case Expression_kind:
2447 result = PyType_GenericNew(Expression_type, NULL, NULL);
2448 if (!result) goto failed;
2449 value = ast2obj_expr(o->v.Expression.body);
2450 if (!value) goto failed;
2451 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2452 goto failed;
2453 Py_DECREF(value);
2454 break;
2455 case Suite_kind:
2456 result = PyType_GenericNew(Suite_type, NULL, NULL);
2457 if (!result) goto failed;
2458 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2459 if (!value) goto failed;
2460 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2461 goto failed;
2462 Py_DECREF(value);
2463 break;
2464 }
2465 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002466failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002467 Py_XDECREF(value);
2468 Py_XDECREF(result);
2469 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470}
2471
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002472PyObject*
2473ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002475 stmt_ty o = (stmt_ty)_o;
2476 PyObject *result = NULL, *value = NULL;
2477 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002478 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002479 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002480
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002481 switch (o->kind) {
2482 case FunctionDef_kind:
2483 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2484 if (!result) goto failed;
2485 value = ast2obj_identifier(o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002486 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002487 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2488 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002489 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002490 value = ast2obj_arguments(o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002491 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002492 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2493 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002494 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002495 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2496 if (!value) goto failed;
2497 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2498 goto failed;
2499 Py_DECREF(value);
2500 value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr);
2501 if (!value) goto failed;
2502 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2503 goto failed;
2504 Py_DECREF(value);
2505 value = ast2obj_expr(o->v.FunctionDef.returns);
2506 if (!value) goto failed;
2507 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2508 goto failed;
2509 Py_DECREF(value);
2510 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002511 case AsyncFunctionDef_kind:
2512 result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL);
2513 if (!result) goto failed;
2514 value = ast2obj_identifier(o->v.AsyncFunctionDef.name);
2515 if (!value) goto failed;
2516 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2517 goto failed;
2518 Py_DECREF(value);
2519 value = ast2obj_arguments(o->v.AsyncFunctionDef.args);
2520 if (!value) goto failed;
2521 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2522 goto failed;
2523 Py_DECREF(value);
2524 value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt);
2525 if (!value) goto failed;
2526 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2527 goto failed;
2528 Py_DECREF(value);
2529 value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list,
2530 ast2obj_expr);
2531 if (!value) goto failed;
2532 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2533 goto failed;
2534 Py_DECREF(value);
2535 value = ast2obj_expr(o->v.AsyncFunctionDef.returns);
2536 if (!value) goto failed;
2537 if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
2538 goto failed;
2539 Py_DECREF(value);
2540 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002541 case ClassDef_kind:
2542 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2543 if (!result) goto failed;
2544 value = ast2obj_identifier(o->v.ClassDef.name);
2545 if (!value) goto failed;
2546 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
2547 goto failed;
2548 Py_DECREF(value);
2549 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2550 if (!value) goto failed;
2551 if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
2552 goto failed;
2553 Py_DECREF(value);
2554 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2555 if (!value) goto failed;
2556 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
2557 goto failed;
2558 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002559 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2560 if (!value) goto failed;
2561 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2562 goto failed;
2563 Py_DECREF(value);
2564 value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr);
2565 if (!value) goto failed;
2566 if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1)
2567 goto failed;
2568 Py_DECREF(value);
2569 break;
2570 case Return_kind:
2571 result = PyType_GenericNew(Return_type, NULL, NULL);
2572 if (!result) goto failed;
2573 value = ast2obj_expr(o->v.Return.value);
2574 if (!value) goto failed;
2575 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2576 goto failed;
2577 Py_DECREF(value);
2578 break;
2579 case Delete_kind:
2580 result = PyType_GenericNew(Delete_type, NULL, NULL);
2581 if (!result) goto failed;
2582 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2583 if (!value) goto failed;
2584 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2585 goto failed;
2586 Py_DECREF(value);
2587 break;
2588 case Assign_kind:
2589 result = PyType_GenericNew(Assign_type, NULL, NULL);
2590 if (!result) goto failed;
2591 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2592 if (!value) goto failed;
2593 if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
2594 goto failed;
2595 Py_DECREF(value);
2596 value = ast2obj_expr(o->v.Assign.value);
2597 if (!value) goto failed;
2598 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2599 goto failed;
2600 Py_DECREF(value);
2601 break;
2602 case AugAssign_kind:
2603 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2604 if (!result) goto failed;
2605 value = ast2obj_expr(o->v.AugAssign.target);
2606 if (!value) goto failed;
2607 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2608 goto failed;
2609 Py_DECREF(value);
2610 value = ast2obj_operator(o->v.AugAssign.op);
2611 if (!value) goto failed;
2612 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2613 goto failed;
2614 Py_DECREF(value);
2615 value = ast2obj_expr(o->v.AugAssign.value);
2616 if (!value) goto failed;
2617 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2618 goto failed;
2619 Py_DECREF(value);
2620 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002621 case AnnAssign_kind:
2622 result = PyType_GenericNew(AnnAssign_type, NULL, NULL);
2623 if (!result) goto failed;
2624 value = ast2obj_expr(o->v.AnnAssign.target);
2625 if (!value) goto failed;
2626 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2627 goto failed;
2628 Py_DECREF(value);
2629 value = ast2obj_expr(o->v.AnnAssign.annotation);
2630 if (!value) goto failed;
2631 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
2632 goto failed;
2633 Py_DECREF(value);
2634 value = ast2obj_expr(o->v.AnnAssign.value);
2635 if (!value) goto failed;
2636 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2637 goto failed;
2638 Py_DECREF(value);
2639 value = ast2obj_int(o->v.AnnAssign.simple);
2640 if (!value) goto failed;
2641 if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1)
2642 goto failed;
2643 Py_DECREF(value);
2644 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002645 case For_kind:
2646 result = PyType_GenericNew(For_type, NULL, NULL);
2647 if (!result) goto failed;
2648 value = ast2obj_expr(o->v.For.target);
2649 if (!value) goto failed;
2650 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2651 goto failed;
2652 Py_DECREF(value);
2653 value = ast2obj_expr(o->v.For.iter);
2654 if (!value) goto failed;
2655 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2656 goto failed;
2657 Py_DECREF(value);
2658 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2659 if (!value) goto failed;
2660 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2661 goto failed;
2662 Py_DECREF(value);
2663 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2664 if (!value) goto failed;
2665 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2666 goto failed;
2667 Py_DECREF(value);
2668 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002669 case AsyncFor_kind:
2670 result = PyType_GenericNew(AsyncFor_type, NULL, NULL);
2671 if (!result) goto failed;
2672 value = ast2obj_expr(o->v.AsyncFor.target);
2673 if (!value) goto failed;
2674 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
2675 goto failed;
2676 Py_DECREF(value);
2677 value = ast2obj_expr(o->v.AsyncFor.iter);
2678 if (!value) goto failed;
2679 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
2680 goto failed;
2681 Py_DECREF(value);
2682 value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt);
2683 if (!value) goto failed;
2684 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2685 goto failed;
2686 Py_DECREF(value);
2687 value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt);
2688 if (!value) goto failed;
2689 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2690 goto failed;
2691 Py_DECREF(value);
2692 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002693 case While_kind:
2694 result = PyType_GenericNew(While_type, NULL, NULL);
2695 if (!result) goto failed;
2696 value = ast2obj_expr(o->v.While.test);
2697 if (!value) goto failed;
2698 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2699 goto failed;
2700 Py_DECREF(value);
2701 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2702 if (!value) goto failed;
2703 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2704 goto failed;
2705 Py_DECREF(value);
2706 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2707 if (!value) goto failed;
2708 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2709 goto failed;
2710 Py_DECREF(value);
2711 break;
2712 case If_kind:
2713 result = PyType_GenericNew(If_type, NULL, NULL);
2714 if (!result) goto failed;
2715 value = ast2obj_expr(o->v.If.test);
2716 if (!value) goto failed;
2717 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2718 goto failed;
2719 Py_DECREF(value);
2720 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2721 if (!value) goto failed;
2722 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2723 goto failed;
2724 Py_DECREF(value);
2725 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2726 if (!value) goto failed;
2727 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2728 goto failed;
2729 Py_DECREF(value);
2730 break;
2731 case With_kind:
2732 result = PyType_GenericNew(With_type, NULL, NULL);
2733 if (!result) goto failed;
2734 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
2735 if (!value) goto failed;
2736 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2737 goto failed;
2738 Py_DECREF(value);
2739 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2740 if (!value) goto failed;
2741 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2742 goto failed;
2743 Py_DECREF(value);
2744 break;
Yury Selivanov75445082015-05-11 22:57:16 -04002745 case AsyncWith_kind:
2746 result = PyType_GenericNew(AsyncWith_type, NULL, NULL);
2747 if (!result) goto failed;
2748 value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem);
2749 if (!value) goto failed;
2750 if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
2751 goto failed;
2752 Py_DECREF(value);
2753 value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt);
2754 if (!value) goto failed;
2755 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2756 goto failed;
2757 Py_DECREF(value);
2758 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002759 case Raise_kind:
2760 result = PyType_GenericNew(Raise_type, NULL, NULL);
2761 if (!result) goto failed;
2762 value = ast2obj_expr(o->v.Raise.exc);
2763 if (!value) goto failed;
2764 if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
2765 goto failed;
2766 Py_DECREF(value);
2767 value = ast2obj_expr(o->v.Raise.cause);
2768 if (!value) goto failed;
2769 if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
2770 goto failed;
2771 Py_DECREF(value);
2772 break;
2773 case Try_kind:
2774 result = PyType_GenericNew(Try_type, NULL, NULL);
2775 if (!result) goto failed;
2776 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
2777 if (!value) goto failed;
2778 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2779 goto failed;
2780 Py_DECREF(value);
2781 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
2782 if (!value) goto failed;
2783 if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
2784 goto failed;
2785 Py_DECREF(value);
2786 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
2787 if (!value) goto failed;
2788 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2789 goto failed;
2790 Py_DECREF(value);
2791 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
2792 if (!value) goto failed;
2793 if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
2794 goto failed;
2795 Py_DECREF(value);
2796 break;
2797 case Assert_kind:
2798 result = PyType_GenericNew(Assert_type, NULL, NULL);
2799 if (!result) goto failed;
2800 value = ast2obj_expr(o->v.Assert.test);
2801 if (!value) goto failed;
2802 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2803 goto failed;
2804 Py_DECREF(value);
2805 value = ast2obj_expr(o->v.Assert.msg);
2806 if (!value) goto failed;
2807 if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
2808 goto failed;
2809 Py_DECREF(value);
2810 break;
2811 case Import_kind:
2812 result = PyType_GenericNew(Import_type, NULL, NULL);
2813 if (!result) goto failed;
2814 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2815 if (!value) goto failed;
2816 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2817 goto failed;
2818 Py_DECREF(value);
2819 break;
2820 case ImportFrom_kind:
2821 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
2822 if (!result) goto failed;
2823 value = ast2obj_identifier(o->v.ImportFrom.module);
2824 if (!value) goto failed;
2825 if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
2826 goto failed;
2827 Py_DECREF(value);
2828 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
2829 if (!value) goto failed;
2830 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2831 goto failed;
2832 Py_DECREF(value);
2833 value = ast2obj_int(o->v.ImportFrom.level);
2834 if (!value) goto failed;
2835 if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
2836 goto failed;
2837 Py_DECREF(value);
2838 break;
2839 case Global_kind:
2840 result = PyType_GenericNew(Global_type, NULL, NULL);
2841 if (!result) goto failed;
2842 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
2843 if (!value) goto failed;
2844 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2845 goto failed;
2846 Py_DECREF(value);
2847 break;
2848 case Nonlocal_kind:
2849 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
2850 if (!result) goto failed;
2851 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
2852 if (!value) goto failed;
2853 if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
2854 goto failed;
2855 Py_DECREF(value);
2856 break;
2857 case Expr_kind:
2858 result = PyType_GenericNew(Expr_type, NULL, NULL);
2859 if (!result) goto failed;
2860 value = ast2obj_expr(o->v.Expr.value);
2861 if (!value) goto failed;
2862 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
2863 goto failed;
2864 Py_DECREF(value);
2865 break;
2866 case Pass_kind:
2867 result = PyType_GenericNew(Pass_type, NULL, NULL);
2868 if (!result) goto failed;
2869 break;
2870 case Break_kind:
2871 result = PyType_GenericNew(Break_type, NULL, NULL);
2872 if (!result) goto failed;
2873 break;
2874 case Continue_kind:
2875 result = PyType_GenericNew(Continue_type, NULL, NULL);
2876 if (!result) goto failed;
2877 break;
2878 }
2879 value = ast2obj_int(o->lineno);
2880 if (!value) goto failed;
2881 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
2882 goto failed;
2883 Py_DECREF(value);
2884 value = ast2obj_int(o->col_offset);
2885 if (!value) goto failed;
2886 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
2887 goto failed;
2888 Py_DECREF(value);
2889 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002890failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002891 Py_XDECREF(value);
2892 Py_XDECREF(result);
2893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894}
2895
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002896PyObject*
2897ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002899 expr_ty o = (expr_ty)_o;
2900 PyObject *result = NULL, *value = NULL;
2901 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002902 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002903 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002904
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002905 switch (o->kind) {
2906 case BoolOp_kind:
2907 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
2908 if (!result) goto failed;
2909 value = ast2obj_boolop(o->v.BoolOp.op);
2910 if (!value) goto failed;
2911 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2912 goto failed;
2913 Py_DECREF(value);
2914 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
2915 if (!value) goto failed;
2916 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
2917 goto failed;
2918 Py_DECREF(value);
2919 break;
2920 case BinOp_kind:
2921 result = PyType_GenericNew(BinOp_type, NULL, NULL);
2922 if (!result) goto failed;
2923 value = ast2obj_expr(o->v.BinOp.left);
2924 if (!value) goto failed;
2925 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
2926 goto failed;
2927 Py_DECREF(value);
2928 value = ast2obj_operator(o->v.BinOp.op);
2929 if (!value) goto failed;
2930 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2931 goto failed;
2932 Py_DECREF(value);
2933 value = ast2obj_expr(o->v.BinOp.right);
2934 if (!value) goto failed;
2935 if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
2936 goto failed;
2937 Py_DECREF(value);
2938 break;
2939 case UnaryOp_kind:
2940 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
2941 if (!result) goto failed;
2942 value = ast2obj_unaryop(o->v.UnaryOp.op);
2943 if (!value) goto failed;
2944 if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
2945 goto failed;
2946 Py_DECREF(value);
2947 value = ast2obj_expr(o->v.UnaryOp.operand);
2948 if (!value) goto failed;
2949 if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
2950 goto failed;
2951 Py_DECREF(value);
2952 break;
2953 case Lambda_kind:
2954 result = PyType_GenericNew(Lambda_type, NULL, NULL);
2955 if (!result) goto failed;
2956 value = ast2obj_arguments(o->v.Lambda.args);
2957 if (!value) goto failed;
2958 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
2959 goto failed;
2960 Py_DECREF(value);
2961 value = ast2obj_expr(o->v.Lambda.body);
2962 if (!value) goto failed;
2963 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2964 goto failed;
2965 Py_DECREF(value);
2966 break;
2967 case IfExp_kind:
2968 result = PyType_GenericNew(IfExp_type, NULL, NULL);
2969 if (!result) goto failed;
2970 value = ast2obj_expr(o->v.IfExp.test);
2971 if (!value) goto failed;
2972 if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
2973 goto failed;
2974 Py_DECREF(value);
2975 value = ast2obj_expr(o->v.IfExp.body);
2976 if (!value) goto failed;
2977 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
2978 goto failed;
2979 Py_DECREF(value);
2980 value = ast2obj_expr(o->v.IfExp.orelse);
2981 if (!value) goto failed;
2982 if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
2983 goto failed;
2984 Py_DECREF(value);
2985 break;
2986 case Dict_kind:
2987 result = PyType_GenericNew(Dict_type, NULL, NULL);
2988 if (!result) goto failed;
2989 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
2990 if (!value) goto failed;
2991 if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
2992 goto failed;
2993 Py_DECREF(value);
2994 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
2995 if (!value) goto failed;
2996 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
2997 goto failed;
2998 Py_DECREF(value);
2999 break;
3000 case Set_kind:
3001 result = PyType_GenericNew(Set_type, NULL, NULL);
3002 if (!result) goto failed;
3003 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
3004 if (!value) goto failed;
3005 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3006 goto failed;
3007 Py_DECREF(value);
3008 break;
3009 case ListComp_kind:
3010 result = PyType_GenericNew(ListComp_type, NULL, NULL);
3011 if (!result) goto failed;
3012 value = ast2obj_expr(o->v.ListComp.elt);
3013 if (!value) goto failed;
3014 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3015 goto failed;
3016 Py_DECREF(value);
3017 value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension);
3018 if (!value) goto failed;
3019 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3020 goto failed;
3021 Py_DECREF(value);
3022 break;
3023 case SetComp_kind:
3024 result = PyType_GenericNew(SetComp_type, NULL, NULL);
3025 if (!result) goto failed;
3026 value = ast2obj_expr(o->v.SetComp.elt);
3027 if (!value) goto failed;
3028 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3029 goto failed;
3030 Py_DECREF(value);
3031 value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension);
3032 if (!value) goto failed;
3033 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3034 goto failed;
3035 Py_DECREF(value);
3036 break;
3037 case DictComp_kind:
3038 result = PyType_GenericNew(DictComp_type, NULL, NULL);
3039 if (!result) goto failed;
3040 value = ast2obj_expr(o->v.DictComp.key);
3041 if (!value) goto failed;
3042 if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
3043 goto failed;
3044 Py_DECREF(value);
3045 value = ast2obj_expr(o->v.DictComp.value);
3046 if (!value) goto failed;
3047 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3048 goto failed;
3049 Py_DECREF(value);
3050 value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension);
3051 if (!value) goto failed;
3052 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3053 goto failed;
3054 Py_DECREF(value);
3055 break;
3056 case GeneratorExp_kind:
3057 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
3058 if (!result) goto failed;
3059 value = ast2obj_expr(o->v.GeneratorExp.elt);
3060 if (!value) goto failed;
3061 if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
3062 goto failed;
3063 Py_DECREF(value);
3064 value = ast2obj_list(o->v.GeneratorExp.generators,
3065 ast2obj_comprehension);
3066 if (!value) goto failed;
3067 if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
3068 goto failed;
3069 Py_DECREF(value);
3070 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003071 case Await_kind:
3072 result = PyType_GenericNew(Await_type, NULL, NULL);
3073 if (!result) goto failed;
3074 value = ast2obj_expr(o->v.Await.value);
3075 if (!value) goto failed;
3076 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3077 goto failed;
3078 Py_DECREF(value);
3079 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003080 case Yield_kind:
3081 result = PyType_GenericNew(Yield_type, NULL, NULL);
3082 if (!result) goto failed;
3083 value = ast2obj_expr(o->v.Yield.value);
3084 if (!value) goto failed;
3085 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3086 goto failed;
3087 Py_DECREF(value);
3088 break;
3089 case YieldFrom_kind:
3090 result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
3091 if (!result) goto failed;
3092 value = ast2obj_expr(o->v.YieldFrom.value);
3093 if (!value) goto failed;
3094 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3095 goto failed;
3096 Py_DECREF(value);
3097 break;
3098 case Compare_kind:
3099 result = PyType_GenericNew(Compare_type, NULL, NULL);
3100 if (!result) goto failed;
3101 value = ast2obj_expr(o->v.Compare.left);
3102 if (!value) goto failed;
3103 if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
3104 goto failed;
3105 Py_DECREF(value);
3106 {
3107 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
3108 value = PyList_New(n);
3109 if (!value) goto failed;
3110 for(i = 0; i < n; i++)
3111 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003113 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003114 if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
3115 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003116 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003117 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003118 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003119 if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
3120 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003121 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003122 break;
3123 case Call_kind:
3124 result = PyType_GenericNew(Call_type, NULL, NULL);
3125 if (!result) goto failed;
3126 value = ast2obj_expr(o->v.Call.func);
3127 if (!value) goto failed;
3128 if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
3129 goto failed;
3130 Py_DECREF(value);
3131 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
3132 if (!value) goto failed;
3133 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3134 goto failed;
3135 Py_DECREF(value);
3136 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
3137 if (!value) goto failed;
3138 if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
3139 goto failed;
3140 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003141 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003142 case FormattedValue_kind:
3143 result = PyType_GenericNew(FormattedValue_type, NULL, NULL);
3144 if (!result) goto failed;
3145 value = ast2obj_expr(o->v.FormattedValue.value);
3146 if (!value) goto failed;
3147 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3148 goto failed;
3149 Py_DECREF(value);
3150 value = ast2obj_int(o->v.FormattedValue.conversion);
3151 if (!value) goto failed;
3152 if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1)
3153 goto failed;
3154 Py_DECREF(value);
3155 value = ast2obj_expr(o->v.FormattedValue.format_spec);
3156 if (!value) goto failed;
3157 if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1)
3158 goto failed;
3159 Py_DECREF(value);
3160 break;
3161 case JoinedStr_kind:
3162 result = PyType_GenericNew(JoinedStr_type, NULL, NULL);
3163 if (!result) goto failed;
3164 value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr);
3165 if (!value) goto failed;
3166 if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
3167 goto failed;
3168 Py_DECREF(value);
3169 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003170 case Constant_kind:
3171 result = PyType_GenericNew(Constant_type, NULL, NULL);
3172 if (!result) goto failed;
3173 value = ast2obj_constant(o->v.Constant.value);
3174 if (!value) goto failed;
3175 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3176 goto failed;
3177 Py_DECREF(value);
3178 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003179 case Attribute_kind:
3180 result = PyType_GenericNew(Attribute_type, NULL, NULL);
3181 if (!result) goto failed;
3182 value = ast2obj_expr(o->v.Attribute.value);
3183 if (!value) goto failed;
3184 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3185 goto failed;
3186 Py_DECREF(value);
3187 value = ast2obj_identifier(o->v.Attribute.attr);
3188 if (!value) goto failed;
3189 if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
3190 goto failed;
3191 Py_DECREF(value);
3192 value = ast2obj_expr_context(o->v.Attribute.ctx);
3193 if (!value) goto failed;
3194 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3195 goto failed;
3196 Py_DECREF(value);
3197 break;
3198 case Subscript_kind:
3199 result = PyType_GenericNew(Subscript_type, NULL, NULL);
3200 if (!result) goto failed;
3201 value = ast2obj_expr(o->v.Subscript.value);
3202 if (!value) goto failed;
3203 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3204 goto failed;
3205 Py_DECREF(value);
3206 value = ast2obj_slice(o->v.Subscript.slice);
3207 if (!value) goto failed;
3208 if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
3209 goto failed;
3210 Py_DECREF(value);
3211 value = ast2obj_expr_context(o->v.Subscript.ctx);
3212 if (!value) goto failed;
3213 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3214 goto failed;
3215 Py_DECREF(value);
3216 break;
3217 case Starred_kind:
3218 result = PyType_GenericNew(Starred_type, NULL, NULL);
3219 if (!result) goto failed;
3220 value = ast2obj_expr(o->v.Starred.value);
3221 if (!value) goto failed;
3222 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3223 goto failed;
3224 Py_DECREF(value);
3225 value = ast2obj_expr_context(o->v.Starred.ctx);
3226 if (!value) goto failed;
3227 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3228 goto failed;
3229 Py_DECREF(value);
3230 break;
3231 case Name_kind:
3232 result = PyType_GenericNew(Name_type, NULL, NULL);
3233 if (!result) goto failed;
3234 value = ast2obj_identifier(o->v.Name.id);
3235 if (!value) goto failed;
3236 if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
3237 goto failed;
3238 Py_DECREF(value);
3239 value = ast2obj_expr_context(o->v.Name.ctx);
3240 if (!value) goto failed;
3241 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3242 goto failed;
3243 Py_DECREF(value);
3244 break;
3245 case List_kind:
3246 result = PyType_GenericNew(List_type, NULL, NULL);
3247 if (!result) goto failed;
3248 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
3249 if (!value) goto failed;
3250 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3251 goto failed;
3252 Py_DECREF(value);
3253 value = ast2obj_expr_context(o->v.List.ctx);
3254 if (!value) goto failed;
3255 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3256 goto failed;
3257 Py_DECREF(value);
3258 break;
3259 case Tuple_kind:
3260 result = PyType_GenericNew(Tuple_type, NULL, NULL);
3261 if (!result) goto failed;
3262 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
3263 if (!value) goto failed;
3264 if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
3265 goto failed;
3266 Py_DECREF(value);
3267 value = ast2obj_expr_context(o->v.Tuple.ctx);
3268 if (!value) goto failed;
3269 if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
3270 goto failed;
3271 Py_DECREF(value);
3272 break;
3273 }
3274 value = ast2obj_int(o->lineno);
3275 if (!value) goto failed;
3276 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3277 goto failed;
3278 Py_DECREF(value);
3279 value = ast2obj_int(o->col_offset);
3280 if (!value) goto failed;
3281 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3282 goto failed;
3283 Py_DECREF(value);
3284 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003285failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003286 Py_XDECREF(value);
3287 Py_XDECREF(result);
3288 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289}
3290
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003291PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003293 switch(o) {
3294 case Load:
3295 Py_INCREF(Load_singleton);
3296 return Load_singleton;
3297 case Store:
3298 Py_INCREF(Store_singleton);
3299 return Store_singleton;
3300 case Del:
3301 Py_INCREF(Del_singleton);
3302 return Del_singleton;
3303 case AugLoad:
3304 Py_INCREF(AugLoad_singleton);
3305 return AugLoad_singleton;
3306 case AugStore:
3307 Py_INCREF(AugStore_singleton);
3308 return AugStore_singleton;
3309 case Param:
3310 Py_INCREF(Param_singleton);
3311 return Param_singleton;
3312 default:
3313 /* should never happen, but just in case ... */
3314 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3315 return NULL;
3316 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003318PyObject*
3319ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003321 slice_ty o = (slice_ty)_o;
3322 PyObject *result = NULL, *value = NULL;
3323 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003324 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003325 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003326
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003327 switch (o->kind) {
3328 case Slice_kind:
3329 result = PyType_GenericNew(Slice_type, NULL, NULL);
3330 if (!result) goto failed;
3331 value = ast2obj_expr(o->v.Slice.lower);
3332 if (!value) goto failed;
3333 if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
3334 goto failed;
3335 Py_DECREF(value);
3336 value = ast2obj_expr(o->v.Slice.upper);
3337 if (!value) goto failed;
3338 if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
3339 goto failed;
3340 Py_DECREF(value);
3341 value = ast2obj_expr(o->v.Slice.step);
3342 if (!value) goto failed;
3343 if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
3344 goto failed;
3345 Py_DECREF(value);
3346 break;
3347 case ExtSlice_kind:
3348 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3349 if (!result) goto failed;
3350 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3351 if (!value) goto failed;
3352 if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
3353 goto failed;
3354 Py_DECREF(value);
3355 break;
3356 case Index_kind:
3357 result = PyType_GenericNew(Index_type, NULL, NULL);
3358 if (!result) goto failed;
3359 value = ast2obj_expr(o->v.Index.value);
3360 if (!value) goto failed;
3361 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3362 goto failed;
3363 Py_DECREF(value);
3364 break;
3365 }
3366 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003367failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003368 Py_XDECREF(value);
3369 Py_XDECREF(result);
3370 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003371}
3372
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003373PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003375 switch(o) {
3376 case And:
3377 Py_INCREF(And_singleton);
3378 return And_singleton;
3379 case Or:
3380 Py_INCREF(Or_singleton);
3381 return Or_singleton;
3382 default:
3383 /* should never happen, but just in case ... */
3384 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3385 return NULL;
3386 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003387}
3388PyObject* ast2obj_operator(operator_ty o)
3389{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003390 switch(o) {
3391 case Add:
3392 Py_INCREF(Add_singleton);
3393 return Add_singleton;
3394 case Sub:
3395 Py_INCREF(Sub_singleton);
3396 return Sub_singleton;
3397 case Mult:
3398 Py_INCREF(Mult_singleton);
3399 return Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003400 case MatMult:
3401 Py_INCREF(MatMult_singleton);
3402 return MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003403 case Div:
3404 Py_INCREF(Div_singleton);
3405 return Div_singleton;
3406 case Mod:
3407 Py_INCREF(Mod_singleton);
3408 return Mod_singleton;
3409 case Pow:
3410 Py_INCREF(Pow_singleton);
3411 return Pow_singleton;
3412 case LShift:
3413 Py_INCREF(LShift_singleton);
3414 return LShift_singleton;
3415 case RShift:
3416 Py_INCREF(RShift_singleton);
3417 return RShift_singleton;
3418 case BitOr:
3419 Py_INCREF(BitOr_singleton);
3420 return BitOr_singleton;
3421 case BitXor:
3422 Py_INCREF(BitXor_singleton);
3423 return BitXor_singleton;
3424 case BitAnd:
3425 Py_INCREF(BitAnd_singleton);
3426 return BitAnd_singleton;
3427 case FloorDiv:
3428 Py_INCREF(FloorDiv_singleton);
3429 return FloorDiv_singleton;
3430 default:
3431 /* should never happen, but just in case ... */
3432 PyErr_Format(PyExc_SystemError, "unknown operator found");
3433 return NULL;
3434 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003435}
3436PyObject* ast2obj_unaryop(unaryop_ty o)
3437{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003438 switch(o) {
3439 case Invert:
3440 Py_INCREF(Invert_singleton);
3441 return Invert_singleton;
3442 case Not:
3443 Py_INCREF(Not_singleton);
3444 return Not_singleton;
3445 case UAdd:
3446 Py_INCREF(UAdd_singleton);
3447 return UAdd_singleton;
3448 case USub:
3449 Py_INCREF(USub_singleton);
3450 return USub_singleton;
3451 default:
3452 /* should never happen, but just in case ... */
3453 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3454 return NULL;
3455 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003456}
3457PyObject* ast2obj_cmpop(cmpop_ty o)
3458{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003459 switch(o) {
3460 case Eq:
3461 Py_INCREF(Eq_singleton);
3462 return Eq_singleton;
3463 case NotEq:
3464 Py_INCREF(NotEq_singleton);
3465 return NotEq_singleton;
3466 case Lt:
3467 Py_INCREF(Lt_singleton);
3468 return Lt_singleton;
3469 case LtE:
3470 Py_INCREF(LtE_singleton);
3471 return LtE_singleton;
3472 case Gt:
3473 Py_INCREF(Gt_singleton);
3474 return Gt_singleton;
3475 case GtE:
3476 Py_INCREF(GtE_singleton);
3477 return GtE_singleton;
3478 case Is:
3479 Py_INCREF(Is_singleton);
3480 return Is_singleton;
3481 case IsNot:
3482 Py_INCREF(IsNot_singleton);
3483 return IsNot_singleton;
3484 case In:
3485 Py_INCREF(In_singleton);
3486 return In_singleton;
3487 case NotIn:
3488 Py_INCREF(NotIn_singleton);
3489 return NotIn_singleton;
3490 default:
3491 /* should never happen, but just in case ... */
3492 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3493 return NULL;
3494 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003495}
3496PyObject*
3497ast2obj_comprehension(void* _o)
3498{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003499 comprehension_ty o = (comprehension_ty)_o;
3500 PyObject *result = NULL, *value = NULL;
3501 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003502 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003503 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003504
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003505 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3506 if (!result) return NULL;
3507 value = ast2obj_expr(o->target);
3508 if (!value) goto failed;
3509 if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
3510 goto failed;
3511 Py_DECREF(value);
3512 value = ast2obj_expr(o->iter);
3513 if (!value) goto failed;
3514 if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
3515 goto failed;
3516 Py_DECREF(value);
3517 value = ast2obj_list(o->ifs, ast2obj_expr);
3518 if (!value) goto failed;
3519 if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
3520 goto failed;
3521 Py_DECREF(value);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003522 value = ast2obj_int(o->is_async);
3523 if (!value) goto failed;
3524 if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1)
3525 goto failed;
3526 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003527 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003528failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003529 Py_XDECREF(value);
3530 Py_XDECREF(result);
3531 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003532}
3533
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003534PyObject*
3535ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003537 excepthandler_ty o = (excepthandler_ty)_o;
3538 PyObject *result = NULL, *value = NULL;
3539 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003540 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003541 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003542
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003543 switch (o->kind) {
3544 case ExceptHandler_kind:
3545 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3546 if (!result) goto failed;
3547 value = ast2obj_expr(o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003548 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003549 if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
3550 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003551 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003552 value = ast2obj_identifier(o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003553 if (!value) goto failed;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003554 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3555 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003556 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003557 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3558 if (!value) goto failed;
3559 if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
3560 goto failed;
3561 Py_DECREF(value);
3562 break;
3563 }
3564 value = ast2obj_int(o->lineno);
3565 if (!value) goto failed;
3566 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3567 goto failed;
3568 Py_DECREF(value);
3569 value = ast2obj_int(o->col_offset);
3570 if (!value) goto failed;
3571 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3572 goto failed;
3573 Py_DECREF(value);
3574 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003575failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003576 Py_XDECREF(value);
3577 Py_XDECREF(result);
3578 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003579}
3580
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003581PyObject*
3582ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003583{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003584 arguments_ty o = (arguments_ty)_o;
3585 PyObject *result = NULL, *value = NULL;
3586 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003587 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003588 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003589
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003590 result = PyType_GenericNew(arguments_type, NULL, NULL);
3591 if (!result) return NULL;
3592 value = ast2obj_list(o->args, ast2obj_arg);
3593 if (!value) goto failed;
3594 if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
3595 goto failed;
3596 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003597 value = ast2obj_arg(o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003598 if (!value) goto failed;
3599 if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
3600 goto failed;
3601 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003602 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
3603 if (!value) goto failed;
3604 if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
3605 goto failed;
3606 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003607 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003608 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003609 if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003610 goto failed;
3611 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003612 value = ast2obj_arg(o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003613 if (!value) goto failed;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003614 if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003615 goto failed;
3616 Py_DECREF(value);
3617 value = ast2obj_list(o->defaults, ast2obj_expr);
3618 if (!value) goto failed;
3619 if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
3620 goto failed;
3621 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003622 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003623failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003624 Py_XDECREF(value);
3625 Py_XDECREF(result);
3626 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627}
3628
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003629PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003630ast2obj_arg(void* _o)
3631{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003632 arg_ty o = (arg_ty)_o;
3633 PyObject *result = NULL, *value = NULL;
3634 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003635 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003636 }
Neal Norwitzc1505362006-12-28 06:47:50 +00003637
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003638 result = PyType_GenericNew(arg_type, NULL, NULL);
3639 if (!result) return NULL;
3640 value = ast2obj_identifier(o->arg);
3641 if (!value) goto failed;
3642 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3643 goto failed;
3644 Py_DECREF(value);
3645 value = ast2obj_expr(o->annotation);
3646 if (!value) goto failed;
3647 if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
3648 goto failed;
3649 Py_DECREF(value);
Victor Stinneree4b59c2013-07-27 00:01:35 +02003650 value = ast2obj_int(o->lineno);
3651 if (!value) goto failed;
3652 if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
3653 goto failed;
3654 Py_DECREF(value);
3655 value = ast2obj_int(o->col_offset);
3656 if (!value) goto failed;
3657 if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
3658 goto failed;
3659 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003660 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00003661failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003662 Py_XDECREF(value);
3663 Py_XDECREF(result);
3664 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003665}
3666
3667PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003668ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003669{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003670 keyword_ty o = (keyword_ty)_o;
3671 PyObject *result = NULL, *value = NULL;
3672 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003673 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003674 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003675
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003676 result = PyType_GenericNew(keyword_type, NULL, NULL);
3677 if (!result) return NULL;
3678 value = ast2obj_identifier(o->arg);
3679 if (!value) goto failed;
3680 if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
3681 goto failed;
3682 Py_DECREF(value);
3683 value = ast2obj_expr(o->value);
3684 if (!value) goto failed;
3685 if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
3686 goto failed;
3687 Py_DECREF(value);
3688 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003689failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003690 Py_XDECREF(value);
3691 Py_XDECREF(result);
3692 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003693}
3694
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003695PyObject*
3696ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003697{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003698 alias_ty o = (alias_ty)_o;
3699 PyObject *result = NULL, *value = NULL;
3700 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003701 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003702 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003703
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003704 result = PyType_GenericNew(alias_type, NULL, NULL);
3705 if (!result) return NULL;
3706 value = ast2obj_identifier(o->name);
3707 if (!value) goto failed;
3708 if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
3709 goto failed;
3710 Py_DECREF(value);
3711 value = ast2obj_identifier(o->asname);
3712 if (!value) goto failed;
3713 if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
3714 goto failed;
3715 Py_DECREF(value);
3716 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003717failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003718 Py_XDECREF(value);
3719 Py_XDECREF(result);
3720 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721}
3722
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003723PyObject*
3724ast2obj_withitem(void* _o)
3725{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003726 withitem_ty o = (withitem_ty)_o;
3727 PyObject *result = NULL, *value = NULL;
3728 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003729 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003730 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003731
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003732 result = PyType_GenericNew(withitem_type, NULL, NULL);
3733 if (!result) return NULL;
3734 value = ast2obj_expr(o->context_expr);
3735 if (!value) goto failed;
3736 if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
3737 goto failed;
3738 Py_DECREF(value);
3739 value = ast2obj_expr(o->optional_vars);
3740 if (!value) goto failed;
3741 if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
3742 goto failed;
3743 Py_DECREF(value);
3744 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003745failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003746 Py_XDECREF(value);
3747 Py_XDECREF(result);
3748 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003749}
3750
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003751
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003752int
3753obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3754{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003755 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003756
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003757 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003758
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003759 if (obj == Py_None) {
3760 *out = NULL;
3761 return 0;
3762 }
3763 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3764 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003765 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003766 }
3767 if (isinstance) {
3768 asdl_seq* body;
3769
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003770 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
3771 return 1;
3772 }
3773 if (tmp == NULL) {
3774 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
3775 return 1;
3776 }
3777 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003778 int res;
3779 Py_ssize_t len;
3780 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003781 if (!PyList_Check(tmp)) {
3782 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3783 goto failed;
3784 }
3785 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003786 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003787 if (body == NULL) goto failed;
3788 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003789 stmt_ty val;
3790 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003791 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03003792 if (len != PyList_GET_SIZE(tmp)) {
3793 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
3794 goto failed;
3795 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003796 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003797 }
Victor Stinner1acc1292013-07-27 00:03:47 +02003798 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003799 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03003800 *out = Module(body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003801 if (*out == NULL) goto failed;
3802 return 0;
3803 }
3804 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
3805 if (isinstance == -1) {
3806 return 1;
3807 }
3808 if (isinstance) {
3809 asdl_seq* body;
3810
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003811 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
3812 return 1;
3813 }
3814 if (tmp == NULL) {
3815 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
3816 return 1;
3817 }
3818 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003819 int res;
3820 Py_ssize_t len;
3821 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003822 if (!PyList_Check(tmp)) {
3823 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3824 goto failed;
3825 }
3826 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003827 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003828 if (body == NULL) goto failed;
3829 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003830 stmt_ty val;
3831 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003832 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03003833 if (len != PyList_GET_SIZE(tmp)) {
3834 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
3835 goto failed;
3836 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003837 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003838 }
Victor Stinner1acc1292013-07-27 00:03:47 +02003839 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003840 }
3841 *out = Interactive(body, arena);
3842 if (*out == NULL) goto failed;
3843 return 0;
3844 }
3845 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
3846 if (isinstance == -1) {
3847 return 1;
3848 }
3849 if (isinstance) {
3850 expr_ty body;
3851
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003852 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
3853 return 1;
3854 }
3855 if (tmp == NULL) {
3856 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
3857 return 1;
3858 }
3859 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003860 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003861 res = obj2ast_expr(tmp, &body, arena);
3862 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02003863 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003864 }
3865 *out = Expression(body, arena);
3866 if (*out == NULL) goto failed;
3867 return 0;
3868 }
3869 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
3870 if (isinstance == -1) {
3871 return 1;
3872 }
3873 if (isinstance) {
3874 asdl_seq* body;
3875
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003876 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
3877 return 1;
3878 }
3879 if (tmp == NULL) {
3880 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
3881 return 1;
3882 }
3883 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003884 int res;
3885 Py_ssize_t len;
3886 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003887 if (!PyList_Check(tmp)) {
3888 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3889 goto failed;
3890 }
3891 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02003892 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003893 if (body == NULL) goto failed;
3894 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003895 stmt_ty val;
3896 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003897 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03003898 if (len != PyList_GET_SIZE(tmp)) {
3899 PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
3900 goto failed;
3901 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07003902 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003903 }
Victor Stinner1acc1292013-07-27 00:03:47 +02003904 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003905 }
3906 *out = Suite(body, arena);
3907 if (*out == NULL) goto failed;
3908 return 0;
3909 }
3910
3911 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
3912 failed:
3913 Py_XDECREF(tmp);
3914 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003915}
3916
3917int
3918obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
3919{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003920 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003921
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003922 PyObject *tmp = NULL;
3923 int lineno;
3924 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003925
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003926 if (obj == Py_None) {
3927 *out = NULL;
3928 return 0;
3929 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003930 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
3931 return 1;
3932 }
3933 if (tmp == NULL) {
3934 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
3935 return 1;
3936 }
3937 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003938 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003939 res = obj2ast_int(tmp, &lineno, arena);
3940 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02003941 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003942 }
3943 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003944 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003945 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003946 if (tmp == NULL) {
3947 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
3948 return 1;
3949 }
3950 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003951 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003952 res = obj2ast_int(tmp, &col_offset, arena);
3953 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02003954 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003955 }
3956 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
3957 if (isinstance == -1) {
3958 return 1;
3959 }
3960 if (isinstance) {
3961 identifier name;
3962 arguments_ty args;
3963 asdl_seq* body;
3964 asdl_seq* decorator_list;
3965 expr_ty returns;
3966
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003967 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
3968 return 1;
3969 }
3970 if (tmp == NULL) {
3971 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
3972 return 1;
3973 }
3974 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003975 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003976 res = obj2ast_identifier(tmp, &name, arena);
3977 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02003978 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003979 }
3980 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003981 return 1;
3982 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003983 if (tmp == NULL) {
3984 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
3985 return 1;
3986 }
3987 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003988 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003989 res = obj2ast_arguments(tmp, &args, arena);
3990 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02003991 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003992 }
3993 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003994 return 1;
3995 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02003996 if (tmp == NULL) {
3997 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
3998 return 1;
3999 }
4000 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004001 int res;
4002 Py_ssize_t len;
4003 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004004 if (!PyList_Check(tmp)) {
4005 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4006 goto failed;
4007 }
4008 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004009 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004010 if (body == NULL) goto failed;
4011 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004012 stmt_ty val;
4013 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004014 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004015 if (len != PyList_GET_SIZE(tmp)) {
4016 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
4017 goto failed;
4018 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004019 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004020 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004021 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004022 }
4023 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004024 return 1;
4025 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004026 if (tmp == NULL) {
4027 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
4028 return 1;
4029 }
4030 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004031 int res;
4032 Py_ssize_t len;
4033 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004034 if (!PyList_Check(tmp)) {
4035 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4036 goto failed;
4037 }
4038 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004039 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004040 if (decorator_list == NULL) goto failed;
4041 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004042 expr_ty val;
4043 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004044 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004045 if (len != PyList_GET_SIZE(tmp)) {
4046 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
4047 goto failed;
4048 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004049 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004050 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004051 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004052 }
4053 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004054 return 1;
4055 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004056 if (tmp == NULL || tmp == Py_None) {
4057 Py_CLEAR(tmp);
4058 returns = NULL;
4059 }
4060 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004061 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004062 res = obj2ast_expr(tmp, &returns, arena);
4063 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004064 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004065 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004066 *out = FunctionDef(name, args, body, decorator_list, returns, lineno,
4067 col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004068 if (*out == NULL) goto failed;
4069 return 0;
4070 }
Yury Selivanov75445082015-05-11 22:57:16 -04004071 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type);
4072 if (isinstance == -1) {
4073 return 1;
4074 }
4075 if (isinstance) {
4076 identifier name;
4077 arguments_ty args;
4078 asdl_seq* body;
4079 asdl_seq* decorator_list;
4080 expr_ty returns;
4081
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004082 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4083 return 1;
4084 }
4085 if (tmp == NULL) {
4086 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
4087 return 1;
4088 }
4089 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004090 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004091 res = obj2ast_identifier(tmp, &name, arena);
4092 if (res != 0) goto failed;
4093 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004094 }
4095 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004096 return 1;
4097 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004098 if (tmp == NULL) {
4099 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
4100 return 1;
4101 }
4102 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004103 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004104 res = obj2ast_arguments(tmp, &args, arena);
4105 if (res != 0) goto failed;
4106 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004107 }
4108 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004109 return 1;
4110 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004111 if (tmp == NULL) {
4112 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
4113 return 1;
4114 }
4115 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004116 int res;
4117 Py_ssize_t len;
4118 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004119 if (!PyList_Check(tmp)) {
4120 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4121 goto failed;
4122 }
4123 len = PyList_GET_SIZE(tmp);
4124 body = _Py_asdl_seq_new(len, arena);
4125 if (body == NULL) goto failed;
4126 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004127 stmt_ty val;
4128 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004129 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004130 if (len != PyList_GET_SIZE(tmp)) {
4131 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
4132 goto failed;
4133 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004134 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004135 }
4136 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004137 }
4138 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004139 return 1;
4140 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004141 if (tmp == NULL) {
4142 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
4143 return 1;
4144 }
4145 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004146 int res;
4147 Py_ssize_t len;
4148 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004149 if (!PyList_Check(tmp)) {
4150 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4151 goto failed;
4152 }
4153 len = PyList_GET_SIZE(tmp);
4154 decorator_list = _Py_asdl_seq_new(len, arena);
4155 if (decorator_list == NULL) goto failed;
4156 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004157 expr_ty val;
4158 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004159 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004160 if (len != PyList_GET_SIZE(tmp)) {
4161 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
4162 goto failed;
4163 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004164 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004165 }
4166 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004167 }
4168 if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004169 return 1;
4170 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004171 if (tmp == NULL || tmp == Py_None) {
4172 Py_CLEAR(tmp);
4173 returns = NULL;
4174 }
4175 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004176 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004177 res = obj2ast_expr(tmp, &returns, arena);
4178 if (res != 0) goto failed;
4179 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004180 }
4181 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004182 lineno, col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004183 if (*out == NULL) goto failed;
4184 return 0;
4185 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004186 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
4187 if (isinstance == -1) {
4188 return 1;
4189 }
4190 if (isinstance) {
4191 identifier name;
4192 asdl_seq* bases;
4193 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004194 asdl_seq* body;
4195 asdl_seq* decorator_list;
4196
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004197 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
4198 return 1;
4199 }
4200 if (tmp == NULL) {
4201 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
4202 return 1;
4203 }
4204 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004205 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004206 res = obj2ast_identifier(tmp, &name, arena);
4207 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004208 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004209 }
4210 if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004211 return 1;
4212 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004213 if (tmp == NULL) {
4214 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
4215 return 1;
4216 }
4217 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004218 int res;
4219 Py_ssize_t len;
4220 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004221 if (!PyList_Check(tmp)) {
4222 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4223 goto failed;
4224 }
4225 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004226 bases = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004227 if (bases == NULL) goto failed;
4228 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004229 expr_ty val;
4230 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004231 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004232 if (len != PyList_GET_SIZE(tmp)) {
4233 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
4234 goto failed;
4235 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004236 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004237 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004238 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004239 }
4240 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004241 return 1;
4242 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004243 if (tmp == NULL) {
4244 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
4245 return 1;
4246 }
4247 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004248 int res;
4249 Py_ssize_t len;
4250 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004251 if (!PyList_Check(tmp)) {
4252 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4253 goto failed;
4254 }
4255 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004256 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004257 if (keywords == NULL) goto failed;
4258 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004259 keyword_ty val;
4260 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004261 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004262 if (len != PyList_GET_SIZE(tmp)) {
4263 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
4264 goto failed;
4265 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004266 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004267 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004268 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004269 }
4270 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004271 return 1;
4272 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004273 if (tmp == NULL) {
4274 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
4275 return 1;
4276 }
4277 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004278 int res;
4279 Py_ssize_t len;
4280 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004281 if (!PyList_Check(tmp)) {
4282 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4283 goto failed;
4284 }
4285 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004286 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004287 if (body == NULL) goto failed;
4288 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004289 stmt_ty val;
4290 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004291 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004292 if (len != PyList_GET_SIZE(tmp)) {
4293 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
4294 goto failed;
4295 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004296 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004297 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004298 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004299 }
4300 if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004301 return 1;
4302 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004303 if (tmp == NULL) {
4304 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
4305 return 1;
4306 }
4307 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004308 int res;
4309 Py_ssize_t len;
4310 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004311 if (!PyList_Check(tmp)) {
4312 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4313 goto failed;
4314 }
4315 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004316 decorator_list = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004317 if (decorator_list == NULL) goto failed;
4318 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004319 expr_ty val;
4320 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004321 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004322 if (len != PyList_GET_SIZE(tmp)) {
4323 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
4324 goto failed;
4325 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004326 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004327 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004328 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004329 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03004330 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
4331 col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004332 if (*out == NULL) goto failed;
4333 return 0;
4334 }
4335 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
4336 if (isinstance == -1) {
4337 return 1;
4338 }
4339 if (isinstance) {
4340 expr_ty value;
4341
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004342 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
4343 return 1;
4344 }
4345 if (tmp == NULL || tmp == Py_None) {
4346 Py_CLEAR(tmp);
4347 value = NULL;
4348 }
4349 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004350 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004351 res = obj2ast_expr(tmp, &value, arena);
4352 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004353 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004354 }
4355 *out = Return(value, lineno, col_offset, arena);
4356 if (*out == NULL) goto failed;
4357 return 0;
4358 }
4359 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
4360 if (isinstance == -1) {
4361 return 1;
4362 }
4363 if (isinstance) {
4364 asdl_seq* targets;
4365
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004366 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4367 return 1;
4368 }
4369 if (tmp == NULL) {
4370 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
4371 return 1;
4372 }
4373 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004374 int res;
4375 Py_ssize_t len;
4376 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004377 if (!PyList_Check(tmp)) {
4378 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4379 goto failed;
4380 }
4381 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004382 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004383 if (targets == NULL) goto failed;
4384 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004385 expr_ty val;
4386 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004387 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004388 if (len != PyList_GET_SIZE(tmp)) {
4389 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
4390 goto failed;
4391 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004392 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004393 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004394 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004395 }
4396 *out = Delete(targets, lineno, col_offset, arena);
4397 if (*out == NULL) goto failed;
4398 return 0;
4399 }
4400 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
4401 if (isinstance == -1) {
4402 return 1;
4403 }
4404 if (isinstance) {
4405 asdl_seq* targets;
4406 expr_ty value;
4407
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004408 if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) {
4409 return 1;
4410 }
4411 if (tmp == NULL) {
4412 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
4413 return 1;
4414 }
4415 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004416 int res;
4417 Py_ssize_t len;
4418 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004419 if (!PyList_Check(tmp)) {
4420 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4421 goto failed;
4422 }
4423 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004424 targets = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004425 if (targets == NULL) goto failed;
4426 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004427 expr_ty val;
4428 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004429 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004430 if (len != PyList_GET_SIZE(tmp)) {
4431 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
4432 goto failed;
4433 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004434 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004435 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004436 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004437 }
4438 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004439 return 1;
4440 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004441 if (tmp == NULL) {
4442 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4443 return 1;
4444 }
4445 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004446 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004447 res = obj2ast_expr(tmp, &value, arena);
4448 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004449 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004450 }
4451 *out = Assign(targets, value, lineno, col_offset, arena);
4452 if (*out == NULL) goto failed;
4453 return 0;
4454 }
4455 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
4456 if (isinstance == -1) {
4457 return 1;
4458 }
4459 if (isinstance) {
4460 expr_ty target;
4461 operator_ty op;
4462 expr_ty value;
4463
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004464 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4465 return 1;
4466 }
4467 if (tmp == NULL) {
4468 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
4469 return 1;
4470 }
4471 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004472 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004473 res = obj2ast_expr(tmp, &target, arena);
4474 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004475 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004476 }
4477 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004478 return 1;
4479 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004480 if (tmp == NULL) {
4481 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
4482 return 1;
4483 }
4484 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004485 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004486 res = obj2ast_operator(tmp, &op, arena);
4487 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004488 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004489 }
4490 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004491 return 1;
4492 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004493 if (tmp == NULL) {
4494 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
4495 return 1;
4496 }
4497 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004498 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004499 res = obj2ast_expr(tmp, &value, arena);
4500 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004501 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004502 }
4503 *out = AugAssign(target, op, value, lineno, col_offset, arena);
4504 if (*out == NULL) goto failed;
4505 return 0;
4506 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004507 isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type);
4508 if (isinstance == -1) {
4509 return 1;
4510 }
4511 if (isinstance) {
4512 expr_ty target;
4513 expr_ty annotation;
4514 expr_ty value;
4515 int simple;
4516
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004517 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4518 return 1;
4519 }
4520 if (tmp == NULL) {
4521 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
4522 return 1;
4523 }
4524 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004525 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004526 res = obj2ast_expr(tmp, &target, arena);
4527 if (res != 0) goto failed;
4528 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004529 }
4530 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004531 return 1;
4532 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004533 if (tmp == NULL) {
4534 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
4535 return 1;
4536 }
4537 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004538 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004539 res = obj2ast_expr(tmp, &annotation, arena);
4540 if (res != 0) goto failed;
4541 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004542 }
4543 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004544 return 1;
4545 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004546 if (tmp == NULL || tmp == Py_None) {
4547 Py_CLEAR(tmp);
4548 value = NULL;
4549 }
4550 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004551 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004552 res = obj2ast_expr(tmp, &value, arena);
4553 if (res != 0) goto failed;
4554 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004555 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004556 if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) {
4557 return 1;
4558 }
4559 if (tmp == NULL) {
4560 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
4561 return 1;
4562 }
4563 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004564 int res;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004565 res = obj2ast_int(tmp, &simple, arena);
4566 if (res != 0) goto failed;
4567 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004568 }
4569 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
4570 arena);
4571 if (*out == NULL) goto failed;
4572 return 0;
4573 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004574 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
4575 if (isinstance == -1) {
4576 return 1;
4577 }
4578 if (isinstance) {
4579 expr_ty target;
4580 expr_ty iter;
4581 asdl_seq* body;
4582 asdl_seq* orelse;
4583
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004584 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4585 return 1;
4586 }
4587 if (tmp == NULL) {
4588 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4589 return 1;
4590 }
4591 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004592 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004593 res = obj2ast_expr(tmp, &target, arena);
4594 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004595 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004596 }
4597 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004598 return 1;
4599 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004600 if (tmp == NULL) {
4601 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4602 return 1;
4603 }
4604 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004605 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004606 res = obj2ast_expr(tmp, &iter, arena);
4607 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004608 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004609 }
4610 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004611 return 1;
4612 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004613 if (tmp == NULL) {
4614 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4615 return 1;
4616 }
4617 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004618 int res;
4619 Py_ssize_t len;
4620 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004621 if (!PyList_Check(tmp)) {
4622 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4623 goto failed;
4624 }
4625 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004626 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004627 if (body == NULL) goto failed;
4628 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004629 stmt_ty val;
4630 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004631 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004632 if (len != PyList_GET_SIZE(tmp)) {
4633 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
4634 goto failed;
4635 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004636 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004637 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004638 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004639 }
4640 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004641 return 1;
4642 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004643 if (tmp == NULL) {
4644 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4645 return 1;
4646 }
4647 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004648 int res;
4649 Py_ssize_t len;
4650 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004651 if (!PyList_Check(tmp)) {
4652 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4653 goto failed;
4654 }
4655 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004656 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004657 if (orelse == NULL) goto failed;
4658 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004659 stmt_ty val;
4660 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004661 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004662 if (len != PyList_GET_SIZE(tmp)) {
4663 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
4664 goto failed;
4665 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004666 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004667 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004668 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004669 }
4670 *out = For(target, iter, body, orelse, lineno, col_offset, arena);
4671 if (*out == NULL) goto failed;
4672 return 0;
4673 }
Yury Selivanov75445082015-05-11 22:57:16 -04004674 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type);
4675 if (isinstance == -1) {
4676 return 1;
4677 }
4678 if (isinstance) {
4679 expr_ty target;
4680 expr_ty iter;
4681 asdl_seq* body;
4682 asdl_seq* orelse;
4683
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004684 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
4685 return 1;
4686 }
4687 if (tmp == NULL) {
4688 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
4689 return 1;
4690 }
4691 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004692 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004693 res = obj2ast_expr(tmp, &target, arena);
4694 if (res != 0) goto failed;
4695 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004696 }
4697 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004698 return 1;
4699 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004700 if (tmp == NULL) {
4701 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
4702 return 1;
4703 }
4704 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004705 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04004706 res = obj2ast_expr(tmp, &iter, arena);
4707 if (res != 0) goto failed;
4708 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004709 }
4710 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004711 return 1;
4712 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004713 if (tmp == NULL) {
4714 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
4715 return 1;
4716 }
4717 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004718 int res;
4719 Py_ssize_t len;
4720 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004721 if (!PyList_Check(tmp)) {
4722 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4723 goto failed;
4724 }
4725 len = PyList_GET_SIZE(tmp);
4726 body = _Py_asdl_seq_new(len, arena);
4727 if (body == NULL) goto failed;
4728 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004729 stmt_ty val;
4730 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004731 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004732 if (len != PyList_GET_SIZE(tmp)) {
4733 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
4734 goto failed;
4735 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004736 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004737 }
4738 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004739 }
4740 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04004741 return 1;
4742 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004743 if (tmp == NULL) {
4744 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
4745 return 1;
4746 }
4747 else {
Yury Selivanov75445082015-05-11 22:57:16 -04004748 int res;
4749 Py_ssize_t len;
4750 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04004751 if (!PyList_Check(tmp)) {
4752 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4753 goto failed;
4754 }
4755 len = PyList_GET_SIZE(tmp);
4756 orelse = _Py_asdl_seq_new(len, arena);
4757 if (orelse == NULL) goto failed;
4758 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004759 stmt_ty val;
4760 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04004761 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004762 if (len != PyList_GET_SIZE(tmp)) {
4763 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
4764 goto failed;
4765 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004766 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04004767 }
4768 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04004769 }
4770 *out = AsyncFor(target, iter, body, orelse, lineno, col_offset, arena);
4771 if (*out == NULL) goto failed;
4772 return 0;
4773 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004774 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
4775 if (isinstance == -1) {
4776 return 1;
4777 }
4778 if (isinstance) {
4779 expr_ty test;
4780 asdl_seq* body;
4781 asdl_seq* orelse;
4782
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004783 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
4784 return 1;
4785 }
4786 if (tmp == NULL) {
4787 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
4788 return 1;
4789 }
4790 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004791 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004792 res = obj2ast_expr(tmp, &test, arena);
4793 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004794 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004795 }
4796 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004797 return 1;
4798 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004799 if (tmp == NULL) {
4800 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
4801 return 1;
4802 }
4803 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004804 int res;
4805 Py_ssize_t len;
4806 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004807 if (!PyList_Check(tmp)) {
4808 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4809 goto failed;
4810 }
4811 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004812 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004813 if (body == NULL) goto failed;
4814 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004815 stmt_ty val;
4816 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004817 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004818 if (len != PyList_GET_SIZE(tmp)) {
4819 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
4820 goto failed;
4821 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004822 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004823 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004824 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004825 }
4826 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004827 return 1;
4828 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004829 if (tmp == NULL) {
4830 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
4831 return 1;
4832 }
4833 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004834 int res;
4835 Py_ssize_t len;
4836 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004837 if (!PyList_Check(tmp)) {
4838 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4839 goto failed;
4840 }
4841 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004842 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004843 if (orelse == NULL) goto failed;
4844 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004845 stmt_ty val;
4846 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004847 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004848 if (len != PyList_GET_SIZE(tmp)) {
4849 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
4850 goto failed;
4851 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004852 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004853 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004854 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004855 }
4856 *out = While(test, body, orelse, lineno, col_offset, arena);
4857 if (*out == NULL) goto failed;
4858 return 0;
4859 }
4860 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
4861 if (isinstance == -1) {
4862 return 1;
4863 }
4864 if (isinstance) {
4865 expr_ty test;
4866 asdl_seq* body;
4867 asdl_seq* orelse;
4868
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004869 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
4870 return 1;
4871 }
4872 if (tmp == NULL) {
4873 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
4874 return 1;
4875 }
4876 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004877 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004878 res = obj2ast_expr(tmp, &test, arena);
4879 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02004880 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004881 }
4882 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004883 return 1;
4884 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004885 if (tmp == NULL) {
4886 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
4887 return 1;
4888 }
4889 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004890 int res;
4891 Py_ssize_t len;
4892 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004893 if (!PyList_Check(tmp)) {
4894 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4895 goto failed;
4896 }
4897 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004898 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004899 if (body == NULL) goto failed;
4900 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004901 stmt_ty val;
4902 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004903 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004904 if (len != PyList_GET_SIZE(tmp)) {
4905 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
4906 goto failed;
4907 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004908 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004909 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004910 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004911 }
4912 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004913 return 1;
4914 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004915 if (tmp == NULL) {
4916 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
4917 return 1;
4918 }
4919 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004920 int res;
4921 Py_ssize_t len;
4922 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004923 if (!PyList_Check(tmp)) {
4924 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4925 goto failed;
4926 }
4927 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004928 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004929 if (orelse == NULL) goto failed;
4930 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004931 stmt_ty val;
4932 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004933 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004934 if (len != PyList_GET_SIZE(tmp)) {
4935 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
4936 goto failed;
4937 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004938 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004939 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004940 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004941 }
4942 *out = If(test, body, orelse, lineno, col_offset, arena);
4943 if (*out == NULL) goto failed;
4944 return 0;
4945 }
4946 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
4947 if (isinstance == -1) {
4948 return 1;
4949 }
4950 if (isinstance) {
4951 asdl_seq* items;
4952 asdl_seq* body;
4953
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004954 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
4955 return 1;
4956 }
4957 if (tmp == NULL) {
4958 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
4959 return 1;
4960 }
4961 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004962 int res;
4963 Py_ssize_t len;
4964 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004965 if (!PyList_Check(tmp)) {
4966 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4967 goto failed;
4968 }
4969 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02004970 items = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004971 if (items == NULL) goto failed;
4972 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004973 withitem_ty val;
4974 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004975 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004976 if (len != PyList_GET_SIZE(tmp)) {
4977 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
4978 goto failed;
4979 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004980 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004981 }
Victor Stinner1acc1292013-07-27 00:03:47 +02004982 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004983 }
4984 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004985 return 1;
4986 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004987 if (tmp == NULL) {
4988 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
4989 return 1;
4990 }
4991 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004992 int res;
4993 Py_ssize_t len;
4994 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004995 if (!PyList_Check(tmp)) {
4996 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4997 goto failed;
4998 }
4999 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005000 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005001 if (body == NULL) goto failed;
5002 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005003 stmt_ty val;
5004 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005005 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005006 if (len != PyList_GET_SIZE(tmp)) {
5007 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
5008 goto failed;
5009 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005010 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005011 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005012 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005013 }
5014 *out = With(items, body, lineno, col_offset, arena);
5015 if (*out == NULL) goto failed;
5016 return 0;
5017 }
Yury Selivanov75445082015-05-11 22:57:16 -04005018 isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type);
5019 if (isinstance == -1) {
5020 return 1;
5021 }
5022 if (isinstance) {
5023 asdl_seq* items;
5024 asdl_seq* body;
5025
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005026 if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) {
5027 return 1;
5028 }
5029 if (tmp == NULL) {
5030 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
5031 return 1;
5032 }
5033 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005034 int res;
5035 Py_ssize_t len;
5036 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005037 if (!PyList_Check(tmp)) {
5038 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5039 goto failed;
5040 }
5041 len = PyList_GET_SIZE(tmp);
5042 items = _Py_asdl_seq_new(len, arena);
5043 if (items == NULL) goto failed;
5044 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005045 withitem_ty val;
5046 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005047 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005048 if (len != PyList_GET_SIZE(tmp)) {
5049 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
5050 goto failed;
5051 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005052 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005053 }
5054 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005055 }
5056 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005057 return 1;
5058 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005059 if (tmp == NULL) {
5060 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
5061 return 1;
5062 }
5063 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005064 int res;
5065 Py_ssize_t len;
5066 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005067 if (!PyList_Check(tmp)) {
5068 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5069 goto failed;
5070 }
5071 len = PyList_GET_SIZE(tmp);
5072 body = _Py_asdl_seq_new(len, arena);
5073 if (body == NULL) goto failed;
5074 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005075 stmt_ty val;
5076 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005077 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005078 if (len != PyList_GET_SIZE(tmp)) {
5079 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
5080 goto failed;
5081 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005082 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005083 }
5084 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005085 }
5086 *out = AsyncWith(items, body, lineno, col_offset, arena);
5087 if (*out == NULL) goto failed;
5088 return 0;
5089 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005090 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
5091 if (isinstance == -1) {
5092 return 1;
5093 }
5094 if (isinstance) {
5095 expr_ty exc;
5096 expr_ty cause;
5097
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005098 if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) {
5099 return 1;
5100 }
5101 if (tmp == NULL || tmp == Py_None) {
5102 Py_CLEAR(tmp);
5103 exc = NULL;
5104 }
5105 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005106 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005107 res = obj2ast_expr(tmp, &exc, arena);
5108 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005109 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005110 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005111 if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) {
5112 return 1;
5113 }
5114 if (tmp == NULL || tmp == Py_None) {
5115 Py_CLEAR(tmp);
5116 cause = NULL;
5117 }
5118 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005119 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005120 res = obj2ast_expr(tmp, &cause, arena);
5121 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005122 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005123 }
5124 *out = Raise(exc, cause, lineno, col_offset, arena);
5125 if (*out == NULL) goto failed;
5126 return 0;
5127 }
5128 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
5129 if (isinstance == -1) {
5130 return 1;
5131 }
5132 if (isinstance) {
5133 asdl_seq* body;
5134 asdl_seq* handlers;
5135 asdl_seq* orelse;
5136 asdl_seq* finalbody;
5137
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005138 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
5139 return 1;
5140 }
5141 if (tmp == NULL) {
5142 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
5143 return 1;
5144 }
5145 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005146 int res;
5147 Py_ssize_t len;
5148 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005149 if (!PyList_Check(tmp)) {
5150 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5151 goto failed;
5152 }
5153 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005154 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005155 if (body == NULL) goto failed;
5156 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005157 stmt_ty val;
5158 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005159 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005160 if (len != PyList_GET_SIZE(tmp)) {
5161 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
5162 goto failed;
5163 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005164 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005165 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005166 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005167 }
5168 if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005169 return 1;
5170 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005171 if (tmp == NULL) {
5172 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
5173 return 1;
5174 }
5175 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005176 int res;
5177 Py_ssize_t len;
5178 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005179 if (!PyList_Check(tmp)) {
5180 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5181 goto failed;
5182 }
5183 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005184 handlers = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005185 if (handlers == NULL) goto failed;
5186 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005187 excepthandler_ty val;
5188 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005189 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005190 if (len != PyList_GET_SIZE(tmp)) {
5191 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
5192 goto failed;
5193 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005194 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005195 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005196 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005197 }
5198 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005199 return 1;
5200 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005201 if (tmp == NULL) {
5202 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
5203 return 1;
5204 }
5205 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005206 int res;
5207 Py_ssize_t len;
5208 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005209 if (!PyList_Check(tmp)) {
5210 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5211 goto failed;
5212 }
5213 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005214 orelse = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005215 if (orelse == NULL) goto failed;
5216 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005217 stmt_ty val;
5218 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005219 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005220 if (len != PyList_GET_SIZE(tmp)) {
5221 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
5222 goto failed;
5223 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005224 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005225 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005226 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005227 }
5228 if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005229 return 1;
5230 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005231 if (tmp == NULL) {
5232 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
5233 return 1;
5234 }
5235 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005236 int res;
5237 Py_ssize_t len;
5238 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005239 if (!PyList_Check(tmp)) {
5240 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5241 goto failed;
5242 }
5243 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005244 finalbody = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005245 if (finalbody == NULL) goto failed;
5246 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005247 stmt_ty val;
5248 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005249 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005250 if (len != PyList_GET_SIZE(tmp)) {
5251 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
5252 goto failed;
5253 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005254 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005255 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005256 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005257 }
5258 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
5259 arena);
5260 if (*out == NULL) goto failed;
5261 return 0;
5262 }
5263 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
5264 if (isinstance == -1) {
5265 return 1;
5266 }
5267 if (isinstance) {
5268 expr_ty test;
5269 expr_ty msg;
5270
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005271 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5272 return 1;
5273 }
5274 if (tmp == NULL) {
5275 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
5276 return 1;
5277 }
5278 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005279 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005280 res = obj2ast_expr(tmp, &test, arena);
5281 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005282 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005283 }
5284 if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005285 return 1;
5286 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005287 if (tmp == NULL || tmp == Py_None) {
5288 Py_CLEAR(tmp);
5289 msg = NULL;
5290 }
5291 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005292 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005293 res = obj2ast_expr(tmp, &msg, arena);
5294 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005295 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005296 }
5297 *out = Assert(test, msg, lineno, col_offset, arena);
5298 if (*out == NULL) goto failed;
5299 return 0;
5300 }
5301 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
5302 if (isinstance == -1) {
5303 return 1;
5304 }
5305 if (isinstance) {
5306 asdl_seq* names;
5307
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005308 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5309 return 1;
5310 }
5311 if (tmp == NULL) {
5312 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
5313 return 1;
5314 }
5315 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005316 int res;
5317 Py_ssize_t len;
5318 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005319 if (!PyList_Check(tmp)) {
5320 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5321 goto failed;
5322 }
5323 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005324 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005325 if (names == NULL) goto failed;
5326 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005327 alias_ty val;
5328 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005329 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005330 if (len != PyList_GET_SIZE(tmp)) {
5331 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
5332 goto failed;
5333 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005334 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005335 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005336 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005337 }
5338 *out = Import(names, lineno, col_offset, arena);
5339 if (*out == NULL) goto failed;
5340 return 0;
5341 }
5342 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
5343 if (isinstance == -1) {
5344 return 1;
5345 }
5346 if (isinstance) {
5347 identifier module;
5348 asdl_seq* names;
5349 int level;
5350
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005351 if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) {
5352 return 1;
5353 }
5354 if (tmp == NULL || tmp == Py_None) {
5355 Py_CLEAR(tmp);
5356 module = NULL;
5357 }
5358 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005359 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005360 res = obj2ast_identifier(tmp, &module, arena);
5361 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005362 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005363 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005364 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5365 return 1;
5366 }
5367 if (tmp == NULL) {
5368 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
5369 return 1;
5370 }
5371 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005372 int res;
5373 Py_ssize_t len;
5374 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005375 if (!PyList_Check(tmp)) {
5376 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5377 goto failed;
5378 }
5379 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005380 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005381 if (names == NULL) goto failed;
5382 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005383 alias_ty val;
5384 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005385 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005386 if (len != PyList_GET_SIZE(tmp)) {
5387 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
5388 goto failed;
5389 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005390 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005391 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005392 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005393 }
5394 if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005395 return 1;
5396 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005397 if (tmp == NULL || tmp == Py_None) {
5398 Py_CLEAR(tmp);
5399 level = 0;
5400 }
5401 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005402 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005403 res = obj2ast_int(tmp, &level, arena);
5404 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005405 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005406 }
5407 *out = ImportFrom(module, names, level, lineno, col_offset, arena);
5408 if (*out == NULL) goto failed;
5409 return 0;
5410 }
5411 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
5412 if (isinstance == -1) {
5413 return 1;
5414 }
5415 if (isinstance) {
5416 asdl_seq* names;
5417
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005418 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5419 return 1;
5420 }
5421 if (tmp == NULL) {
5422 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
5423 return 1;
5424 }
5425 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005426 int res;
5427 Py_ssize_t len;
5428 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005429 if (!PyList_Check(tmp)) {
5430 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5431 goto failed;
5432 }
5433 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005434 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005435 if (names == NULL) goto failed;
5436 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005437 identifier val;
5438 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005439 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005440 if (len != PyList_GET_SIZE(tmp)) {
5441 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
5442 goto failed;
5443 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005444 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005445 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005446 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005447 }
5448 *out = Global(names, lineno, col_offset, arena);
5449 if (*out == NULL) goto failed;
5450 return 0;
5451 }
5452 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
5453 if (isinstance == -1) {
5454 return 1;
5455 }
5456 if (isinstance) {
5457 asdl_seq* names;
5458
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005459 if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) {
5460 return 1;
5461 }
5462 if (tmp == NULL) {
5463 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
5464 return 1;
5465 }
5466 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005467 int res;
5468 Py_ssize_t len;
5469 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005470 if (!PyList_Check(tmp)) {
5471 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5472 goto failed;
5473 }
5474 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005475 names = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005476 if (names == NULL) goto failed;
5477 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005478 identifier val;
5479 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005480 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005481 if (len != PyList_GET_SIZE(tmp)) {
5482 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
5483 goto failed;
5484 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005485 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005486 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005487 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005488 }
5489 *out = Nonlocal(names, lineno, col_offset, arena);
5490 if (*out == NULL) goto failed;
5491 return 0;
5492 }
5493 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
5494 if (isinstance == -1) {
5495 return 1;
5496 }
5497 if (isinstance) {
5498 expr_ty value;
5499
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005500 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
5501 return 1;
5502 }
5503 if (tmp == NULL) {
5504 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
5505 return 1;
5506 }
5507 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005508 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005509 res = obj2ast_expr(tmp, &value, arena);
5510 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005511 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005512 }
5513 *out = Expr(value, lineno, col_offset, arena);
5514 if (*out == NULL) goto failed;
5515 return 0;
5516 }
5517 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
5518 if (isinstance == -1) {
5519 return 1;
5520 }
5521 if (isinstance) {
5522
5523 *out = Pass(lineno, col_offset, arena);
5524 if (*out == NULL) goto failed;
5525 return 0;
5526 }
5527 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
5528 if (isinstance == -1) {
5529 return 1;
5530 }
5531 if (isinstance) {
5532
5533 *out = Break(lineno, col_offset, arena);
5534 if (*out == NULL) goto failed;
5535 return 0;
5536 }
5537 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
5538 if (isinstance == -1) {
5539 return 1;
5540 }
5541 if (isinstance) {
5542
5543 *out = Continue(lineno, col_offset, arena);
5544 if (*out == NULL) goto failed;
5545 return 0;
5546 }
5547
5548 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
5549 failed:
5550 Py_XDECREF(tmp);
5551 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005552}
5553
5554int
5555obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
5556{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005557 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005558
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005559 PyObject *tmp = NULL;
5560 int lineno;
5561 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005562
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005563 if (obj == Py_None) {
5564 *out = NULL;
5565 return 0;
5566 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005567 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
5568 return 1;
5569 }
5570 if (tmp == NULL) {
5571 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
5572 return 1;
5573 }
5574 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005575 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005576 res = obj2ast_int(tmp, &lineno, arena);
5577 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005578 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005579 }
5580 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005581 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005582 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005583 if (tmp == NULL) {
5584 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
5585 return 1;
5586 }
5587 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005588 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005589 res = obj2ast_int(tmp, &col_offset, arena);
5590 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005591 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005592 }
5593 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
5594 if (isinstance == -1) {
5595 return 1;
5596 }
5597 if (isinstance) {
5598 boolop_ty op;
5599 asdl_seq* values;
5600
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005601 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5602 return 1;
5603 }
5604 if (tmp == NULL) {
5605 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
5606 return 1;
5607 }
5608 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005609 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005610 res = obj2ast_boolop(tmp, &op, arena);
5611 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005612 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005613 }
5614 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005615 return 1;
5616 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005617 if (tmp == NULL) {
5618 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
5619 return 1;
5620 }
5621 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005622 int res;
5623 Py_ssize_t len;
5624 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005625 if (!PyList_Check(tmp)) {
5626 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5627 goto failed;
5628 }
5629 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005630 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005631 if (values == NULL) goto failed;
5632 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005633 expr_ty val;
5634 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005635 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005636 if (len != PyList_GET_SIZE(tmp)) {
5637 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
5638 goto failed;
5639 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005640 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005641 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005642 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005643 }
5644 *out = BoolOp(op, values, lineno, col_offset, arena);
5645 if (*out == NULL) goto failed;
5646 return 0;
5647 }
5648 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
5649 if (isinstance == -1) {
5650 return 1;
5651 }
5652 if (isinstance) {
5653 expr_ty left;
5654 operator_ty op;
5655 expr_ty right;
5656
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005657 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
5658 return 1;
5659 }
5660 if (tmp == NULL) {
5661 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
5662 return 1;
5663 }
5664 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005665 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005666 res = obj2ast_expr(tmp, &left, arena);
5667 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005668 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005669 }
5670 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005671 return 1;
5672 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005673 if (tmp == NULL) {
5674 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
5675 return 1;
5676 }
5677 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005678 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005679 res = obj2ast_operator(tmp, &op, arena);
5680 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005681 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005682 }
5683 if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005684 return 1;
5685 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005686 if (tmp == NULL) {
5687 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
5688 return 1;
5689 }
5690 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005691 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005692 res = obj2ast_expr(tmp, &right, arena);
5693 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005694 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005695 }
5696 *out = BinOp(left, op, right, lineno, col_offset, arena);
5697 if (*out == NULL) goto failed;
5698 return 0;
5699 }
5700 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
5701 if (isinstance == -1) {
5702 return 1;
5703 }
5704 if (isinstance) {
5705 unaryop_ty op;
5706 expr_ty operand;
5707
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005708 if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) {
5709 return 1;
5710 }
5711 if (tmp == NULL) {
5712 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
5713 return 1;
5714 }
5715 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005716 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005717 res = obj2ast_unaryop(tmp, &op, arena);
5718 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005719 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005720 }
5721 if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005722 return 1;
5723 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005724 if (tmp == NULL) {
5725 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
5726 return 1;
5727 }
5728 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005729 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005730 res = obj2ast_expr(tmp, &operand, arena);
5731 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005732 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005733 }
5734 *out = UnaryOp(op, operand, lineno, col_offset, arena);
5735 if (*out == NULL) goto failed;
5736 return 0;
5737 }
5738 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
5739 if (isinstance == -1) {
5740 return 1;
5741 }
5742 if (isinstance) {
5743 arguments_ty args;
5744 expr_ty body;
5745
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005746 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
5747 return 1;
5748 }
5749 if (tmp == NULL) {
5750 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
5751 return 1;
5752 }
5753 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005754 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005755 res = obj2ast_arguments(tmp, &args, arena);
5756 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005757 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005758 }
5759 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005760 return 1;
5761 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005762 if (tmp == NULL) {
5763 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
5764 return 1;
5765 }
5766 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005767 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005768 res = obj2ast_expr(tmp, &body, arena);
5769 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005770 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005771 }
5772 *out = Lambda(args, body, lineno, col_offset, arena);
5773 if (*out == NULL) goto failed;
5774 return 0;
5775 }
5776 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
5777 if (isinstance == -1) {
5778 return 1;
5779 }
5780 if (isinstance) {
5781 expr_ty test;
5782 expr_ty body;
5783 expr_ty orelse;
5784
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005785 if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) {
5786 return 1;
5787 }
5788 if (tmp == NULL) {
5789 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
5790 return 1;
5791 }
5792 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005793 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005794 res = obj2ast_expr(tmp, &test, arena);
5795 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005796 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005797 }
5798 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005799 return 1;
5800 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005801 if (tmp == NULL) {
5802 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
5803 return 1;
5804 }
5805 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005806 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005807 res = obj2ast_expr(tmp, &body, arena);
5808 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005809 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005810 }
5811 if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005812 return 1;
5813 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005814 if (tmp == NULL) {
5815 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
5816 return 1;
5817 }
5818 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005819 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005820 res = obj2ast_expr(tmp, &orelse, arena);
5821 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005822 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005823 }
5824 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
5825 if (*out == NULL) goto failed;
5826 return 0;
5827 }
5828 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
5829 if (isinstance == -1) {
5830 return 1;
5831 }
5832 if (isinstance) {
5833 asdl_seq* keys;
5834 asdl_seq* values;
5835
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005836 if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) {
5837 return 1;
5838 }
5839 if (tmp == NULL) {
5840 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
5841 return 1;
5842 }
5843 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005844 int res;
5845 Py_ssize_t len;
5846 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005847 if (!PyList_Check(tmp)) {
5848 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5849 goto failed;
5850 }
5851 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005852 keys = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005853 if (keys == NULL) goto failed;
5854 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005855 expr_ty val;
5856 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005857 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005858 if (len != PyList_GET_SIZE(tmp)) {
5859 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
5860 goto failed;
5861 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005862 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005863 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005864 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005865 }
5866 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005867 return 1;
5868 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005869 if (tmp == NULL) {
5870 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
5871 return 1;
5872 }
5873 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005874 int res;
5875 Py_ssize_t len;
5876 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005877 if (!PyList_Check(tmp)) {
5878 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5879 goto failed;
5880 }
5881 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005882 values = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005883 if (values == NULL) goto failed;
5884 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005885 expr_ty val;
5886 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005887 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005888 if (len != PyList_GET_SIZE(tmp)) {
5889 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
5890 goto failed;
5891 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005892 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005893 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005894 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005895 }
5896 *out = Dict(keys, values, lineno, col_offset, arena);
5897 if (*out == NULL) goto failed;
5898 return 0;
5899 }
5900 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
5901 if (isinstance == -1) {
5902 return 1;
5903 }
5904 if (isinstance) {
5905 asdl_seq* elts;
5906
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005907 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
5908 return 1;
5909 }
5910 if (tmp == NULL) {
5911 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
5912 return 1;
5913 }
5914 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005915 int res;
5916 Py_ssize_t len;
5917 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005918 if (!PyList_Check(tmp)) {
5919 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5920 goto failed;
5921 }
5922 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005923 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005924 if (elts == NULL) goto failed;
5925 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005926 expr_ty val;
5927 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005928 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005929 if (len != PyList_GET_SIZE(tmp)) {
5930 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
5931 goto failed;
5932 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005933 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005934 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005935 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005936 }
5937 *out = Set(elts, lineno, col_offset, arena);
5938 if (*out == NULL) goto failed;
5939 return 0;
5940 }
5941 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
5942 if (isinstance == -1) {
5943 return 1;
5944 }
5945 if (isinstance) {
5946 expr_ty elt;
5947 asdl_seq* generators;
5948
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005949 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
5950 return 1;
5951 }
5952 if (tmp == NULL) {
5953 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
5954 return 1;
5955 }
5956 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005957 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005958 res = obj2ast_expr(tmp, &elt, arena);
5959 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005960 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005961 }
5962 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005963 return 1;
5964 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005965 if (tmp == NULL) {
5966 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
5967 return 1;
5968 }
5969 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005970 int res;
5971 Py_ssize_t len;
5972 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005973 if (!PyList_Check(tmp)) {
5974 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5975 goto failed;
5976 }
5977 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02005978 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005979 if (generators == NULL) goto failed;
5980 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005981 comprehension_ty val;
5982 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005983 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005984 if (len != PyList_GET_SIZE(tmp)) {
5985 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
5986 goto failed;
5987 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005988 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005989 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005990 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005991 }
5992 *out = ListComp(elt, generators, lineno, col_offset, arena);
5993 if (*out == NULL) goto failed;
5994 return 0;
5995 }
5996 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
5997 if (isinstance == -1) {
5998 return 1;
5999 }
6000 if (isinstance) {
6001 expr_ty elt;
6002 asdl_seq* generators;
6003
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006004 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6005 return 1;
6006 }
6007 if (tmp == NULL) {
6008 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
6009 return 1;
6010 }
6011 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006012 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006013 res = obj2ast_expr(tmp, &elt, arena);
6014 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006015 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006016 }
6017 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006018 return 1;
6019 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006020 if (tmp == NULL) {
6021 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
6022 return 1;
6023 }
6024 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006025 int res;
6026 Py_ssize_t len;
6027 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006028 if (!PyList_Check(tmp)) {
6029 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6030 goto failed;
6031 }
6032 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006033 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006034 if (generators == NULL) goto failed;
6035 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006036 comprehension_ty val;
6037 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006038 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006039 if (len != PyList_GET_SIZE(tmp)) {
6040 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
6041 goto failed;
6042 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006043 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006044 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006045 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006046 }
6047 *out = SetComp(elt, generators, lineno, col_offset, arena);
6048 if (*out == NULL) goto failed;
6049 return 0;
6050 }
6051 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
6052 if (isinstance == -1) {
6053 return 1;
6054 }
6055 if (isinstance) {
6056 expr_ty key;
6057 expr_ty value;
6058 asdl_seq* generators;
6059
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006060 if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) {
6061 return 1;
6062 }
6063 if (tmp == NULL) {
6064 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
6065 return 1;
6066 }
6067 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006068 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006069 res = obj2ast_expr(tmp, &key, arena);
6070 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006071 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006072 }
6073 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006074 return 1;
6075 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006076 if (tmp == NULL) {
6077 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
6078 return 1;
6079 }
6080 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006081 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006082 res = obj2ast_expr(tmp, &value, arena);
6083 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006084 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006085 }
6086 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006087 return 1;
6088 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006089 if (tmp == NULL) {
6090 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
6091 return 1;
6092 }
6093 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006094 int res;
6095 Py_ssize_t len;
6096 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006097 if (!PyList_Check(tmp)) {
6098 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6099 goto failed;
6100 }
6101 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006102 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006103 if (generators == NULL) goto failed;
6104 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006105 comprehension_ty val;
6106 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006107 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006108 if (len != PyList_GET_SIZE(tmp)) {
6109 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
6110 goto failed;
6111 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006112 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006113 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006114 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006115 }
6116 *out = DictComp(key, value, generators, lineno, col_offset, arena);
6117 if (*out == NULL) goto failed;
6118 return 0;
6119 }
6120 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
6121 if (isinstance == -1) {
6122 return 1;
6123 }
6124 if (isinstance) {
6125 expr_ty elt;
6126 asdl_seq* generators;
6127
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006128 if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) {
6129 return 1;
6130 }
6131 if (tmp == NULL) {
6132 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
6133 return 1;
6134 }
6135 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006136 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006137 res = obj2ast_expr(tmp, &elt, arena);
6138 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006139 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006140 }
6141 if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006142 return 1;
6143 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006144 if (tmp == NULL) {
6145 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
6146 return 1;
6147 }
6148 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006149 int res;
6150 Py_ssize_t len;
6151 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006152 if (!PyList_Check(tmp)) {
6153 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6154 goto failed;
6155 }
6156 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006157 generators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006158 if (generators == NULL) goto failed;
6159 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006160 comprehension_ty val;
6161 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006162 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006163 if (len != PyList_GET_SIZE(tmp)) {
6164 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
6165 goto failed;
6166 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006167 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006168 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006169 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006170 }
6171 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
6172 if (*out == NULL) goto failed;
6173 return 0;
6174 }
Yury Selivanov75445082015-05-11 22:57:16 -04006175 isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type);
6176 if (isinstance == -1) {
6177 return 1;
6178 }
6179 if (isinstance) {
6180 expr_ty value;
6181
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006182 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6183 return 1;
6184 }
6185 if (tmp == NULL) {
6186 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
6187 return 1;
6188 }
6189 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006190 int res;
Yury Selivanov75445082015-05-11 22:57:16 -04006191 res = obj2ast_expr(tmp, &value, arena);
6192 if (res != 0) goto failed;
6193 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006194 }
6195 *out = Await(value, lineno, col_offset, arena);
6196 if (*out == NULL) goto failed;
6197 return 0;
6198 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006199 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
6200 if (isinstance == -1) {
6201 return 1;
6202 }
6203 if (isinstance) {
6204 expr_ty value;
6205
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006206 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6207 return 1;
6208 }
6209 if (tmp == NULL || tmp == Py_None) {
6210 Py_CLEAR(tmp);
6211 value = NULL;
6212 }
6213 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006214 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006215 res = obj2ast_expr(tmp, &value, arena);
6216 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006217 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006218 }
6219 *out = Yield(value, lineno, col_offset, arena);
6220 if (*out == NULL) goto failed;
6221 return 0;
6222 }
6223 isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
6224 if (isinstance == -1) {
6225 return 1;
6226 }
6227 if (isinstance) {
6228 expr_ty value;
6229
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006230 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6231 return 1;
6232 }
6233 if (tmp == NULL) {
6234 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
6235 return 1;
6236 }
6237 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006238 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006239 res = obj2ast_expr(tmp, &value, arena);
6240 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006241 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006242 }
6243 *out = YieldFrom(value, lineno, col_offset, arena);
6244 if (*out == NULL) goto failed;
6245 return 0;
6246 }
6247 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
6248 if (isinstance == -1) {
6249 return 1;
6250 }
6251 if (isinstance) {
6252 expr_ty left;
6253 asdl_int_seq* ops;
6254 asdl_seq* comparators;
6255
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006256 if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) {
6257 return 1;
6258 }
6259 if (tmp == NULL) {
6260 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
6261 return 1;
6262 }
6263 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006264 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006265 res = obj2ast_expr(tmp, &left, arena);
6266 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006267 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006268 }
6269 if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006270 return 1;
6271 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006272 if (tmp == NULL) {
6273 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
6274 return 1;
6275 }
6276 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006277 int res;
6278 Py_ssize_t len;
6279 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006280 if (!PyList_Check(tmp)) {
6281 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6282 goto failed;
6283 }
6284 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006285 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006286 if (ops == NULL) goto failed;
6287 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006288 cmpop_ty val;
6289 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006290 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006291 if (len != PyList_GET_SIZE(tmp)) {
6292 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
6293 goto failed;
6294 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006295 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006296 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006297 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006298 }
6299 if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006300 return 1;
6301 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006302 if (tmp == NULL) {
6303 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
6304 return 1;
6305 }
6306 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006307 int res;
6308 Py_ssize_t len;
6309 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006310 if (!PyList_Check(tmp)) {
6311 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6312 goto failed;
6313 }
6314 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006315 comparators = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006316 if (comparators == NULL) goto failed;
6317 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006318 expr_ty val;
6319 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006320 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006321 if (len != PyList_GET_SIZE(tmp)) {
6322 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
6323 goto failed;
6324 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006325 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006326 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006327 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006328 }
6329 *out = Compare(left, ops, comparators, lineno, col_offset, arena);
6330 if (*out == NULL) goto failed;
6331 return 0;
6332 }
6333 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
6334 if (isinstance == -1) {
6335 return 1;
6336 }
6337 if (isinstance) {
6338 expr_ty func;
6339 asdl_seq* args;
6340 asdl_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006341
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006342 if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) {
6343 return 1;
6344 }
6345 if (tmp == NULL) {
6346 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
6347 return 1;
6348 }
6349 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006350 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006351 res = obj2ast_expr(tmp, &func, arena);
6352 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006353 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006354 }
6355 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006356 return 1;
6357 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006358 if (tmp == NULL) {
6359 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
6360 return 1;
6361 }
6362 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006363 int res;
6364 Py_ssize_t len;
6365 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006366 if (!PyList_Check(tmp)) {
6367 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6368 goto failed;
6369 }
6370 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006371 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006372 if (args == NULL) goto failed;
6373 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006374 expr_ty val;
6375 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006376 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006377 if (len != PyList_GET_SIZE(tmp)) {
6378 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
6379 goto failed;
6380 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006381 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006382 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006383 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006384 }
6385 if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006386 return 1;
6387 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006388 if (tmp == NULL) {
6389 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
6390 return 1;
6391 }
6392 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006393 int res;
6394 Py_ssize_t len;
6395 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006396 if (!PyList_Check(tmp)) {
6397 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6398 goto failed;
6399 }
6400 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006401 keywords = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006402 if (keywords == NULL) goto failed;
6403 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006404 keyword_ty val;
6405 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006406 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006407 if (len != PyList_GET_SIZE(tmp)) {
6408 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
6409 goto failed;
6410 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006411 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006412 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006413 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006414 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04006415 *out = Call(func, args, keywords, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006416 if (*out == NULL) goto failed;
6417 return 0;
6418 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04006419 isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type);
6420 if (isinstance == -1) {
6421 return 1;
6422 }
6423 if (isinstance) {
6424 expr_ty value;
6425 int conversion;
6426 expr_ty format_spec;
6427
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006428 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6429 return 1;
6430 }
6431 if (tmp == NULL) {
6432 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
6433 return 1;
6434 }
6435 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006436 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006437 res = obj2ast_expr(tmp, &value, arena);
6438 if (res != 0) goto failed;
6439 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006440 }
6441 if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006442 return 1;
6443 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006444 if (tmp == NULL || tmp == Py_None) {
6445 Py_CLEAR(tmp);
6446 conversion = 0;
6447 }
6448 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006449 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006450 res = obj2ast_int(tmp, &conversion, arena);
6451 if (res != 0) goto failed;
6452 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006453 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006454 if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) {
6455 return 1;
6456 }
6457 if (tmp == NULL || tmp == Py_None) {
6458 Py_CLEAR(tmp);
6459 format_spec = NULL;
6460 }
6461 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006462 int res;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006463 res = obj2ast_expr(tmp, &format_spec, arena);
6464 if (res != 0) goto failed;
6465 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006466 }
6467 *out = FormattedValue(value, conversion, format_spec, lineno,
6468 col_offset, arena);
6469 if (*out == NULL) goto failed;
6470 return 0;
6471 }
6472 isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type);
6473 if (isinstance == -1) {
6474 return 1;
6475 }
6476 if (isinstance) {
6477 asdl_seq* values;
6478
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006479 if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) {
6480 return 1;
6481 }
6482 if (tmp == NULL) {
6483 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
6484 return 1;
6485 }
6486 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04006487 int res;
6488 Py_ssize_t len;
6489 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04006490 if (!PyList_Check(tmp)) {
6491 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6492 goto failed;
6493 }
6494 len = PyList_GET_SIZE(tmp);
6495 values = _Py_asdl_seq_new(len, arena);
6496 if (values == NULL) goto failed;
6497 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006498 expr_ty val;
6499 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006500 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03006501 if (len != PyList_GET_SIZE(tmp)) {
6502 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
6503 goto failed;
6504 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006505 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006506 }
6507 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04006508 }
6509 *out = JoinedStr(values, lineno, col_offset, arena);
6510 if (*out == NULL) goto failed;
6511 return 0;
6512 }
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006513 isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type);
6514 if (isinstance == -1) {
6515 return 1;
6516 }
6517 if (isinstance) {
6518 constant value;
6519
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006520 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6521 return 1;
6522 }
6523 if (tmp == NULL) {
6524 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
6525 return 1;
6526 }
6527 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006528 int res;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006529 res = obj2ast_constant(tmp, &value, arena);
6530 if (res != 0) goto failed;
6531 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01006532 }
6533 *out = Constant(value, lineno, col_offset, arena);
6534 if (*out == NULL) goto failed;
6535 return 0;
6536 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006537 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
6538 if (isinstance == -1) {
6539 return 1;
6540 }
6541 if (isinstance) {
6542 expr_ty value;
6543 identifier attr;
6544 expr_context_ty ctx;
6545
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006546 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6547 return 1;
6548 }
6549 if (tmp == NULL) {
6550 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
6551 return 1;
6552 }
6553 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006554 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006555 res = obj2ast_expr(tmp, &value, arena);
6556 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006557 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006558 }
6559 if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006560 return 1;
6561 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006562 if (tmp == NULL) {
6563 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
6564 return 1;
6565 }
6566 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006567 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006568 res = obj2ast_identifier(tmp, &attr, arena);
6569 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006570 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006571 }
6572 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006573 return 1;
6574 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006575 if (tmp == NULL) {
6576 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
6577 return 1;
6578 }
6579 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006580 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006581 res = obj2ast_expr_context(tmp, &ctx, arena);
6582 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006583 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006584 }
6585 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
6586 if (*out == NULL) goto failed;
6587 return 0;
6588 }
6589 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
6590 if (isinstance == -1) {
6591 return 1;
6592 }
6593 if (isinstance) {
6594 expr_ty value;
6595 slice_ty slice;
6596 expr_context_ty ctx;
6597
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006598 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6599 return 1;
6600 }
6601 if (tmp == NULL) {
6602 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
6603 return 1;
6604 }
6605 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006606 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006607 res = obj2ast_expr(tmp, &value, arena);
6608 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006609 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006610 }
6611 if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006612 return 1;
6613 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006614 if (tmp == NULL) {
6615 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
6616 return 1;
6617 }
6618 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006619 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006620 res = obj2ast_slice(tmp, &slice, arena);
6621 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006622 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006623 }
6624 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006625 return 1;
6626 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006627 if (tmp == NULL) {
6628 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
6629 return 1;
6630 }
6631 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006632 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006633 res = obj2ast_expr_context(tmp, &ctx, arena);
6634 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006635 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006636 }
6637 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
6638 if (*out == NULL) goto failed;
6639 return 0;
6640 }
6641 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
6642 if (isinstance == -1) {
6643 return 1;
6644 }
6645 if (isinstance) {
6646 expr_ty value;
6647 expr_context_ty ctx;
6648
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006649 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
6650 return 1;
6651 }
6652 if (tmp == NULL) {
6653 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
6654 return 1;
6655 }
6656 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006657 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006658 res = obj2ast_expr(tmp, &value, arena);
6659 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006660 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006661 }
6662 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006663 return 1;
6664 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006665 if (tmp == NULL) {
6666 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
6667 return 1;
6668 }
6669 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006670 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006671 res = obj2ast_expr_context(tmp, &ctx, arena);
6672 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006673 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006674 }
6675 *out = Starred(value, ctx, lineno, col_offset, arena);
6676 if (*out == NULL) goto failed;
6677 return 0;
6678 }
6679 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
6680 if (isinstance == -1) {
6681 return 1;
6682 }
6683 if (isinstance) {
6684 identifier id;
6685 expr_context_ty ctx;
6686
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006687 if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) {
6688 return 1;
6689 }
6690 if (tmp == NULL) {
6691 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
6692 return 1;
6693 }
6694 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006695 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006696 res = obj2ast_identifier(tmp, &id, arena);
6697 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006698 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006699 }
6700 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006701 return 1;
6702 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006703 if (tmp == NULL) {
6704 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
6705 return 1;
6706 }
6707 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006708 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006709 res = obj2ast_expr_context(tmp, &ctx, arena);
6710 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006711 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006712 }
6713 *out = Name(id, ctx, lineno, col_offset, arena);
6714 if (*out == NULL) goto failed;
6715 return 0;
6716 }
6717 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
6718 if (isinstance == -1) {
6719 return 1;
6720 }
6721 if (isinstance) {
6722 asdl_seq* elts;
6723 expr_context_ty ctx;
6724
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006725 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6726 return 1;
6727 }
6728 if (tmp == NULL) {
6729 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
6730 return 1;
6731 }
6732 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006733 int res;
6734 Py_ssize_t len;
6735 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006736 if (!PyList_Check(tmp)) {
6737 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6738 goto failed;
6739 }
6740 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006741 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006742 if (elts == NULL) goto failed;
6743 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006744 expr_ty val;
6745 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006746 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006747 if (len != PyList_GET_SIZE(tmp)) {
6748 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
6749 goto failed;
6750 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006751 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006752 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006753 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006754 }
6755 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006756 return 1;
6757 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006758 if (tmp == NULL) {
6759 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
6760 return 1;
6761 }
6762 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006763 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006764 res = obj2ast_expr_context(tmp, &ctx, arena);
6765 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006766 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006767 }
6768 *out = List(elts, ctx, lineno, col_offset, arena);
6769 if (*out == NULL) goto failed;
6770 return 0;
6771 }
6772 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
6773 if (isinstance == -1) {
6774 return 1;
6775 }
6776 if (isinstance) {
6777 asdl_seq* elts;
6778 expr_context_ty ctx;
6779
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006780 if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) {
6781 return 1;
6782 }
6783 if (tmp == NULL) {
6784 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
6785 return 1;
6786 }
6787 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006788 int res;
6789 Py_ssize_t len;
6790 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006791 if (!PyList_Check(tmp)) {
6792 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6793 goto failed;
6794 }
6795 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006796 elts = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006797 if (elts == NULL) goto failed;
6798 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006799 expr_ty val;
6800 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006801 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006802 if (len != PyList_GET_SIZE(tmp)) {
6803 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
6804 goto failed;
6805 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006806 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006807 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006808 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006809 }
6810 if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006811 return 1;
6812 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006813 if (tmp == NULL) {
6814 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
6815 return 1;
6816 }
6817 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006818 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006819 res = obj2ast_expr_context(tmp, &ctx, arena);
6820 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006821 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006822 }
6823 *out = Tuple(elts, ctx, lineno, col_offset, arena);
6824 if (*out == NULL) goto failed;
6825 return 0;
6826 }
6827
6828 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
6829 failed:
6830 Py_XDECREF(tmp);
6831 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006832}
6833
6834int
6835obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
6836{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006837 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006838
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006839 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
6840 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006841 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006842 }
6843 if (isinstance) {
6844 *out = Load;
6845 return 0;
6846 }
6847 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
6848 if (isinstance == -1) {
6849 return 1;
6850 }
6851 if (isinstance) {
6852 *out = Store;
6853 return 0;
6854 }
6855 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
6856 if (isinstance == -1) {
6857 return 1;
6858 }
6859 if (isinstance) {
6860 *out = Del;
6861 return 0;
6862 }
6863 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
6864 if (isinstance == -1) {
6865 return 1;
6866 }
6867 if (isinstance) {
6868 *out = AugLoad;
6869 return 0;
6870 }
6871 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
6872 if (isinstance == -1) {
6873 return 1;
6874 }
6875 if (isinstance) {
6876 *out = AugStore;
6877 return 0;
6878 }
6879 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
6880 if (isinstance == -1) {
6881 return 1;
6882 }
6883 if (isinstance) {
6884 *out = Param;
6885 return 0;
6886 }
6887
6888 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
6889 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006890}
6891
6892int
6893obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
6894{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006895 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006896
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006897 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006898
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006899 if (obj == Py_None) {
6900 *out = NULL;
6901 return 0;
6902 }
6903 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
6904 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006905 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006906 }
6907 if (isinstance) {
6908 expr_ty lower;
6909 expr_ty upper;
6910 expr_ty step;
6911
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006912 if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) {
6913 return 1;
6914 }
6915 if (tmp == NULL || tmp == Py_None) {
6916 Py_CLEAR(tmp);
6917 lower = NULL;
6918 }
6919 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006920 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006921 res = obj2ast_expr(tmp, &lower, arena);
6922 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006923 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006924 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006925 if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) {
6926 return 1;
6927 }
6928 if (tmp == NULL || tmp == Py_None) {
6929 Py_CLEAR(tmp);
6930 upper = NULL;
6931 }
6932 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006933 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006934 res = obj2ast_expr(tmp, &upper, arena);
6935 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006936 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006937 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006938 if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) {
6939 return 1;
6940 }
6941 if (tmp == NULL || tmp == Py_None) {
6942 Py_CLEAR(tmp);
6943 step = NULL;
6944 }
6945 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006946 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006947 res = obj2ast_expr(tmp, &step, arena);
6948 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006949 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006950 }
6951 *out = Slice(lower, upper, step, arena);
6952 if (*out == NULL) goto failed;
6953 return 0;
6954 }
6955 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
6956 if (isinstance == -1) {
6957 return 1;
6958 }
6959 if (isinstance) {
6960 asdl_seq* dims;
6961
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006962 if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) {
6963 return 1;
6964 }
6965 if (tmp == NULL) {
6966 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
6967 return 1;
6968 }
6969 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006970 int res;
6971 Py_ssize_t len;
6972 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006973 if (!PyList_Check(tmp)) {
6974 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6975 goto failed;
6976 }
6977 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02006978 dims = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006979 if (dims == NULL) goto failed;
6980 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006981 slice_ty val;
6982 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006983 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006984 if (len != PyList_GET_SIZE(tmp)) {
6985 PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration");
6986 goto failed;
6987 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006988 asdl_seq_SET(dims, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006989 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006990 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006991 }
6992 *out = ExtSlice(dims, arena);
6993 if (*out == NULL) goto failed;
6994 return 0;
6995 }
6996 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
6997 if (isinstance == -1) {
6998 return 1;
6999 }
7000 if (isinstance) {
7001 expr_ty value;
7002
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007003 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7004 return 1;
7005 }
7006 if (tmp == NULL) {
7007 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
7008 return 1;
7009 }
7010 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007011 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007012 res = obj2ast_expr(tmp, &value, arena);
7013 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007014 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007015 }
7016 *out = Index(value, arena);
7017 if (*out == NULL) goto failed;
7018 return 0;
7019 }
7020
7021 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
7022 failed:
7023 Py_XDECREF(tmp);
7024 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007025}
7026
7027int
7028obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
7029{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007030 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007031
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007032 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
7033 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007034 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007035 }
7036 if (isinstance) {
7037 *out = And;
7038 return 0;
7039 }
7040 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
7041 if (isinstance == -1) {
7042 return 1;
7043 }
7044 if (isinstance) {
7045 *out = Or;
7046 return 0;
7047 }
7048
7049 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
7050 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007051}
7052
7053int
7054obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
7055{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007056 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007057
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007058 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
7059 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007060 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007061 }
7062 if (isinstance) {
7063 *out = Add;
7064 return 0;
7065 }
7066 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
7067 if (isinstance == -1) {
7068 return 1;
7069 }
7070 if (isinstance) {
7071 *out = Sub;
7072 return 0;
7073 }
7074 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
7075 if (isinstance == -1) {
7076 return 1;
7077 }
7078 if (isinstance) {
7079 *out = Mult;
7080 return 0;
7081 }
Benjamin Petersond51374e2014-04-09 23:55:56 -04007082 isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type);
7083 if (isinstance == -1) {
7084 return 1;
7085 }
7086 if (isinstance) {
7087 *out = MatMult;
7088 return 0;
7089 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007090 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
7091 if (isinstance == -1) {
7092 return 1;
7093 }
7094 if (isinstance) {
7095 *out = Div;
7096 return 0;
7097 }
7098 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
7099 if (isinstance == -1) {
7100 return 1;
7101 }
7102 if (isinstance) {
7103 *out = Mod;
7104 return 0;
7105 }
7106 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
7107 if (isinstance == -1) {
7108 return 1;
7109 }
7110 if (isinstance) {
7111 *out = Pow;
7112 return 0;
7113 }
7114 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
7115 if (isinstance == -1) {
7116 return 1;
7117 }
7118 if (isinstance) {
7119 *out = LShift;
7120 return 0;
7121 }
7122 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
7123 if (isinstance == -1) {
7124 return 1;
7125 }
7126 if (isinstance) {
7127 *out = RShift;
7128 return 0;
7129 }
7130 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
7131 if (isinstance == -1) {
7132 return 1;
7133 }
7134 if (isinstance) {
7135 *out = BitOr;
7136 return 0;
7137 }
7138 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
7139 if (isinstance == -1) {
7140 return 1;
7141 }
7142 if (isinstance) {
7143 *out = BitXor;
7144 return 0;
7145 }
7146 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
7147 if (isinstance == -1) {
7148 return 1;
7149 }
7150 if (isinstance) {
7151 *out = BitAnd;
7152 return 0;
7153 }
7154 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
7155 if (isinstance == -1) {
7156 return 1;
7157 }
7158 if (isinstance) {
7159 *out = FloorDiv;
7160 return 0;
7161 }
7162
7163 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
7164 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007165}
7166
7167int
7168obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
7169{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007170 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007171
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007172 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
7173 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007174 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007175 }
7176 if (isinstance) {
7177 *out = Invert;
7178 return 0;
7179 }
7180 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
7181 if (isinstance == -1) {
7182 return 1;
7183 }
7184 if (isinstance) {
7185 *out = Not;
7186 return 0;
7187 }
7188 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
7189 if (isinstance == -1) {
7190 return 1;
7191 }
7192 if (isinstance) {
7193 *out = UAdd;
7194 return 0;
7195 }
7196 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
7197 if (isinstance == -1) {
7198 return 1;
7199 }
7200 if (isinstance) {
7201 *out = USub;
7202 return 0;
7203 }
7204
7205 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
7206 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007207}
7208
7209int
7210obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
7211{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007212 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007213
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007214 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
7215 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007216 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007217 }
7218 if (isinstance) {
7219 *out = Eq;
7220 return 0;
7221 }
7222 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
7223 if (isinstance == -1) {
7224 return 1;
7225 }
7226 if (isinstance) {
7227 *out = NotEq;
7228 return 0;
7229 }
7230 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
7231 if (isinstance == -1) {
7232 return 1;
7233 }
7234 if (isinstance) {
7235 *out = Lt;
7236 return 0;
7237 }
7238 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
7239 if (isinstance == -1) {
7240 return 1;
7241 }
7242 if (isinstance) {
7243 *out = LtE;
7244 return 0;
7245 }
7246 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
7247 if (isinstance == -1) {
7248 return 1;
7249 }
7250 if (isinstance) {
7251 *out = Gt;
7252 return 0;
7253 }
7254 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
7255 if (isinstance == -1) {
7256 return 1;
7257 }
7258 if (isinstance) {
7259 *out = GtE;
7260 return 0;
7261 }
7262 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
7263 if (isinstance == -1) {
7264 return 1;
7265 }
7266 if (isinstance) {
7267 *out = Is;
7268 return 0;
7269 }
7270 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
7271 if (isinstance == -1) {
7272 return 1;
7273 }
7274 if (isinstance) {
7275 *out = IsNot;
7276 return 0;
7277 }
7278 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
7279 if (isinstance == -1) {
7280 return 1;
7281 }
7282 if (isinstance) {
7283 *out = In;
7284 return 0;
7285 }
7286 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
7287 if (isinstance == -1) {
7288 return 1;
7289 }
7290 if (isinstance) {
7291 *out = NotIn;
7292 return 0;
7293 }
7294
7295 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
7296 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007297}
7298
7299int
7300obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
7301{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007302 PyObject* tmp = NULL;
7303 expr_ty target;
7304 expr_ty iter;
7305 asdl_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007306 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007307
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007308 if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) {
7309 return 1;
7310 }
7311 if (tmp == NULL) {
7312 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
7313 return 1;
7314 }
7315 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007316 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007317 res = obj2ast_expr(tmp, &target, arena);
7318 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007319 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007320 }
7321 if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007322 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007323 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007324 if (tmp == NULL) {
7325 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
7326 return 1;
7327 }
7328 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007329 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007330 res = obj2ast_expr(tmp, &iter, arena);
7331 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007332 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007333 }
7334 if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007335 return 1;
7336 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007337 if (tmp == NULL) {
7338 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
7339 return 1;
7340 }
7341 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007342 int res;
7343 Py_ssize_t len;
7344 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007345 if (!PyList_Check(tmp)) {
7346 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7347 goto failed;
7348 }
7349 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007350 ifs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007351 if (ifs == NULL) goto failed;
7352 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007353 expr_ty val;
7354 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007355 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007356 if (len != PyList_GET_SIZE(tmp)) {
7357 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
7358 goto failed;
7359 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007360 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007361 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007362 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007363 }
7364 if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007365 return 1;
7366 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007367 if (tmp == NULL) {
7368 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
7369 return 1;
7370 }
7371 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007372 int res;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007373 res = obj2ast_int(tmp, &is_async, arena);
7374 if (res != 0) goto failed;
7375 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07007376 }
7377 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007378 return 0;
7379failed:
7380 Py_XDECREF(tmp);
7381 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007382}
7383
7384int
7385obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
7386{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007387 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00007388
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007389 PyObject *tmp = NULL;
7390 int lineno;
7391 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007392
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007393 if (obj == Py_None) {
7394 *out = NULL;
7395 return 0;
7396 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007397 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7398 return 1;
7399 }
7400 if (tmp == NULL) {
7401 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
7402 return 1;
7403 }
7404 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007405 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007406 res = obj2ast_int(tmp, &lineno, arena);
7407 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007408 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007409 }
7410 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007411 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007412 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007413 if (tmp == NULL) {
7414 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
7415 return 1;
7416 }
7417 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007418 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007419 res = obj2ast_int(tmp, &col_offset, arena);
7420 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007421 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007422 }
7423 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
7424 if (isinstance == -1) {
7425 return 1;
7426 }
7427 if (isinstance) {
7428 expr_ty type;
7429 identifier name;
7430 asdl_seq* body;
7431
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007432 if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) {
7433 return 1;
7434 }
7435 if (tmp == NULL || tmp == Py_None) {
7436 Py_CLEAR(tmp);
7437 type = NULL;
7438 }
7439 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007440 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007441 res = obj2ast_expr(tmp, &type, arena);
7442 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007443 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007444 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007445 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
7446 return 1;
7447 }
7448 if (tmp == NULL || tmp == Py_None) {
7449 Py_CLEAR(tmp);
7450 name = NULL;
7451 }
7452 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007453 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007454 res = obj2ast_identifier(tmp, &name, arena);
7455 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007456 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007457 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007458 if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) {
7459 return 1;
7460 }
7461 if (tmp == NULL) {
7462 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
7463 return 1;
7464 }
7465 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007466 int res;
7467 Py_ssize_t len;
7468 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007469 if (!PyList_Check(tmp)) {
7470 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7471 goto failed;
7472 }
7473 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007474 body = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007475 if (body == NULL) goto failed;
7476 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007477 stmt_ty val;
7478 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007479 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007480 if (len != PyList_GET_SIZE(tmp)) {
7481 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
7482 goto failed;
7483 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007484 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007485 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007486 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007487 }
7488 *out = ExceptHandler(type, name, body, lineno, col_offset, arena);
7489 if (*out == NULL) goto failed;
7490 return 0;
7491 }
7492
7493 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
7494 failed:
7495 Py_XDECREF(tmp);
7496 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007497}
7498
7499int
7500obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
7501{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007502 PyObject* tmp = NULL;
7503 asdl_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007504 arg_ty vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007505 asdl_seq* kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007506 asdl_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007507 arg_ty kwarg;
7508 asdl_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007509
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007510 if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) {
7511 return 1;
7512 }
7513 if (tmp == NULL) {
7514 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
7515 return 1;
7516 }
7517 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007518 int res;
7519 Py_ssize_t len;
7520 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007521 if (!PyList_Check(tmp)) {
7522 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7523 goto failed;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007524 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007525 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007526 args = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007527 if (args == NULL) goto failed;
7528 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007529 arg_ty val;
7530 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007531 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007532 if (len != PyList_GET_SIZE(tmp)) {
7533 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
7534 goto failed;
7535 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007536 asdl_seq_SET(args, i, val);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007537 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007538 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007539 }
7540 if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007541 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007542 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007543 if (tmp == NULL || tmp == Py_None) {
7544 Py_CLEAR(tmp);
7545 vararg = NULL;
7546 }
7547 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007548 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007549 res = obj2ast_arg(tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007550 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007551 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007552 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007553 if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) {
7554 return 1;
7555 }
7556 if (tmp == NULL) {
7557 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
7558 return 1;
7559 }
7560 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007561 int res;
7562 Py_ssize_t len;
7563 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007564 if (!PyList_Check(tmp)) {
7565 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7566 goto failed;
7567 }
7568 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007569 kwonlyargs = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007570 if (kwonlyargs == NULL) goto failed;
7571 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007572 arg_ty val;
7573 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007574 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007575 if (len != PyList_GET_SIZE(tmp)) {
7576 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
7577 goto failed;
7578 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007579 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007580 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007581 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007582 }
7583 if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007584 return 1;
7585 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007586 if (tmp == NULL) {
7587 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
7588 return 1;
7589 }
7590 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007591 int res;
7592 Py_ssize_t len;
7593 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007594 if (!PyList_Check(tmp)) {
7595 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7596 goto failed;
7597 }
7598 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007599 kw_defaults = _Py_asdl_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007600 if (kw_defaults == NULL) goto failed;
7601 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007602 expr_ty val;
7603 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007604 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007605 if (len != PyList_GET_SIZE(tmp)) {
7606 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
7607 goto failed;
7608 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007609 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007610 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007611 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007612 }
7613 if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007614 return 1;
7615 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007616 if (tmp == NULL || tmp == Py_None) {
7617 Py_CLEAR(tmp);
7618 kwarg = NULL;
7619 }
7620 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007621 int res;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007622 res = obj2ast_arg(tmp, &kwarg, arena);
7623 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02007624 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007625 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007626 if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) {
7627 return 1;
7628 }
7629 if (tmp == NULL) {
7630 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
7631 return 1;
7632 }
7633 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02007634 int res;
7635 Py_ssize_t len;
7636 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007637 if (!PyList_Check(tmp)) {
7638 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
7639 goto failed;
7640 }
7641 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007642 defaults = _Py_asdl_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007643 if (defaults == NULL) goto failed;
7644 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007645 expr_ty val;
7646 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007647 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007648 if (len != PyList_GET_SIZE(tmp)) {
7649 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
7650 goto failed;
7651 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007652 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007653 }
Victor Stinnerb3189902013-07-27 00:04:42 +02007654 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02007655 }
7656 *out = arguments(args, vararg, kwonlyargs, kw_defaults, kwarg, defaults,
7657 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007658 return 0;
7659failed:
7660 Py_XDECREF(tmp);
7661 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007662}
7663
7664int
7665obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
7666{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007667 PyObject* tmp = NULL;
7668 identifier arg;
7669 expr_ty annotation;
Victor Stinnerc106c682015-11-06 17:01:48 +01007670 int lineno;
7671 int col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007672
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007673 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
7674 return 1;
7675 }
7676 if (tmp == NULL) {
7677 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
7678 return 1;
7679 }
7680 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007681 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007682 res = obj2ast_identifier(tmp, &arg, arena);
7683 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007684 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007685 }
7686 if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007687 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007688 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007689 if (tmp == NULL || tmp == Py_None) {
7690 Py_CLEAR(tmp);
7691 annotation = NULL;
7692 }
7693 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007694 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007695 res = obj2ast_expr(tmp, &annotation, arena);
7696 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007697 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007698 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007699 if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) {
7700 return 1;
7701 }
7702 if (tmp == NULL) {
7703 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
7704 return 1;
7705 }
7706 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01007707 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01007708 res = obj2ast_int(tmp, &lineno, arena);
7709 if (res != 0) goto failed;
7710 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007711 }
7712 if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01007713 return 1;
7714 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007715 if (tmp == NULL) {
7716 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
7717 return 1;
7718 }
7719 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01007720 int res;
Victor Stinnerc106c682015-11-06 17:01:48 +01007721 res = obj2ast_int(tmp, &col_offset, arena);
7722 if (res != 0) goto failed;
7723 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01007724 }
7725 *out = arg(arg, annotation, lineno, col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007726 return 0;
7727failed:
7728 Py_XDECREF(tmp);
7729 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007730}
7731
7732int
7733obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
7734{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007735 PyObject* tmp = NULL;
7736 identifier arg;
7737 expr_ty value;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007738
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007739 if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) {
7740 return 1;
7741 }
7742 if (tmp == NULL || tmp == Py_None) {
7743 Py_CLEAR(tmp);
7744 arg = NULL;
7745 }
7746 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007747 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007748 res = obj2ast_identifier(tmp, &arg, arena);
7749 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007750 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007751 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007752 if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) {
7753 return 1;
7754 }
7755 if (tmp == NULL) {
7756 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
7757 return 1;
7758 }
7759 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007760 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007761 res = obj2ast_expr(tmp, &value, arena);
7762 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007763 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007764 }
7765 *out = keyword(arg, value, arena);
7766 return 0;
7767failed:
7768 Py_XDECREF(tmp);
7769 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007770}
7771
7772int
7773obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
7774{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007775 PyObject* tmp = NULL;
7776 identifier name;
7777 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007778
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007779 if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) {
7780 return 1;
7781 }
7782 if (tmp == NULL) {
7783 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
7784 return 1;
7785 }
7786 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007787 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007788 res = obj2ast_identifier(tmp, &name, arena);
7789 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007790 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007791 }
7792 if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007793 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007794 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007795 if (tmp == NULL || tmp == Py_None) {
7796 Py_CLEAR(tmp);
7797 asname = NULL;
7798 }
7799 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007800 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007801 res = obj2ast_identifier(tmp, &asname, arena);
7802 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007803 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007804 }
7805 *out = alias(name, asname, arena);
7806 return 0;
7807failed:
7808 Py_XDECREF(tmp);
7809 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007810}
7811
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05007812int
7813obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
7814{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007815 PyObject* tmp = NULL;
7816 expr_ty context_expr;
7817 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05007818
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007819 if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) {
7820 return 1;
7821 }
7822 if (tmp == NULL) {
7823 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
7824 return 1;
7825 }
7826 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007827 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007828 res = obj2ast_expr(tmp, &context_expr, arena);
7829 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007830 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007831 }
7832 if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05007833 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007834 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007835 if (tmp == NULL || tmp == Py_None) {
7836 Py_CLEAR(tmp);
7837 optional_vars = NULL;
7838 }
7839 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007840 int res;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007841 res = obj2ast_expr(tmp, &optional_vars, arena);
7842 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007843 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007844 }
7845 *out = withitem(context_expr, optional_vars, arena);
7846 return 0;
7847failed:
7848 Py_XDECREF(tmp);
7849 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05007850}
7851
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007852
Martin v. Löwis1a214512008-06-11 05:26:20 +00007853static struct PyModuleDef _astmodule = {
7854 PyModuleDef_HEAD_INIT, "_ast"
7855};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00007856PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00007857PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00007858{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007859 PyObject *m, *d;
7860 if (!init_types()) return NULL;
7861 m = PyModule_Create(&_astmodule);
7862 if (!m) return NULL;
7863 d = PyModule_GetDict(m);
7864 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;
Victor Stinneree4b59c2013-07-27 00:01:35 +02007865 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007866 return NULL;
7867 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL;
7868 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return
7869 NULL;
7870 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) <
7871 0) return NULL;
7872 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0)
7873 return NULL;
7874 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
7875 NULL;
7876 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL;
7877 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) <
7878 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04007879 if (PyDict_SetItemString(d, "AsyncFunctionDef",
7880 (PyObject*)AsyncFunctionDef_type) < 0) return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007881 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
7882 return NULL;
7883 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return
7884 NULL;
7885 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return
7886 NULL;
7887 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return
7888 NULL;
7889 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0)
7890 return NULL;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07007891 if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0)
7892 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007893 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04007894 if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0)
7895 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007896 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
7897 NULL;
7898 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
7899 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04007900 if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0)
7901 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007902 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
7903 NULL;
7904 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL;
7905 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return
7906 NULL;
7907 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return
7908 NULL;
7909 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0)
7910 return NULL;
7911 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return
7912 NULL;
7913 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
7914 return NULL;
7915 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL;
7916 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL;
7917 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
7918 NULL;
7919 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
7920 return NULL;
7921 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL;
7922 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return
7923 NULL;
7924 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
7925 NULL;
7926 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return
7927 NULL;
7928 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return
7929 NULL;
7930 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
7931 NULL;
7932 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL;
7933 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL;
7934 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
7935 return NULL;
7936 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return
7937 NULL;
7938 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
7939 return NULL;
7940 if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) <
7941 0) return NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04007942 if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return
7943 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007944 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
7945 NULL;
7946 if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0)
7947 return NULL;
7948 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return
7949 NULL;
7950 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL;
Eric V. Smith235a6f02015-09-19 14:51:32 -04007951 if (PyDict_SetItemString(d, "FormattedValue",
7952 (PyObject*)FormattedValue_type) < 0) return NULL;
7953 if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0)
7954 return NULL;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01007955 if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0)
7956 return NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007957 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0)
7958 return NULL;
7959 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0)
7960 return NULL;
7961 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return
7962 NULL;
7963 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL;
7964 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL;
7965 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
7966 NULL;
7967 if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) <
7968 0) return NULL;
7969 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL;
7970 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
7971 NULL;
7972 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL;
7973 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return
7974 NULL;
7975 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
7976 return NULL;
7977 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
7978 NULL;
7979 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
7980 NULL;
7981 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
7982 NULL;
7983 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
7984 return NULL;
7985 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
7986 NULL;
7987 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return
7988 NULL;
7989 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL;
7990 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
7991 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
7992 return NULL;
7993 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL;
7994 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL;
7995 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL;
Benjamin Petersond51374e2014-04-09 23:55:56 -04007996 if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return
7997 NULL;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007998 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL;
7999 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL;
8000 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL;
8001 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return
8002 NULL;
8003 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return
8004 NULL;
8005 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
8006 NULL;
8007 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return
8008 NULL;
8009 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return
8010 NULL;
8011 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
8012 return NULL;
8013 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return
8014 NULL;
8015 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return
8016 NULL;
8017 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL;
8018 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL;
8019 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL;
8020 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
8021 NULL;
8022 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
8023 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
8024 NULL;
8025 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
8026 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL;
8027 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
8028 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL;
8029 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
8030 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
8031 NULL;
8032 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
8033 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
8034 NULL;
8035 if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type)
8036 < 0) return NULL;
8037 if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type)
8038 < 0) return NULL;
8039 if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type)
8040 < 0) return NULL;
8041 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0)
8042 return NULL;
8043 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL;
8044 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return
8045 NULL;
8046 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
8047 NULL;
8048 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
8049 return NULL;
8050 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00008051}
8052
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008053
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008054PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008055{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008056 if (!init_types())
8057 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008058 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00008059}
Martin v. Löwis5b222132007-06-10 09:51:05 +00008060
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008061/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
8062mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008063{
8064 mod_ty res;
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008065 PyObject *req_type[3];
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008066 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008067 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008068
Benjamin Petersonc2f665e2014-02-10 22:19:02 -05008069 req_type[0] = (PyObject*)Module_type;
8070 req_type[1] = (PyObject*)Expression_type;
8071 req_type[2] = (PyObject*)Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -05008072
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008073 assert(0 <= mode && mode <= 2);
8074
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008075 if (!init_types())
8076 return NULL;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008077
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00008078 isinstance = PyObject_IsInstance(ast, req_type[mode]);
8079 if (isinstance == -1)
8080 return NULL;
8081 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00008082 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
8083 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008084 return NULL;
8085 }
8086 if (obj2ast_mod(ast, &res, arena) != 0)
8087 return NULL;
8088 else
8089 return res;
8090}
8091
8092int PyAST_Check(PyObject* obj)
8093{
Victor Stinnerbdf630c2013-07-17 00:17:15 +02008094 if (!init_types())
8095 return -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +00008096 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008097}
8098
Martin v. Löwis5b222132007-06-10 09:51:05 +00008099