blob: 7c0d858d295f60eff0c5b72cfeb07c14e41174f0 [file] [log] [blame]
Thomas Wouterscf297e42007-02-23 15:07:44 +00001/* File automatically generated by Parser/asdl_c.py. */
2
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003#include "Python.h"
4#include "Python-ast.h"
5
Neal Norwitz207c9f32008-03-31 04:42:11 +00006static PyTypeObject AST_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +00007static PyTypeObject *mod_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00008static PyObject* ast2obj_mod(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +00009static PyTypeObject *Module_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020010_Py_IDENTIFIER(body);
Neal Norwitz53d960c2006-02-28 22:47:29 +000011static char *Module_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000012 "body",
13};
Neal Norwitz53d960c2006-02-28 22:47:29 +000014static PyTypeObject *Interactive_type;
15static char *Interactive_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000016 "body",
17};
Neal Norwitz53d960c2006-02-28 22:47:29 +000018static PyTypeObject *Expression_type;
19static char *Expression_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000020 "body",
21};
Neal Norwitz53d960c2006-02-28 22:47:29 +000022static PyTypeObject *Suite_type;
23static char *Suite_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000024 "body",
25};
Neal Norwitz53d960c2006-02-28 22:47:29 +000026static PyTypeObject *stmt_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020027_Py_IDENTIFIER(lineno);
28_Py_IDENTIFIER(col_offset);
Neal Norwitz53d960c2006-02-28 22:47:29 +000029static char *stmt_attributes[] = {
Martin v. Löwis577b5b92006-02-27 15:23:19 +000030 "lineno",
Martin v. Löwis49c5da12006-03-01 22:49:05 +000031 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +000032};
Martin v. Löwisbd260da2006-02-26 19:42:26 +000033static PyObject* ast2obj_stmt(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000034static PyTypeObject *FunctionDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020035_Py_IDENTIFIER(name);
36_Py_IDENTIFIER(args);
37_Py_IDENTIFIER(decorator_list);
38_Py_IDENTIFIER(returns);
Neal Norwitz53d960c2006-02-28 22:47:29 +000039static char *FunctionDef_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000040 "name",
41 "args",
42 "body",
Guido van Rossumd59da4b2007-05-22 18:11:13 +000043 "decorator_list",
Neal Norwitzc1505362006-12-28 06:47:50 +000044 "returns",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000045};
Neal Norwitz53d960c2006-02-28 22:47:29 +000046static PyTypeObject *ClassDef_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020047_Py_IDENTIFIER(bases);
48_Py_IDENTIFIER(keywords);
49_Py_IDENTIFIER(starargs);
50_Py_IDENTIFIER(kwargs);
Neal Norwitz53d960c2006-02-28 22:47:29 +000051static char *ClassDef_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000052 "name",
53 "bases",
Guido van Rossum52cc1d82007-03-18 15:41:51 +000054 "keywords",
55 "starargs",
56 "kwargs",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000057 "body",
Guido van Rossumd59da4b2007-05-22 18:11:13 +000058 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000059};
Neal Norwitz53d960c2006-02-28 22:47:29 +000060static PyTypeObject *Return_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020061_Py_IDENTIFIER(value);
Neal Norwitz53d960c2006-02-28 22:47:29 +000062static char *Return_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000063 "value",
64};
Neal Norwitz53d960c2006-02-28 22:47:29 +000065static PyTypeObject *Delete_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020066_Py_IDENTIFIER(targets);
Neal Norwitz53d960c2006-02-28 22:47:29 +000067static char *Delete_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000068 "targets",
69};
Neal Norwitz53d960c2006-02-28 22:47:29 +000070static PyTypeObject *Assign_type;
71static char *Assign_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000072 "targets",
73 "value",
74};
Neal Norwitz53d960c2006-02-28 22:47:29 +000075static PyTypeObject *AugAssign_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020076_Py_IDENTIFIER(target);
77_Py_IDENTIFIER(op);
Neal Norwitz53d960c2006-02-28 22:47:29 +000078static char *AugAssign_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000079 "target",
80 "op",
81 "value",
82};
Neal Norwitz53d960c2006-02-28 22:47:29 +000083static PyTypeObject *For_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020084_Py_IDENTIFIER(iter);
85_Py_IDENTIFIER(orelse);
Neal Norwitz53d960c2006-02-28 22:47:29 +000086static char *For_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000087 "target",
88 "iter",
89 "body",
90 "orelse",
91};
Neal Norwitz53d960c2006-02-28 22:47:29 +000092static PyTypeObject *While_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020093_Py_IDENTIFIER(test);
Neal Norwitz53d960c2006-02-28 22:47:29 +000094static char *While_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000095 "test",
96 "body",
97 "orelse",
98};
Neal Norwitz53d960c2006-02-28 22:47:29 +000099static PyTypeObject *If_type;
100static char *If_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000101 "test",
102 "body",
103 "orelse",
104};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000105static PyTypeObject *With_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200106_Py_IDENTIFIER(items);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000107static char *With_fields[]={
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500108 "items",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000109 "body",
110};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000111static PyTypeObject *Raise_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200112_Py_IDENTIFIER(exc);
113_Py_IDENTIFIER(cause);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000114static char *Raise_fields[]={
Collin Winter828f04a2007-08-31 00:04:24 +0000115 "exc",
116 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000117};
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500118static PyTypeObject *Try_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200119_Py_IDENTIFIER(handlers);
120_Py_IDENTIFIER(finalbody);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500121static char *Try_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000122 "body",
123 "handlers",
124 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000125 "finalbody",
126};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000127static PyTypeObject *Assert_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200128_Py_IDENTIFIER(msg);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000129static char *Assert_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000130 "test",
131 "msg",
132};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000133static PyTypeObject *Import_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200134_Py_IDENTIFIER(names);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000135static char *Import_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000136 "names",
137};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000138static PyTypeObject *ImportFrom_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200139_Py_IDENTIFIER(module);
140_Py_IDENTIFIER(level);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000141static char *ImportFrom_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000142 "module",
143 "names",
Thomas Woutersf7f438b2006-02-28 16:09:29 +0000144 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000145};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000146static PyTypeObject *Global_type;
147static char *Global_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000148 "names",
149};
Jeremy Hylton81e95022007-02-27 06:50:52 +0000150static PyTypeObject *Nonlocal_type;
151static char *Nonlocal_fields[]={
152 "names",
153};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000154static PyTypeObject *Expr_type;
155static char *Expr_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000156 "value",
157};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000158static PyTypeObject *Pass_type;
159static PyTypeObject *Break_type;
160static PyTypeObject *Continue_type;
161static PyTypeObject *expr_type;
162static char *expr_attributes[] = {
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000163 "lineno",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000164 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000165};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000166static PyObject* ast2obj_expr(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000167static PyTypeObject *BoolOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200168_Py_IDENTIFIER(values);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000169static char *BoolOp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000170 "op",
171 "values",
172};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000173static PyTypeObject *BinOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200174_Py_IDENTIFIER(left);
175_Py_IDENTIFIER(right);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000176static char *BinOp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000177 "left",
178 "op",
179 "right",
180};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000181static PyTypeObject *UnaryOp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200182_Py_IDENTIFIER(operand);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000183static char *UnaryOp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000184 "op",
185 "operand",
186};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000187static PyTypeObject *Lambda_type;
188static char *Lambda_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000189 "args",
190 "body",
191};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000192static PyTypeObject *IfExp_type;
193static char *IfExp_fields[]={
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000194 "test",
195 "body",
196 "orelse",
197};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000198static PyTypeObject *Dict_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200199_Py_IDENTIFIER(keys);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000200static char *Dict_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000201 "keys",
202 "values",
203};
Guido van Rossum86e58e22006-08-28 15:27:34 +0000204static PyTypeObject *Set_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200205_Py_IDENTIFIER(elts);
Guido van Rossum86e58e22006-08-28 15:27:34 +0000206static char *Set_fields[]={
207 "elts",
208};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000209static PyTypeObject *ListComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200210_Py_IDENTIFIER(elt);
211_Py_IDENTIFIER(generators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000212static char *ListComp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000213 "elt",
214 "generators",
215};
Nick Coghlan650f0d02007-04-15 12:05:43 +0000216static PyTypeObject *SetComp_type;
217static char *SetComp_fields[]={
218 "elt",
219 "generators",
220};
Guido van Rossum992d4a32007-07-11 13:09:30 +0000221static PyTypeObject *DictComp_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200222_Py_IDENTIFIER(key);
Guido van Rossum992d4a32007-07-11 13:09:30 +0000223static char *DictComp_fields[]={
224 "key",
225 "value",
226 "generators",
227};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000228static PyTypeObject *GeneratorExp_type;
229static char *GeneratorExp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000230 "elt",
231 "generators",
232};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000233static PyTypeObject *Yield_type;
234static char *Yield_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000235 "value",
236};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000237static PyTypeObject *Compare_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200238_Py_IDENTIFIER(ops);
239_Py_IDENTIFIER(comparators);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000240static char *Compare_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000241 "left",
242 "ops",
243 "comparators",
244};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000245static PyTypeObject *Call_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200246_Py_IDENTIFIER(func);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000247static char *Call_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000248 "func",
249 "args",
250 "keywords",
251 "starargs",
252 "kwargs",
253};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000254static PyTypeObject *Num_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200255_Py_IDENTIFIER(n);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000256static char *Num_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000257 "n",
258};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000259static PyTypeObject *Str_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200260_Py_IDENTIFIER(s);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000261static char *Str_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000262 "s",
263};
Thomas Wouters00e41de2007-02-23 19:56:57 +0000264static PyTypeObject *Bytes_type;
265static char *Bytes_fields[]={
266 "s",
267};
Georg Brandl52318d62006-09-06 07:06:08 +0000268static PyTypeObject *Ellipsis_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000269static PyTypeObject *Attribute_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200270_Py_IDENTIFIER(attr);
271_Py_IDENTIFIER(ctx);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000272static char *Attribute_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000273 "value",
274 "attr",
275 "ctx",
276};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000277static PyTypeObject *Subscript_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200278_Py_IDENTIFIER(slice);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000279static char *Subscript_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000280 "value",
281 "slice",
282 "ctx",
283};
Guido van Rossum0368b722007-05-11 16:50:42 +0000284static PyTypeObject *Starred_type;
285static char *Starred_fields[]={
286 "value",
287 "ctx",
288};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000289static PyTypeObject *Name_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200290_Py_IDENTIFIER(id);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000291static char *Name_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000292 "id",
293 "ctx",
294};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000295static PyTypeObject *List_type;
296static char *List_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000297 "elts",
298 "ctx",
299};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000300static PyTypeObject *Tuple_type;
301static char *Tuple_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000302 "elts",
303 "ctx",
304};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000305static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000306static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
307*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
308static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000309static PyTypeObject *Load_type;
310static PyTypeObject *Store_type;
311static PyTypeObject *Del_type;
312static PyTypeObject *AugLoad_type;
313static PyTypeObject *AugStore_type;
314static PyTypeObject *Param_type;
315static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000316static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000317static PyTypeObject *Slice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200318_Py_IDENTIFIER(lower);
319_Py_IDENTIFIER(upper);
320_Py_IDENTIFIER(step);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000321static char *Slice_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000322 "lower",
323 "upper",
324 "step",
325};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000326static PyTypeObject *ExtSlice_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200327_Py_IDENTIFIER(dims);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000328static char *ExtSlice_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000329 "dims",
330};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000331static PyTypeObject *Index_type;
332static char *Index_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000333 "value",
334};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000335static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000336static PyObject *And_singleton, *Or_singleton;
337static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000338static PyTypeObject *And_type;
339static PyTypeObject *Or_type;
340static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000341static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
342*Div_singleton, *Mod_singleton, *Pow_singleton, *LShift_singleton,
343*RShift_singleton, *BitOr_singleton, *BitXor_singleton, *BitAnd_singleton,
344*FloorDiv_singleton;
345static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000346static PyTypeObject *Add_type;
347static PyTypeObject *Sub_type;
348static PyTypeObject *Mult_type;
349static PyTypeObject *Div_type;
350static PyTypeObject *Mod_type;
351static PyTypeObject *Pow_type;
352static PyTypeObject *LShift_type;
353static PyTypeObject *RShift_type;
354static PyTypeObject *BitOr_type;
355static PyTypeObject *BitXor_type;
356static PyTypeObject *BitAnd_type;
357static PyTypeObject *FloorDiv_type;
358static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000359static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
360*USub_singleton;
361static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000362static PyTypeObject *Invert_type;
363static PyTypeObject *Not_type;
364static PyTypeObject *UAdd_type;
365static PyTypeObject *USub_type;
366static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000367static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
368*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
369*NotIn_singleton;
370static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000371static PyTypeObject *Eq_type;
372static PyTypeObject *NotEq_type;
373static PyTypeObject *Lt_type;
374static PyTypeObject *LtE_type;
375static PyTypeObject *Gt_type;
376static PyTypeObject *GtE_type;
377static PyTypeObject *Is_type;
378static PyTypeObject *IsNot_type;
379static PyTypeObject *In_type;
380static PyTypeObject *NotIn_type;
381static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000382static PyObject* ast2obj_comprehension(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200383_Py_IDENTIFIER(ifs);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000384static char *comprehension_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000385 "target",
386 "iter",
387 "ifs",
388};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000389static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000390static char *excepthandler_attributes[] = {
391 "lineno",
392 "col_offset",
393};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000394static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000395static PyTypeObject *ExceptHandler_type;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200396_Py_IDENTIFIER(type);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000397static char *ExceptHandler_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000398 "type",
399 "name",
400 "body",
401};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000402static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000403static PyObject* ast2obj_arguments(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200404_Py_IDENTIFIER(vararg);
405_Py_IDENTIFIER(varargannotation);
406_Py_IDENTIFIER(kwonlyargs);
407_Py_IDENTIFIER(kwarg);
408_Py_IDENTIFIER(kwargannotation);
409_Py_IDENTIFIER(defaults);
410_Py_IDENTIFIER(kw_defaults);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000411static char *arguments_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000412 "args",
413 "vararg",
Neal Norwitzc1505362006-12-28 06:47:50 +0000414 "varargannotation",
Guido van Rossum4f72a782006-10-27 23:31:49 +0000415 "kwonlyargs",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000416 "kwarg",
Neal Norwitzc1505362006-12-28 06:47:50 +0000417 "kwargannotation",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000418 "defaults",
Guido van Rossum4f72a782006-10-27 23:31:49 +0000419 "kw_defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000420};
Neal Norwitzc1505362006-12-28 06:47:50 +0000421static PyTypeObject *arg_type;
422static PyObject* ast2obj_arg(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200423_Py_IDENTIFIER(arg);
424_Py_IDENTIFIER(annotation);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000425static char *arg_fields[]={
Neal Norwitzc1505362006-12-28 06:47:50 +0000426 "arg",
427 "annotation",
428};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000429static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000430static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000431static char *keyword_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000432 "arg",
433 "value",
434};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000435static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000436static PyObject* ast2obj_alias(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200437_Py_IDENTIFIER(asname);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000438static char *alias_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000439 "name",
440 "asname",
441};
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500442static PyTypeObject *withitem_type;
443static PyObject* ast2obj_withitem(void*);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200444_Py_IDENTIFIER(context_expr);
445_Py_IDENTIFIER(optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500446static char *withitem_fields[]={
447 "context_expr",
448 "optional_vars",
449};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000450
451
Neal Norwitz207c9f32008-03-31 04:42:11 +0000452static int
453ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
454{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200455 _Py_IDENTIFIER(_fields);
Neal Norwitz207c9f32008-03-31 04:42:11 +0000456 Py_ssize_t i, numfields = 0;
457 int res = -1;
458 PyObject *key, *value, *fields;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200459 fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields);
Neal Norwitz207c9f32008-03-31 04:42:11 +0000460 if (!fields)
461 PyErr_Clear();
462 if (fields) {
463 numfields = PySequence_Size(fields);
464 if (numfields == -1)
465 goto cleanup;
466 }
467 res = 0; /* if no error occurs, this stays 0 to the end */
468 if (PyTuple_GET_SIZE(args) > 0) {
469 if (numfields != PyTuple_GET_SIZE(args)) {
470 PyErr_Format(PyExc_TypeError, "%.400s constructor takes %s"
Amaury Forgeot d'Arc245c70b2008-09-10 22:24:24 +0000471 "%zd positional argument%s",
Neal Norwitz207c9f32008-03-31 04:42:11 +0000472 Py_TYPE(self)->tp_name,
473 numfields == 0 ? "" : "either 0 or ",
474 numfields, numfields == 1 ? "" : "s");
475 res = -1;
476 goto cleanup;
477 }
478 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
479 /* cannot be reached when fields is NULL */
480 PyObject *name = PySequence_GetItem(fields, i);
481 if (!name) {
482 res = -1;
483 goto cleanup;
484 }
485 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
486 Py_DECREF(name);
487 if (res < 0)
488 goto cleanup;
489 }
490 }
491 if (kw) {
492 i = 0; /* needed by PyDict_Next */
493 while (PyDict_Next(kw, &i, &key, &value)) {
494 res = PyObject_SetAttr(self, key, value);
495 if (res < 0)
496 goto cleanup;
497 }
498 }
499 cleanup:
500 Py_XDECREF(fields);
501 return res;
502}
503
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000504/* Pickling support */
505static PyObject *
506ast_type_reduce(PyObject *self, PyObject *unused)
507{
508 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200509 _Py_IDENTIFIER(__dict__);
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200510 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000511 if (dict == NULL) {
512 if (PyErr_ExceptionMatches(PyExc_AttributeError))
513 PyErr_Clear();
514 else
515 return NULL;
516 }
517 if (dict) {
518 res = Py_BuildValue("O()O", Py_TYPE(self), dict);
519 Py_DECREF(dict);
520 return res;
521 }
522 return Py_BuildValue("O()", Py_TYPE(self));
523}
524
525static PyMethodDef ast_type_methods[] = {
526 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
527 {NULL}
528};
529
Neal Norwitz207c9f32008-03-31 04:42:11 +0000530static PyTypeObject AST_type = {
531 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000532 "_ast.AST",
Neal Norwitz207c9f32008-03-31 04:42:11 +0000533 sizeof(PyObject),
534 0,
535 0, /* tp_dealloc */
536 0, /* tp_print */
537 0, /* tp_getattr */
538 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000539 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000540 0, /* tp_repr */
541 0, /* tp_as_number */
542 0, /* tp_as_sequence */
543 0, /* tp_as_mapping */
544 0, /* tp_hash */
545 0, /* tp_call */
546 0, /* tp_str */
547 PyObject_GenericGetAttr, /* tp_getattro */
548 PyObject_GenericSetAttr, /* tp_setattro */
549 0, /* tp_as_buffer */
550 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
551 0, /* tp_doc */
552 0, /* tp_traverse */
553 0, /* tp_clear */
554 0, /* tp_richcompare */
555 0, /* tp_weaklistoffset */
556 0, /* tp_iter */
557 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000558 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000559 0, /* tp_members */
560 0, /* tp_getset */
561 0, /* tp_base */
562 0, /* tp_dict */
563 0, /* tp_descr_get */
564 0, /* tp_descr_set */
565 0, /* tp_dictoffset */
566 (initproc)ast_type_init, /* tp_init */
567 PyType_GenericAlloc, /* tp_alloc */
568 PyType_GenericNew, /* tp_new */
569 PyObject_Del, /* tp_free */
570};
571
572
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000573static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
574{
575 PyObject *fnames, *result;
576 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000577 fnames = PyTuple_New(num_fields);
578 if (!fnames) return NULL;
579 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000580 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000581 if (!field) {
582 Py_DECREF(fnames);
583 return NULL;
584 }
585 PyTuple_SET_ITEM(fnames, i, field);
586 }
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000587 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){sOss}",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000588 type, base, "_fields", fnames, "__module__", "_ast");
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000589 Py_DECREF(fnames);
590 return (PyTypeObject*)result;
591}
592
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000593static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
594{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000596 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000597 if (!l)
598 return 0;
599 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000600 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000601 if (!s) {
602 Py_DECREF(l);
603 return 0;
604 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000605 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000606 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000607 result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0;
608 Py_DECREF(l);
609 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000610}
611
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000612/* Conversion AST -> Python */
613
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000614static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
615{
616 int i, n = asdl_seq_LEN(seq);
617 PyObject *result = PyList_New(n);
618 PyObject *value;
619 if (!result)
620 return NULL;
621 for (i = 0; i < n; i++) {
622 value = func(asdl_seq_GET(seq, i));
623 if (!value) {
624 Py_DECREF(result);
625 return NULL;
626 }
627 PyList_SET_ITEM(result, i, value);
628 }
629 return result;
630}
631
632static PyObject* ast2obj_object(void *o)
633{
634 if (!o)
635 o = Py_None;
636 Py_INCREF((PyObject*)o);
637 return (PyObject*)o;
638}
639#define ast2obj_identifier ast2obj_object
640#define ast2obj_string ast2obj_object
Benjamin Petersone2498412011-08-09 16:08:39 -0500641#define ast2obj_bytes ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000642
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000643static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000644{
Christian Heimes217cfd12007-12-02 14:31:20 +0000645 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000646}
647
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000648/* Conversion Python -> AST */
649
650static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
651{
652 if (obj == Py_None)
653 obj = NULL;
654 if (obj)
655 PyArena_AddPyObject(arena, obj);
656 Py_XINCREF(obj);
657 *out = obj;
658 return 0;
659}
660
Benjamin Peterson180e6352011-07-22 11:09:07 -0500661static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500662{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500663 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
664 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500665 return 1;
666 }
667 return obj2ast_object(obj, out, arena);
668}
669
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500670static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
671{
Benjamin Peterson0224d4e2011-08-31 22:13:03 -0400672 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
Benjamin Peterson180e6352011-07-22 11:09:07 -0500673 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
674 return 1;
675 }
676 return obj2ast_object(obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500677}
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000678
Benjamin Petersone2498412011-08-09 16:08:39 -0500679static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
680{
681 if (!PyBytes_CheckExact(obj)) {
682 PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
683 return 1;
684 }
685 return obj2ast_object(obj, out, arena);
686}
687
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000688static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
689{
690 int i;
691 if (!PyLong_Check(obj)) {
692 PyObject *s = PyObject_Repr(obj);
693 if (s == NULL) return 1;
694 PyErr_Format(PyExc_ValueError, "invalid integer value: %.400s",
Christian Heimes72b710a2008-05-26 13:28:38 +0000695 PyBytes_AS_STRING(s));
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000696 Py_DECREF(s);
697 return 1;
698 }
699
700 i = (int)PyLong_AsLong(obj);
701 if (i == -1 && PyErr_Occurred())
702 return 1;
703 *out = i;
704 return 0;
705}
706
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000707static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000708{
709 PyObject *empty_tuple, *d;
710 if (PyType_Ready(&AST_type) < 0)
711 return -1;
712 d = AST_type.tp_dict;
713 empty_tuple = PyTuple_New(0);
714 if (!empty_tuple ||
715 PyDict_SetItemString(d, "_fields", empty_tuple) < 0 ||
716 PyDict_SetItemString(d, "_attributes", empty_tuple) < 0) {
717 Py_XDECREF(empty_tuple);
718 return -1;
719 }
720 Py_DECREF(empty_tuple);
721 return 0;
722}
723
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000724
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000725static int init_types(void)
726{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000727 static int initialized;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000728 if (initialized) return 1;
Benjamin Petersonce825f12008-10-24 23:11:02 +0000729 if (add_ast_fields() < 0) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000730 mod_type = make_type("mod", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000731 if (!mod_type) return 0;
732 if (!add_attributes(mod_type, NULL, 0)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000733 Module_type = make_type("Module", mod_type, Module_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000734 if (!Module_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000735 Interactive_type = make_type("Interactive", mod_type,
736 Interactive_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000737 if (!Interactive_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000738 Expression_type = make_type("Expression", mod_type, Expression_fields,
739 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000740 if (!Expression_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000741 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000742 if (!Suite_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000743 stmt_type = make_type("stmt", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000744 if (!stmt_type) return 0;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000745 if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000746 FunctionDef_type = make_type("FunctionDef", stmt_type,
Neal Norwitzc1505362006-12-28 06:47:50 +0000747 FunctionDef_fields, 5);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000748 if (!FunctionDef_type) return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000749 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 7);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000750 if (!ClassDef_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000751 Return_type = make_type("Return", stmt_type, Return_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000752 if (!Return_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000753 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000754 if (!Delete_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000755 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000756 if (!Assign_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000757 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000758 if (!AugAssign_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000759 For_type = make_type("For", stmt_type, For_fields, 4);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000760 if (!For_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000761 While_type = make_type("While", stmt_type, While_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000762 if (!While_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000763 If_type = make_type("If", stmt_type, If_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000764 if (!If_type) return 0;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500765 With_type = make_type("With", stmt_type, With_fields, 2);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000766 if (!With_type) return 0;
Collin Winter828f04a2007-08-31 00:04:24 +0000767 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000768 if (!Raise_type) return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500769 Try_type = make_type("Try", stmt_type, Try_fields, 4);
770 if (!Try_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000771 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000772 if (!Assert_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000773 Import_type = make_type("Import", stmt_type, Import_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000774 if (!Import_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000775 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields,
Thomas Woutersf7f438b2006-02-28 16:09:29 +0000776 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000777 if (!ImportFrom_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000778 Global_type = make_type("Global", stmt_type, Global_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000779 if (!Global_type) return 0;
Jeremy Hylton81e95022007-02-27 06:50:52 +0000780 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
781 if (!Nonlocal_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000782 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000783 if (!Expr_type) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000784 Pass_type = make_type("Pass", stmt_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000785 if (!Pass_type) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000786 Break_type = make_type("Break", stmt_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000787 if (!Break_type) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000788 Continue_type = make_type("Continue", stmt_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000789 if (!Continue_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000790 expr_type = make_type("expr", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000791 if (!expr_type) return 0;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000792 if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000793 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000794 if (!BoolOp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000795 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000796 if (!BinOp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000797 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000798 if (!UnaryOp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000799 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000800 if (!Lambda_type) return 0;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000801 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000802 if (!IfExp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000803 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000804 if (!Dict_type) return 0;
Guido van Rossum86e58e22006-08-28 15:27:34 +0000805 Set_type = make_type("Set", expr_type, Set_fields, 1);
806 if (!Set_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000807 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000808 if (!ListComp_type) return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000809 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
810 if (!SetComp_type) return 0;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000811 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
812 if (!DictComp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000813 GeneratorExp_type = make_type("GeneratorExp", expr_type,
814 GeneratorExp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000815 if (!GeneratorExp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000816 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000817 if (!Yield_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000818 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000819 if (!Compare_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000820 Call_type = make_type("Call", expr_type, Call_fields, 5);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000821 if (!Call_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000822 Num_type = make_type("Num", expr_type, Num_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000823 if (!Num_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000824 Str_type = make_type("Str", expr_type, Str_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000825 if (!Str_type) return 0;
Thomas Wouters00e41de2007-02-23 19:56:57 +0000826 Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);
827 if (!Bytes_type) return 0;
Georg Brandl52318d62006-09-06 07:06:08 +0000828 Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);
829 if (!Ellipsis_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000830 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000831 if (!Attribute_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000832 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000833 if (!Subscript_type) return 0;
Guido van Rossum0368b722007-05-11 16:50:42 +0000834 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
835 if (!Starred_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000836 Name_type = make_type("Name", expr_type, Name_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000837 if (!Name_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000838 List_type = make_type("List", expr_type, List_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000839 if (!List_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000840 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000841 if (!Tuple_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000842 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000843 if (!expr_context_type) return 0;
844 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000845 Load_type = make_type("Load", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000846 if (!Load_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000847 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000848 if (!Load_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000849 Store_type = make_type("Store", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000850 if (!Store_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000851 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000852 if (!Store_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000853 Del_type = make_type("Del", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000854 if (!Del_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000855 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000856 if (!Del_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000857 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000858 if (!AugLoad_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000859 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000860 if (!AugLoad_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000861 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000862 if (!AugStore_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000863 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000864 if (!AugStore_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000865 Param_type = make_type("Param", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000866 if (!Param_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000867 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000868 if (!Param_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000869 slice_type = make_type("slice", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000870 if (!slice_type) return 0;
871 if (!add_attributes(slice_type, NULL, 0)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000872 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000873 if (!Slice_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000874 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000875 if (!ExtSlice_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000876 Index_type = make_type("Index", slice_type, Index_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000877 if (!Index_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000878 boolop_type = make_type("boolop", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000879 if (!boolop_type) return 0;
880 if (!add_attributes(boolop_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000881 And_type = make_type("And", boolop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000882 if (!And_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000883 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000884 if (!And_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000885 Or_type = make_type("Or", boolop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000886 if (!Or_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000887 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000888 if (!Or_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000889 operator_type = make_type("operator", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000890 if (!operator_type) return 0;
891 if (!add_attributes(operator_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000892 Add_type = make_type("Add", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000893 if (!Add_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000894 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000895 if (!Add_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000896 Sub_type = make_type("Sub", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000897 if (!Sub_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000898 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000899 if (!Sub_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000900 Mult_type = make_type("Mult", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000901 if (!Mult_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000902 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000903 if (!Mult_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000904 Div_type = make_type("Div", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000905 if (!Div_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000906 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000907 if (!Div_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000908 Mod_type = make_type("Mod", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000909 if (!Mod_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000910 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000911 if (!Mod_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000912 Pow_type = make_type("Pow", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000913 if (!Pow_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000914 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000915 if (!Pow_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000916 LShift_type = make_type("LShift", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000917 if (!LShift_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000918 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000919 if (!LShift_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000920 RShift_type = make_type("RShift", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000921 if (!RShift_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000922 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000923 if (!RShift_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000924 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000925 if (!BitOr_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000926 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000927 if (!BitOr_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000928 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000929 if (!BitXor_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000930 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000931 if (!BitXor_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000932 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000933 if (!BitAnd_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000934 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000935 if (!BitAnd_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000936 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000937 if (!FloorDiv_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000938 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000939 if (!FloorDiv_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000940 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000941 if (!unaryop_type) return 0;
942 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000943 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000944 if (!Invert_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000945 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000946 if (!Invert_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000947 Not_type = make_type("Not", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000948 if (!Not_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000949 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000950 if (!Not_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000951 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000952 if (!UAdd_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000953 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000954 if (!UAdd_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000955 USub_type = make_type("USub", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000956 if (!USub_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000957 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000958 if (!USub_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000959 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000960 if (!cmpop_type) return 0;
961 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000962 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000963 if (!Eq_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000964 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000965 if (!Eq_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000966 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000967 if (!NotEq_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000968 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000969 if (!NotEq_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000970 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000971 if (!Lt_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000972 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000973 if (!Lt_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000974 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000975 if (!LtE_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000976 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000977 if (!LtE_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000978 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000979 if (!Gt_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000980 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000981 if (!Gt_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000982 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000983 if (!GtE_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000984 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000985 if (!GtE_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000986 Is_type = make_type("Is", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000987 if (!Is_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000988 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000989 if (!Is_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000990 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000991 if (!IsNot_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000992 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000993 if (!IsNot_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000994 In_type = make_type("In", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000995 if (!In_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000996 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000997 if (!In_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000998 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000999 if (!NotIn_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001000 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001001 if (!NotIn_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001002 comprehension_type = make_type("comprehension", &AST_type,
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001003 comprehension_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001004 if (!comprehension_type) return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00001005 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001006 if (!excepthandler_type) return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +00001007 if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
1008 return 0;
1009 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
1010 ExceptHandler_fields, 3);
1011 if (!ExceptHandler_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001012 arguments_type = make_type("arguments", &AST_type, arguments_fields, 8);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001013 if (!arguments_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001014 arg_type = make_type("arg", &AST_type, arg_fields, 2);
Neal Norwitzc1505362006-12-28 06:47:50 +00001015 if (!arg_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001016 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001017 if (!keyword_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001018 alias_type = make_type("alias", &AST_type, alias_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001019 if (!alias_type) return 0;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001020 withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
1021 if (!withitem_type) return 0;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001022 initialized = 1;
1023 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001024}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001025
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001026static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
1027static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
1028static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
1029static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
1030 arena);
1031static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
1032static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
1033static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
1034static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
1035static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
1036static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
1037 arena);
1038static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
1039 arena);
1040static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
1041static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
1042static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
1043static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001044static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001045
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001047Module(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048{
1049 mod_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001050 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001051 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 p->kind = Module_kind;
1054 p->v.Module.body = body;
1055 return p;
1056}
1057
1058mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001059Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060{
1061 mod_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001062 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001063 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065 p->kind = Interactive_kind;
1066 p->v.Interactive.body = body;
1067 return p;
1068}
1069
1070mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001071Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072{
1073 mod_ty p;
1074 if (!body) {
1075 PyErr_SetString(PyExc_ValueError,
1076 "field body is required for Expression");
1077 return NULL;
1078 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001079 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001080 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 p->kind = Expression_kind;
1083 p->v.Expression.body = body;
1084 return p;
1085}
1086
1087mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001088Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089{
1090 mod_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001091 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001092 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094 p->kind = Suite_kind;
1095 p->v.Suite.body = body;
1096 return p;
1097}
1098
1099stmt_ty
1100FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001101 decorator_list, expr_ty returns, int lineno, int col_offset,
1102 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103{
1104 stmt_ty p;
1105 if (!name) {
1106 PyErr_SetString(PyExc_ValueError,
1107 "field name is required for FunctionDef");
1108 return NULL;
1109 }
1110 if (!args) {
1111 PyErr_SetString(PyExc_ValueError,
1112 "field args is required for FunctionDef");
1113 return NULL;
1114 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001115 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001116 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118 p->kind = FunctionDef_kind;
1119 p->v.FunctionDef.name = name;
1120 p->v.FunctionDef.args = args;
1121 p->v.FunctionDef.body = body;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001122 p->v.FunctionDef.decorator_list = decorator_list;
Neal Norwitzc1505362006-12-28 06:47:50 +00001123 p->v.FunctionDef.returns = returns;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001125 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126 return p;
1127}
1128
1129stmt_ty
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001130ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, expr_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001131 starargs, expr_ty kwargs, asdl_seq * body, asdl_seq * decorator_list,
1132 int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133{
1134 stmt_ty p;
1135 if (!name) {
1136 PyErr_SetString(PyExc_ValueError,
1137 "field name is required for ClassDef");
1138 return NULL;
1139 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001140 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001141 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143 p->kind = ClassDef_kind;
1144 p->v.ClassDef.name = name;
1145 p->v.ClassDef.bases = bases;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001146 p->v.ClassDef.keywords = keywords;
1147 p->v.ClassDef.starargs = starargs;
1148 p->v.ClassDef.kwargs = kwargs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149 p->v.ClassDef.body = body;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001150 p->v.ClassDef.decorator_list = decorator_list;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001152 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 return p;
1154}
1155
1156stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001157Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158{
1159 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001160 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001161 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163 p->kind = Return_kind;
1164 p->v.Return.value = value;
1165 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001166 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 return p;
1168}
1169
1170stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001171Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172{
1173 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001174 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001175 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 p->kind = Delete_kind;
1178 p->v.Delete.targets = targets;
1179 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001180 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 return p;
1182}
1183
1184stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001185Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1186 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187{
1188 stmt_ty p;
1189 if (!value) {
1190 PyErr_SetString(PyExc_ValueError,
1191 "field value is required for Assign");
1192 return NULL;
1193 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001195 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 p->kind = Assign_kind;
1198 p->v.Assign.targets = targets;
1199 p->v.Assign.value = value;
1200 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001201 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 return p;
1203}
1204
1205stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001206AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1207 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208{
1209 stmt_ty p;
1210 if (!target) {
1211 PyErr_SetString(PyExc_ValueError,
1212 "field target is required for AugAssign");
1213 return NULL;
1214 }
1215 if (!op) {
1216 PyErr_SetString(PyExc_ValueError,
1217 "field op is required for AugAssign");
1218 return NULL;
1219 }
1220 if (!value) {
1221 PyErr_SetString(PyExc_ValueError,
1222 "field value is required for AugAssign");
1223 return NULL;
1224 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001225 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001226 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 p->kind = AugAssign_kind;
1229 p->v.AugAssign.target = target;
1230 p->v.AugAssign.op = op;
1231 p->v.AugAssign.value = value;
1232 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001233 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 return p;
1235}
1236
1237stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001239 lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240{
1241 stmt_ty p;
1242 if (!target) {
1243 PyErr_SetString(PyExc_ValueError,
1244 "field target is required for For");
1245 return NULL;
1246 }
1247 if (!iter) {
1248 PyErr_SetString(PyExc_ValueError,
1249 "field iter is required for For");
1250 return NULL;
1251 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001252 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001253 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255 p->kind = For_kind;
1256 p->v.For.target = target;
1257 p->v.For.iter = iter;
1258 p->v.For.body = body;
1259 p->v.For.orelse = orelse;
1260 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001261 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262 return p;
1263}
1264
1265stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001266While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1267 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268{
1269 stmt_ty p;
1270 if (!test) {
1271 PyErr_SetString(PyExc_ValueError,
1272 "field test is required for While");
1273 return NULL;
1274 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001275 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001276 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001277 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278 p->kind = While_kind;
1279 p->v.While.test = test;
1280 p->v.While.body = body;
1281 p->v.While.orelse = orelse;
1282 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001283 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 return p;
1285}
1286
1287stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001288If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1289 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001290{
1291 stmt_ty p;
1292 if (!test) {
1293 PyErr_SetString(PyExc_ValueError,
1294 "field test is required for If");
1295 return NULL;
1296 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001297 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001298 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001300 p->kind = If_kind;
1301 p->v.If.test = test;
1302 p->v.If.body = body;
1303 p->v.If.orelse = orelse;
1304 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001305 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306 return p;
1307}
1308
1309stmt_ty
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001310With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
1311 *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001312{
1313 stmt_ty p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001314 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001315 if (!p)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001316 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001317 p->kind = With_kind;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05001318 p->v.With.items = items;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001319 p->v.With.body = body;
1320 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001321 p->col_offset = col_offset;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001322 return p;
1323}
1324
1325stmt_ty
Collin Winter828f04a2007-08-31 00:04:24 +00001326Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327{
1328 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001329 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001330 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 p->kind = Raise_kind;
Collin Winter828f04a2007-08-31 00:04:24 +00001333 p->v.Raise.exc = exc;
1334 p->v.Raise.cause = cause;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001336 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 return p;
1338}
1339
1340stmt_ty
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001341Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
1342 finalbody, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343{
1344 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001345 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001346 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 return NULL;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05001348 p->kind = Try_kind;
1349 p->v.Try.body = body;
1350 p->v.Try.handlers = handlers;
1351 p->v.Try.orelse = orelse;
1352 p->v.Try.finalbody = finalbody;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001353 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001354 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 return p;
1356}
1357
1358stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001359Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360{
1361 stmt_ty p;
1362 if (!test) {
1363 PyErr_SetString(PyExc_ValueError,
1364 "field test is required for Assert");
1365 return NULL;
1366 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001367 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001368 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 p->kind = Assert_kind;
1371 p->v.Assert.test = test;
1372 p->v.Assert.msg = msg;
1373 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001374 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375 return p;
1376}
1377
1378stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001379Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380{
1381 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001382 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001383 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 p->kind = Import_kind;
1386 p->v.Import.names = names;
1387 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001388 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 return p;
1390}
1391
1392stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001393ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1394 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395{
1396 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001397 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001398 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 p->kind = ImportFrom_kind;
1401 p->v.ImportFrom.module = module;
1402 p->v.ImportFrom.names = names;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001403 p->v.ImportFrom.level = level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001405 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406 return p;
1407}
1408
1409stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001410Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411{
1412 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001413 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001414 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 p->kind = Global_kind;
1417 p->v.Global.names = names;
1418 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001419 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 return p;
1421}
1422
1423stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00001424Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1425{
1426 stmt_ty p;
1427 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1428 if (!p)
1429 return NULL;
1430 p->kind = Nonlocal_kind;
1431 p->v.Nonlocal.names = names;
1432 p->lineno = lineno;
1433 p->col_offset = col_offset;
1434 return p;
1435}
1436
1437stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001438Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439{
1440 stmt_ty p;
1441 if (!value) {
1442 PyErr_SetString(PyExc_ValueError,
1443 "field value is required for Expr");
1444 return NULL;
1445 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001446 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001447 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 p->kind = Expr_kind;
1450 p->v.Expr.value = value;
1451 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001452 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001453 return p;
1454}
1455
1456stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001457Pass(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458{
1459 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001460 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001461 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 p->kind = Pass_kind;
1464 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001465 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466 return p;
1467}
1468
1469stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001470Break(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471{
1472 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001473 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001474 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476 p->kind = Break_kind;
1477 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001478 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 return p;
1480}
1481
1482stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001483Continue(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484{
1485 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001486 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001487 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 p->kind = Continue_kind;
1490 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001491 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 return p;
1493}
1494
1495expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001496BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1497 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498{
1499 expr_ty p;
1500 if (!op) {
1501 PyErr_SetString(PyExc_ValueError,
1502 "field op is required for BoolOp");
1503 return NULL;
1504 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001505 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001506 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508 p->kind = BoolOp_kind;
1509 p->v.BoolOp.op = op;
1510 p->v.BoolOp.values = values;
1511 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001512 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 return p;
1514}
1515
1516expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001517BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1518 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519{
1520 expr_ty p;
1521 if (!left) {
1522 PyErr_SetString(PyExc_ValueError,
1523 "field left is required for BinOp");
1524 return NULL;
1525 }
1526 if (!op) {
1527 PyErr_SetString(PyExc_ValueError,
1528 "field op is required for BinOp");
1529 return NULL;
1530 }
1531 if (!right) {
1532 PyErr_SetString(PyExc_ValueError,
1533 "field right is required for BinOp");
1534 return NULL;
1535 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001536 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001537 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539 p->kind = BinOp_kind;
1540 p->v.BinOp.left = left;
1541 p->v.BinOp.op = op;
1542 p->v.BinOp.right = right;
1543 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001544 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545 return p;
1546}
1547
1548expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001549UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1550 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551{
1552 expr_ty p;
1553 if (!op) {
1554 PyErr_SetString(PyExc_ValueError,
1555 "field op is required for UnaryOp");
1556 return NULL;
1557 }
1558 if (!operand) {
1559 PyErr_SetString(PyExc_ValueError,
1560 "field operand is required for UnaryOp");
1561 return NULL;
1562 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001563 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001564 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566 p->kind = UnaryOp_kind;
1567 p->v.UnaryOp.op = op;
1568 p->v.UnaryOp.operand = operand;
1569 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001570 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571 return p;
1572}
1573
1574expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001575Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
1576 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001577{
1578 expr_ty p;
1579 if (!args) {
1580 PyErr_SetString(PyExc_ValueError,
1581 "field args is required for Lambda");
1582 return NULL;
1583 }
1584 if (!body) {
1585 PyErr_SetString(PyExc_ValueError,
1586 "field body is required for Lambda");
1587 return NULL;
1588 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001589 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001590 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001591 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592 p->kind = Lambda_kind;
1593 p->v.Lambda.args = args;
1594 p->v.Lambda.body = body;
1595 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001596 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597 return p;
1598}
1599
1600expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001601IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1602 PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001603{
1604 expr_ty p;
1605 if (!test) {
1606 PyErr_SetString(PyExc_ValueError,
1607 "field test is required for IfExp");
1608 return NULL;
1609 }
1610 if (!body) {
1611 PyErr_SetString(PyExc_ValueError,
1612 "field body is required for IfExp");
1613 return NULL;
1614 }
1615 if (!orelse) {
1616 PyErr_SetString(PyExc_ValueError,
1617 "field orelse is required for IfExp");
1618 return NULL;
1619 }
1620 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001621 if (!p)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001622 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001623 p->kind = IfExp_kind;
1624 p->v.IfExp.test = test;
1625 p->v.IfExp.body = body;
1626 p->v.IfExp.orelse = orelse;
1627 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001628 p->col_offset = col_offset;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001629 return p;
1630}
1631
1632expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001633Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1634 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001635{
1636 expr_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001637 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001638 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001639 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001640 p->kind = Dict_kind;
1641 p->v.Dict.keys = keys;
1642 p->v.Dict.values = values;
1643 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001644 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645 return p;
1646}
1647
1648expr_ty
Guido van Rossum86e58e22006-08-28 15:27:34 +00001649Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1650{
1651 expr_ty p;
1652 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001653 if (!p)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001654 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001655 p->kind = Set_kind;
1656 p->v.Set.elts = elts;
1657 p->lineno = lineno;
1658 p->col_offset = col_offset;
1659 return p;
1660}
1661
1662expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001663ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1664 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001665{
1666 expr_ty p;
1667 if (!elt) {
1668 PyErr_SetString(PyExc_ValueError,
1669 "field elt is required for ListComp");
1670 return NULL;
1671 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001672 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001673 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675 p->kind = ListComp_kind;
1676 p->v.ListComp.elt = elt;
1677 p->v.ListComp.generators = generators;
1678 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001679 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001680 return p;
1681}
1682
1683expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001684SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1685 *arena)
1686{
1687 expr_ty p;
1688 if (!elt) {
1689 PyErr_SetString(PyExc_ValueError,
1690 "field elt is required for SetComp");
1691 return NULL;
1692 }
1693 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1694 if (!p)
1695 return NULL;
1696 p->kind = SetComp_kind;
1697 p->v.SetComp.elt = elt;
1698 p->v.SetComp.generators = generators;
1699 p->lineno = lineno;
1700 p->col_offset = col_offset;
1701 return p;
1702}
1703
1704expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001705DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1706 col_offset, PyArena *arena)
1707{
1708 expr_ty p;
1709 if (!key) {
1710 PyErr_SetString(PyExc_ValueError,
1711 "field key is required for DictComp");
1712 return NULL;
1713 }
1714 if (!value) {
1715 PyErr_SetString(PyExc_ValueError,
1716 "field value is required for DictComp");
1717 return NULL;
1718 }
1719 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1720 if (!p)
1721 return NULL;
1722 p->kind = DictComp_kind;
1723 p->v.DictComp.key = key;
1724 p->v.DictComp.value = value;
1725 p->v.DictComp.generators = generators;
1726 p->lineno = lineno;
1727 p->col_offset = col_offset;
1728 return p;
1729}
1730
1731expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001732GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1733 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734{
1735 expr_ty p;
1736 if (!elt) {
1737 PyErr_SetString(PyExc_ValueError,
1738 "field elt is required for GeneratorExp");
1739 return NULL;
1740 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001741 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001742 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001744 p->kind = GeneratorExp_kind;
1745 p->v.GeneratorExp.elt = elt;
1746 p->v.GeneratorExp.generators = generators;
1747 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001748 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749 return p;
1750}
1751
1752expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001753Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754{
1755 expr_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001756 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001757 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 p->kind = Yield_kind;
1760 p->v.Yield.value = value;
1761 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001762 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763 return p;
1764}
1765
1766expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001767Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
1768 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769{
1770 expr_ty p;
1771 if (!left) {
1772 PyErr_SetString(PyExc_ValueError,
1773 "field left is required for Compare");
1774 return NULL;
1775 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001776 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001777 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779 p->kind = Compare_kind;
1780 p->v.Compare.left = left;
1781 p->v.Compare.ops = ops;
1782 p->v.Compare.comparators = comparators;
1783 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001784 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 return p;
1786}
1787
1788expr_ty
1789Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001790 expr_ty kwargs, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791{
1792 expr_ty p;
1793 if (!func) {
1794 PyErr_SetString(PyExc_ValueError,
1795 "field func is required for Call");
1796 return NULL;
1797 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001798 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001799 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801 p->kind = Call_kind;
1802 p->v.Call.func = func;
1803 p->v.Call.args = args;
1804 p->v.Call.keywords = keywords;
1805 p->v.Call.starargs = starargs;
1806 p->v.Call.kwargs = kwargs;
1807 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001808 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 return p;
1810}
1811
1812expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001813Num(object n, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814{
1815 expr_ty p;
1816 if (!n) {
1817 PyErr_SetString(PyExc_ValueError,
1818 "field n is required for Num");
1819 return NULL;
1820 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001821 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001822 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 p->kind = Num_kind;
1825 p->v.Num.n = n;
1826 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001827 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001828 return p;
1829}
1830
1831expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001832Str(string s, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833{
1834 expr_ty p;
1835 if (!s) {
1836 PyErr_SetString(PyExc_ValueError,
1837 "field s is required for Str");
1838 return NULL;
1839 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001840 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001841 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 p->kind = Str_kind;
1844 p->v.Str.s = s;
1845 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001846 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 return p;
1848}
1849
1850expr_ty
Benjamin Petersone2498412011-08-09 16:08:39 -05001851Bytes(bytes s, int lineno, int col_offset, PyArena *arena)
Thomas Wouters00e41de2007-02-23 19:56:57 +00001852{
1853 expr_ty p;
1854 if (!s) {
1855 PyErr_SetString(PyExc_ValueError,
1856 "field s is required for Bytes");
1857 return NULL;
1858 }
1859 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001860 if (!p)
Thomas Wouters00e41de2007-02-23 19:56:57 +00001861 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001862 p->kind = Bytes_kind;
1863 p->v.Bytes.s = s;
1864 p->lineno = lineno;
1865 p->col_offset = col_offset;
1866 return p;
1867}
1868
1869expr_ty
Georg Brandl52318d62006-09-06 07:06:08 +00001870Ellipsis(int lineno, int col_offset, PyArena *arena)
1871{
1872 expr_ty p;
1873 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001874 if (!p)
Georg Brandl52318d62006-09-06 07:06:08 +00001875 return NULL;
Georg Brandl52318d62006-09-06 07:06:08 +00001876 p->kind = Ellipsis_kind;
1877 p->lineno = lineno;
1878 p->col_offset = col_offset;
1879 return p;
1880}
1881
1882expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001883Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
1884 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885{
1886 expr_ty p;
1887 if (!value) {
1888 PyErr_SetString(PyExc_ValueError,
1889 "field value is required for Attribute");
1890 return NULL;
1891 }
1892 if (!attr) {
1893 PyErr_SetString(PyExc_ValueError,
1894 "field attr is required for Attribute");
1895 return NULL;
1896 }
1897 if (!ctx) {
1898 PyErr_SetString(PyExc_ValueError,
1899 "field ctx is required for Attribute");
1900 return NULL;
1901 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001902 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001903 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 p->kind = Attribute_kind;
1906 p->v.Attribute.value = value;
1907 p->v.Attribute.attr = attr;
1908 p->v.Attribute.ctx = ctx;
1909 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001910 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911 return p;
1912}
1913
1914expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001915Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
1916 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917{
1918 expr_ty p;
1919 if (!value) {
1920 PyErr_SetString(PyExc_ValueError,
1921 "field value is required for Subscript");
1922 return NULL;
1923 }
1924 if (!slice) {
1925 PyErr_SetString(PyExc_ValueError,
1926 "field slice is required for Subscript");
1927 return NULL;
1928 }
1929 if (!ctx) {
1930 PyErr_SetString(PyExc_ValueError,
1931 "field ctx is required for Subscript");
1932 return NULL;
1933 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001934 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001935 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001937 p->kind = Subscript_kind;
1938 p->v.Subscript.value = value;
1939 p->v.Subscript.slice = slice;
1940 p->v.Subscript.ctx = ctx;
1941 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001942 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001943 return p;
1944}
1945
1946expr_ty
Guido van Rossum0368b722007-05-11 16:50:42 +00001947Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
1948 *arena)
1949{
1950 expr_ty p;
1951 if (!value) {
1952 PyErr_SetString(PyExc_ValueError,
1953 "field value is required for Starred");
1954 return NULL;
1955 }
1956 if (!ctx) {
1957 PyErr_SetString(PyExc_ValueError,
1958 "field ctx is required for Starred");
1959 return NULL;
1960 }
1961 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1962 if (!p)
1963 return NULL;
1964 p->kind = Starred_kind;
1965 p->v.Starred.value = value;
1966 p->v.Starred.ctx = ctx;
1967 p->lineno = lineno;
1968 p->col_offset = col_offset;
1969 return p;
1970}
1971
1972expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001973Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
1974 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975{
1976 expr_ty p;
1977 if (!id) {
1978 PyErr_SetString(PyExc_ValueError,
1979 "field id is required for Name");
1980 return NULL;
1981 }
1982 if (!ctx) {
1983 PyErr_SetString(PyExc_ValueError,
1984 "field ctx is required for Name");
1985 return NULL;
1986 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001987 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001988 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 p->kind = Name_kind;
1991 p->v.Name.id = id;
1992 p->v.Name.ctx = ctx;
1993 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001994 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 return p;
1996}
1997
1998expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001999List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2000 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001{
2002 expr_ty p;
2003 if (!ctx) {
2004 PyErr_SetString(PyExc_ValueError,
2005 "field ctx is required for List");
2006 return NULL;
2007 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002008 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002009 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 p->kind = List_kind;
2012 p->v.List.elts = elts;
2013 p->v.List.ctx = ctx;
2014 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002015 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 return p;
2017}
2018
2019expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002020Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
2021 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022{
2023 expr_ty p;
2024 if (!ctx) {
2025 PyErr_SetString(PyExc_ValueError,
2026 "field ctx is required for Tuple");
2027 return NULL;
2028 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002029 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002030 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 p->kind = Tuple_kind;
2033 p->v.Tuple.elts = elts;
2034 p->v.Tuple.ctx = ctx;
2035 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002036 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 return p;
2038}
2039
2040slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042{
2043 slice_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002044 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002045 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 p->kind = Slice_kind;
2048 p->v.Slice.lower = lower;
2049 p->v.Slice.upper = upper;
2050 p->v.Slice.step = step;
2051 return p;
2052}
2053
2054slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002055ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056{
2057 slice_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002058 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002059 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 p->kind = ExtSlice_kind;
2062 p->v.ExtSlice.dims = dims;
2063 return p;
2064}
2065
2066slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002067Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068{
2069 slice_ty p;
2070 if (!value) {
2071 PyErr_SetString(PyExc_ValueError,
2072 "field value is required for Index");
2073 return NULL;
2074 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002075 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002076 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 p->kind = Index_kind;
2079 p->v.Index.value = value;
2080 return p;
2081}
2082
2083comprehension_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002084comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085{
2086 comprehension_ty p;
2087 if (!target) {
2088 PyErr_SetString(PyExc_ValueError,
2089 "field target is required for comprehension");
2090 return NULL;
2091 }
2092 if (!iter) {
2093 PyErr_SetString(PyExc_ValueError,
2094 "field iter is required for comprehension");
2095 return NULL;
2096 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002097 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002098 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 p->target = target;
2101 p->iter = iter;
2102 p->ifs = ifs;
2103 return p;
2104}
2105
2106excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002107ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002108 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109{
2110 excepthandler_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002111 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002112 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 return NULL;
Neal Norwitzad74aa82008-03-31 05:14:30 +00002114 p->kind = ExceptHandler_kind;
2115 p->v.ExceptHandler.type = type;
2116 p->v.ExceptHandler.name = name;
2117 p->v.ExceptHandler.body = body;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002118 p->lineno = lineno;
2119 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 return p;
2121}
2122
2123arguments_ty
Neal Norwitzc1505362006-12-28 06:47:50 +00002124arguments(asdl_seq * args, identifier vararg, expr_ty varargannotation,
2125 asdl_seq * kwonlyargs, identifier kwarg, expr_ty kwargannotation,
2126 asdl_seq * defaults, asdl_seq * kw_defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127{
2128 arguments_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002129 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002130 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132 p->args = args;
2133 p->vararg = vararg;
Neal Norwitzc1505362006-12-28 06:47:50 +00002134 p->varargannotation = varargannotation;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002135 p->kwonlyargs = kwonlyargs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 p->kwarg = kwarg;
Neal Norwitzc1505362006-12-28 06:47:50 +00002137 p->kwargannotation = kwargannotation;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 p->defaults = defaults;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002139 p->kw_defaults = kw_defaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 return p;
2141}
2142
Neal Norwitzc1505362006-12-28 06:47:50 +00002143arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002144arg(identifier arg, expr_ty annotation, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002145{
2146 arg_ty p;
2147 if (!arg) {
2148 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002149 "field arg is required for arg");
Neal Norwitzc1505362006-12-28 06:47:50 +00002150 return NULL;
2151 }
2152 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002153 if (!p)
Neal Norwitzc1505362006-12-28 06:47:50 +00002154 return NULL;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002155 p->arg = arg;
2156 p->annotation = annotation;
Neal Norwitzc1505362006-12-28 06:47:50 +00002157 return p;
2158}
2159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002161keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162{
2163 keyword_ty p;
2164 if (!arg) {
2165 PyErr_SetString(PyExc_ValueError,
2166 "field arg is required for keyword");
2167 return NULL;
2168 }
2169 if (!value) {
2170 PyErr_SetString(PyExc_ValueError,
2171 "field value is required for keyword");
2172 return NULL;
2173 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002174 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002175 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177 p->arg = arg;
2178 p->value = value;
2179 return p;
2180}
2181
2182alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002183alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184{
2185 alias_ty p;
2186 if (!name) {
2187 PyErr_SetString(PyExc_ValueError,
2188 "field name is required for alias");
2189 return NULL;
2190 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002191 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002192 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 p->name = name;
2195 p->asname = asname;
2196 return p;
2197}
2198
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002199withitem_ty
2200withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
2201{
2202 withitem_ty p;
2203 if (!context_expr) {
2204 PyErr_SetString(PyExc_ValueError,
2205 "field context_expr is required for withitem");
2206 return NULL;
2207 }
2208 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
2209 if (!p)
2210 return NULL;
2211 p->context_expr = context_expr;
2212 p->optional_vars = optional_vars;
2213 return p;
2214}
2215
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002216
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002217PyObject*
2218ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002219{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002220 mod_ty o = (mod_ty)_o;
2221 PyObject *result = NULL, *value = NULL;
2222 if (!o) {
2223 Py_INCREF(Py_None);
2224 return Py_None;
2225 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002226
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227 switch (o->kind) {
2228 case Module_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002229 result = PyType_GenericNew(Module_type, NULL, NULL);
2230 if (!result) goto failed;
2231 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2232 if (!value) goto failed;
2233 if (PyObject_SetAttrString(result, "body", value) == -1)
2234 goto failed;
2235 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 break;
2237 case Interactive_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002238 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2239 if (!result) goto failed;
2240 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2241 if (!value) goto failed;
2242 if (PyObject_SetAttrString(result, "body", value) == -1)
2243 goto failed;
2244 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 break;
2246 case Expression_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002247 result = PyType_GenericNew(Expression_type, NULL, NULL);
2248 if (!result) goto failed;
2249 value = ast2obj_expr(o->v.Expression.body);
2250 if (!value) goto failed;
2251 if (PyObject_SetAttrString(result, "body", value) == -1)
2252 goto failed;
2253 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 break;
2255 case Suite_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002256 result = PyType_GenericNew(Suite_type, NULL, NULL);
2257 if (!result) goto failed;
2258 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2259 if (!value) goto failed;
2260 if (PyObject_SetAttrString(result, "body", value) == -1)
2261 goto failed;
2262 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 break;
2264 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002265 return result;
2266failed:
2267 Py_XDECREF(value);
2268 Py_XDECREF(result);
2269 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270}
2271
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002272PyObject*
2273ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002275 stmt_ty o = (stmt_ty)_o;
2276 PyObject *result = NULL, *value = NULL;
2277 if (!o) {
2278 Py_INCREF(Py_None);
2279 return Py_None;
2280 }
2281
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 switch (o->kind) {
2283 case FunctionDef_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002284 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2285 if (!result) goto failed;
2286 value = ast2obj_identifier(o->v.FunctionDef.name);
2287 if (!value) goto failed;
2288 if (PyObject_SetAttrString(result, "name", value) == -1)
2289 goto failed;
2290 Py_DECREF(value);
2291 value = ast2obj_arguments(o->v.FunctionDef.args);
2292 if (!value) goto failed;
2293 if (PyObject_SetAttrString(result, "args", value) == -1)
2294 goto failed;
2295 Py_DECREF(value);
2296 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2297 if (!value) goto failed;
2298 if (PyObject_SetAttrString(result, "body", value) == -1)
2299 goto failed;
2300 Py_DECREF(value);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002301 value = ast2obj_list(o->v.FunctionDef.decorator_list,
2302 ast2obj_expr);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002303 if (!value) goto failed;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002304 if (PyObject_SetAttrString(result, "decorator_list", value) ==
2305 -1)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002306 goto failed;
2307 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00002308 value = ast2obj_expr(o->v.FunctionDef.returns);
2309 if (!value) goto failed;
2310 if (PyObject_SetAttrString(result, "returns", value) == -1)
2311 goto failed;
2312 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 break;
2314 case ClassDef_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002315 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2316 if (!result) goto failed;
2317 value = ast2obj_identifier(o->v.ClassDef.name);
2318 if (!value) goto failed;
2319 if (PyObject_SetAttrString(result, "name", value) == -1)
2320 goto failed;
2321 Py_DECREF(value);
2322 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2323 if (!value) goto failed;
2324 if (PyObject_SetAttrString(result, "bases", value) == -1)
2325 goto failed;
2326 Py_DECREF(value);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002327 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2328 if (!value) goto failed;
2329 if (PyObject_SetAttrString(result, "keywords", value) == -1)
2330 goto failed;
2331 Py_DECREF(value);
2332 value = ast2obj_expr(o->v.ClassDef.starargs);
2333 if (!value) goto failed;
2334 if (PyObject_SetAttrString(result, "starargs", value) == -1)
2335 goto failed;
2336 Py_DECREF(value);
2337 value = ast2obj_expr(o->v.ClassDef.kwargs);
2338 if (!value) goto failed;
2339 if (PyObject_SetAttrString(result, "kwargs", value) == -1)
2340 goto failed;
2341 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002342 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2343 if (!value) goto failed;
2344 if (PyObject_SetAttrString(result, "body", value) == -1)
2345 goto failed;
2346 Py_DECREF(value);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002347 value = ast2obj_list(o->v.ClassDef.decorator_list,
2348 ast2obj_expr);
2349 if (!value) goto failed;
2350 if (PyObject_SetAttrString(result, "decorator_list", value) ==
2351 -1)
2352 goto failed;
2353 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 break;
2355 case Return_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002356 result = PyType_GenericNew(Return_type, NULL, NULL);
2357 if (!result) goto failed;
2358 value = ast2obj_expr(o->v.Return.value);
2359 if (!value) goto failed;
2360 if (PyObject_SetAttrString(result, "value", value) == -1)
2361 goto failed;
2362 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 break;
2364 case Delete_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002365 result = PyType_GenericNew(Delete_type, NULL, NULL);
2366 if (!result) goto failed;
2367 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2368 if (!value) goto failed;
2369 if (PyObject_SetAttrString(result, "targets", value) == -1)
2370 goto failed;
2371 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 break;
2373 case Assign_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002374 result = PyType_GenericNew(Assign_type, NULL, NULL);
2375 if (!result) goto failed;
2376 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2377 if (!value) goto failed;
2378 if (PyObject_SetAttrString(result, "targets", value) == -1)
2379 goto failed;
2380 Py_DECREF(value);
2381 value = ast2obj_expr(o->v.Assign.value);
2382 if (!value) goto failed;
2383 if (PyObject_SetAttrString(result, "value", value) == -1)
2384 goto failed;
2385 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 break;
2387 case AugAssign_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002388 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2389 if (!result) goto failed;
2390 value = ast2obj_expr(o->v.AugAssign.target);
2391 if (!value) goto failed;
2392 if (PyObject_SetAttrString(result, "target", value) == -1)
2393 goto failed;
2394 Py_DECREF(value);
2395 value = ast2obj_operator(o->v.AugAssign.op);
2396 if (!value) goto failed;
2397 if (PyObject_SetAttrString(result, "op", value) == -1)
2398 goto failed;
2399 Py_DECREF(value);
2400 value = ast2obj_expr(o->v.AugAssign.value);
2401 if (!value) goto failed;
2402 if (PyObject_SetAttrString(result, "value", value) == -1)
2403 goto failed;
2404 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 case For_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002407 result = PyType_GenericNew(For_type, NULL, NULL);
2408 if (!result) goto failed;
2409 value = ast2obj_expr(o->v.For.target);
2410 if (!value) goto failed;
2411 if (PyObject_SetAttrString(result, "target", value) == -1)
2412 goto failed;
2413 Py_DECREF(value);
2414 value = ast2obj_expr(o->v.For.iter);
2415 if (!value) goto failed;
2416 if (PyObject_SetAttrString(result, "iter", value) == -1)
2417 goto failed;
2418 Py_DECREF(value);
2419 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2420 if (!value) goto failed;
2421 if (PyObject_SetAttrString(result, "body", value) == -1)
2422 goto failed;
2423 Py_DECREF(value);
2424 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2425 if (!value) goto failed;
2426 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2427 goto failed;
2428 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429 break;
2430 case While_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002431 result = PyType_GenericNew(While_type, NULL, NULL);
2432 if (!result) goto failed;
2433 value = ast2obj_expr(o->v.While.test);
2434 if (!value) goto failed;
2435 if (PyObject_SetAttrString(result, "test", value) == -1)
2436 goto failed;
2437 Py_DECREF(value);
2438 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2439 if (!value) goto failed;
2440 if (PyObject_SetAttrString(result, "body", value) == -1)
2441 goto failed;
2442 Py_DECREF(value);
2443 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2444 if (!value) goto failed;
2445 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2446 goto failed;
2447 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 break;
2449 case If_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002450 result = PyType_GenericNew(If_type, NULL, NULL);
2451 if (!result) goto failed;
2452 value = ast2obj_expr(o->v.If.test);
2453 if (!value) goto failed;
2454 if (PyObject_SetAttrString(result, "test", value) == -1)
2455 goto failed;
2456 Py_DECREF(value);
2457 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2458 if (!value) goto failed;
2459 if (PyObject_SetAttrString(result, "body", value) == -1)
2460 goto failed;
2461 Py_DECREF(value);
2462 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2463 if (!value) goto failed;
2464 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2465 goto failed;
2466 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002468 case With_kind:
2469 result = PyType_GenericNew(With_type, NULL, NULL);
2470 if (!result) goto failed;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002471 value = ast2obj_list(o->v.With.items, ast2obj_withitem);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002472 if (!value) goto failed;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002473 if (PyObject_SetAttrString(result, "items", value) == -1)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002474 goto failed;
2475 Py_DECREF(value);
2476 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2477 if (!value) goto failed;
2478 if (PyObject_SetAttrString(result, "body", value) == -1)
2479 goto failed;
2480 Py_DECREF(value);
2481 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 case Raise_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002483 result = PyType_GenericNew(Raise_type, NULL, NULL);
2484 if (!result) goto failed;
Collin Winter828f04a2007-08-31 00:04:24 +00002485 value = ast2obj_expr(o->v.Raise.exc);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002486 if (!value) goto failed;
Collin Winter828f04a2007-08-31 00:04:24 +00002487 if (PyObject_SetAttrString(result, "exc", value) == -1)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002488 goto failed;
2489 Py_DECREF(value);
Collin Winter828f04a2007-08-31 00:04:24 +00002490 value = ast2obj_expr(o->v.Raise.cause);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002491 if (!value) goto failed;
Collin Winter828f04a2007-08-31 00:04:24 +00002492 if (PyObject_SetAttrString(result, "cause", value) == -1)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002493 goto failed;
2494 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002496 case Try_kind:
2497 result = PyType_GenericNew(Try_type, NULL, NULL);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002498 if (!result) goto failed;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002499 value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002500 if (!value) goto failed;
2501 if (PyObject_SetAttrString(result, "body", value) == -1)
2502 goto failed;
2503 Py_DECREF(value);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002504 value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002505 if (!value) goto failed;
2506 if (PyObject_SetAttrString(result, "handlers", value) == -1)
2507 goto failed;
2508 Py_DECREF(value);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002509 value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002510 if (!value) goto failed;
2511 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2512 goto failed;
2513 Py_DECREF(value);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002514 value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002515 if (!value) goto failed;
2516 if (PyObject_SetAttrString(result, "finalbody", value) == -1)
2517 goto failed;
2518 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 break;
2520 case Assert_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002521 result = PyType_GenericNew(Assert_type, NULL, NULL);
2522 if (!result) goto failed;
2523 value = ast2obj_expr(o->v.Assert.test);
2524 if (!value) goto failed;
2525 if (PyObject_SetAttrString(result, "test", value) == -1)
2526 goto failed;
2527 Py_DECREF(value);
2528 value = ast2obj_expr(o->v.Assert.msg);
2529 if (!value) goto failed;
2530 if (PyObject_SetAttrString(result, "msg", value) == -1)
2531 goto failed;
2532 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 break;
2534 case Import_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002535 result = PyType_GenericNew(Import_type, NULL, NULL);
2536 if (!result) goto failed;
2537 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2538 if (!value) goto failed;
2539 if (PyObject_SetAttrString(result, "names", value) == -1)
2540 goto failed;
2541 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 break;
2543 case ImportFrom_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002544 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
2545 if (!result) goto failed;
2546 value = ast2obj_identifier(o->v.ImportFrom.module);
2547 if (!value) goto failed;
2548 if (PyObject_SetAttrString(result, "module", value) == -1)
2549 goto failed;
2550 Py_DECREF(value);
2551 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
2552 if (!value) goto failed;
2553 if (PyObject_SetAttrString(result, "names", value) == -1)
2554 goto failed;
2555 Py_DECREF(value);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002556 value = ast2obj_int(o->v.ImportFrom.level);
2557 if (!value) goto failed;
2558 if (PyObject_SetAttrString(result, "level", value) == -1)
2559 goto failed;
2560 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 case Global_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002563 result = PyType_GenericNew(Global_type, NULL, NULL);
2564 if (!result) goto failed;
2565 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
2566 if (!value) goto failed;
2567 if (PyObject_SetAttrString(result, "names", value) == -1)
2568 goto failed;
2569 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 break;
Jeremy Hylton81e95022007-02-27 06:50:52 +00002571 case Nonlocal_kind:
2572 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
2573 if (!result) goto failed;
2574 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
2575 if (!value) goto failed;
2576 if (PyObject_SetAttrString(result, "names", value) == -1)
2577 goto failed;
2578 Py_DECREF(value);
2579 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 case Expr_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002581 result = PyType_GenericNew(Expr_type, NULL, NULL);
2582 if (!result) goto failed;
2583 value = ast2obj_expr(o->v.Expr.value);
2584 if (!value) goto failed;
2585 if (PyObject_SetAttrString(result, "value", value) == -1)
2586 goto failed;
2587 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 break;
2589 case Pass_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002590 result = PyType_GenericNew(Pass_type, NULL, NULL);
2591 if (!result) goto failed;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 break;
2593 case Break_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002594 result = PyType_GenericNew(Break_type, NULL, NULL);
2595 if (!result) goto failed;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 break;
2597 case Continue_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002598 result = PyType_GenericNew(Continue_type, NULL, NULL);
2599 if (!result) goto failed;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600 break;
2601 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002602 value = ast2obj_int(o->lineno);
2603 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002604 if (PyObject_SetAttrString(result, "lineno", value) < 0)
2605 goto failed;
2606 Py_DECREF(value);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002607 value = ast2obj_int(o->col_offset);
2608 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002609 if (PyObject_SetAttrString(result, "col_offset", value) < 0)
2610 goto failed;
2611 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002612 return result;
2613failed:
2614 Py_XDECREF(value);
2615 Py_XDECREF(result);
2616 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617}
2618
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002619PyObject*
2620ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002622 expr_ty o = (expr_ty)_o;
2623 PyObject *result = NULL, *value = NULL;
2624 if (!o) {
2625 Py_INCREF(Py_None);
2626 return Py_None;
2627 }
2628
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 switch (o->kind) {
2630 case BoolOp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002631 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
2632 if (!result) goto failed;
2633 value = ast2obj_boolop(o->v.BoolOp.op);
2634 if (!value) goto failed;
2635 if (PyObject_SetAttrString(result, "op", value) == -1)
2636 goto failed;
2637 Py_DECREF(value);
2638 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
2639 if (!value) goto failed;
2640 if (PyObject_SetAttrString(result, "values", value) == -1)
2641 goto failed;
2642 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 break;
2644 case BinOp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002645 result = PyType_GenericNew(BinOp_type, NULL, NULL);
2646 if (!result) goto failed;
2647 value = ast2obj_expr(o->v.BinOp.left);
2648 if (!value) goto failed;
2649 if (PyObject_SetAttrString(result, "left", value) == -1)
2650 goto failed;
2651 Py_DECREF(value);
2652 value = ast2obj_operator(o->v.BinOp.op);
2653 if (!value) goto failed;
2654 if (PyObject_SetAttrString(result, "op", value) == -1)
2655 goto failed;
2656 Py_DECREF(value);
2657 value = ast2obj_expr(o->v.BinOp.right);
2658 if (!value) goto failed;
2659 if (PyObject_SetAttrString(result, "right", value) == -1)
2660 goto failed;
2661 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 break;
2663 case UnaryOp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002664 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
2665 if (!result) goto failed;
2666 value = ast2obj_unaryop(o->v.UnaryOp.op);
2667 if (!value) goto failed;
2668 if (PyObject_SetAttrString(result, "op", value) == -1)
2669 goto failed;
2670 Py_DECREF(value);
2671 value = ast2obj_expr(o->v.UnaryOp.operand);
2672 if (!value) goto failed;
2673 if (PyObject_SetAttrString(result, "operand", value) == -1)
2674 goto failed;
2675 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 break;
2677 case Lambda_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002678 result = PyType_GenericNew(Lambda_type, NULL, NULL);
2679 if (!result) goto failed;
2680 value = ast2obj_arguments(o->v.Lambda.args);
2681 if (!value) goto failed;
2682 if (PyObject_SetAttrString(result, "args", value) == -1)
2683 goto failed;
2684 Py_DECREF(value);
2685 value = ast2obj_expr(o->v.Lambda.body);
2686 if (!value) goto failed;
2687 if (PyObject_SetAttrString(result, "body", value) == -1)
2688 goto failed;
2689 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 break;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002691 case IfExp_kind:
2692 result = PyType_GenericNew(IfExp_type, NULL, NULL);
2693 if (!result) goto failed;
2694 value = ast2obj_expr(o->v.IfExp.test);
2695 if (!value) goto failed;
2696 if (PyObject_SetAttrString(result, "test", value) == -1)
2697 goto failed;
2698 Py_DECREF(value);
2699 value = ast2obj_expr(o->v.IfExp.body);
2700 if (!value) goto failed;
2701 if (PyObject_SetAttrString(result, "body", value) == -1)
2702 goto failed;
2703 Py_DECREF(value);
2704 value = ast2obj_expr(o->v.IfExp.orelse);
2705 if (!value) goto failed;
2706 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2707 goto failed;
2708 Py_DECREF(value);
2709 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 case Dict_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002711 result = PyType_GenericNew(Dict_type, NULL, NULL);
2712 if (!result) goto failed;
2713 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
2714 if (!value) goto failed;
2715 if (PyObject_SetAttrString(result, "keys", value) == -1)
2716 goto failed;
2717 Py_DECREF(value);
2718 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
2719 if (!value) goto failed;
2720 if (PyObject_SetAttrString(result, "values", value) == -1)
2721 goto failed;
2722 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 break;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002724 case Set_kind:
2725 result = PyType_GenericNew(Set_type, NULL, NULL);
2726 if (!result) goto failed;
2727 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
2728 if (!value) goto failed;
2729 if (PyObject_SetAttrString(result, "elts", value) == -1)
2730 goto failed;
2731 Py_DECREF(value);
2732 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 case ListComp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002734 result = PyType_GenericNew(ListComp_type, NULL, NULL);
2735 if (!result) goto failed;
2736 value = ast2obj_expr(o->v.ListComp.elt);
2737 if (!value) goto failed;
2738 if (PyObject_SetAttrString(result, "elt", value) == -1)
2739 goto failed;
2740 Py_DECREF(value);
2741 value = ast2obj_list(o->v.ListComp.generators,
2742 ast2obj_comprehension);
2743 if (!value) goto failed;
2744 if (PyObject_SetAttrString(result, "generators", value) == -1)
2745 goto failed;
2746 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002748 case SetComp_kind:
2749 result = PyType_GenericNew(SetComp_type, NULL, NULL);
2750 if (!result) goto failed;
2751 value = ast2obj_expr(o->v.SetComp.elt);
2752 if (!value) goto failed;
2753 if (PyObject_SetAttrString(result, "elt", value) == -1)
2754 goto failed;
2755 Py_DECREF(value);
2756 value = ast2obj_list(o->v.SetComp.generators,
2757 ast2obj_comprehension);
2758 if (!value) goto failed;
2759 if (PyObject_SetAttrString(result, "generators", value) == -1)
2760 goto failed;
2761 Py_DECREF(value);
2762 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002763 case DictComp_kind:
2764 result = PyType_GenericNew(DictComp_type, NULL, NULL);
2765 if (!result) goto failed;
2766 value = ast2obj_expr(o->v.DictComp.key);
2767 if (!value) goto failed;
2768 if (PyObject_SetAttrString(result, "key", value) == -1)
2769 goto failed;
2770 Py_DECREF(value);
2771 value = ast2obj_expr(o->v.DictComp.value);
2772 if (!value) goto failed;
2773 if (PyObject_SetAttrString(result, "value", value) == -1)
2774 goto failed;
2775 Py_DECREF(value);
2776 value = ast2obj_list(o->v.DictComp.generators,
2777 ast2obj_comprehension);
2778 if (!value) goto failed;
2779 if (PyObject_SetAttrString(result, "generators", value) == -1)
2780 goto failed;
2781 Py_DECREF(value);
2782 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 case GeneratorExp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002784 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
2785 if (!result) goto failed;
2786 value = ast2obj_expr(o->v.GeneratorExp.elt);
2787 if (!value) goto failed;
2788 if (PyObject_SetAttrString(result, "elt", value) == -1)
2789 goto failed;
2790 Py_DECREF(value);
2791 value = ast2obj_list(o->v.GeneratorExp.generators,
2792 ast2obj_comprehension);
2793 if (!value) goto failed;
2794 if (PyObject_SetAttrString(result, "generators", value) == -1)
2795 goto failed;
2796 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 break;
2798 case Yield_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002799 result = PyType_GenericNew(Yield_type, NULL, NULL);
2800 if (!result) goto failed;
2801 value = ast2obj_expr(o->v.Yield.value);
2802 if (!value) goto failed;
2803 if (PyObject_SetAttrString(result, "value", value) == -1)
2804 goto failed;
2805 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806 break;
2807 case Compare_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002808 result = PyType_GenericNew(Compare_type, NULL, NULL);
2809 if (!result) goto failed;
2810 value = ast2obj_expr(o->v.Compare.left);
2811 if (!value) goto failed;
2812 if (PyObject_SetAttrString(result, "left", value) == -1)
2813 goto failed;
2814 Py_DECREF(value);
Martin v. Löwisce1d5d22006-02-26 20:51:25 +00002815 {
2816 int i, n = asdl_seq_LEN(o->v.Compare.ops);
2817 value = PyList_New(n);
2818 if (!value) goto failed;
2819 for(i = 0; i < n; i++)
2820 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
2821 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002822 if (!value) goto failed;
2823 if (PyObject_SetAttrString(result, "ops", value) == -1)
2824 goto failed;
2825 Py_DECREF(value);
2826 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
2827 if (!value) goto failed;
2828 if (PyObject_SetAttrString(result, "comparators", value) == -1)
2829 goto failed;
2830 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 break;
2832 case Call_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002833 result = PyType_GenericNew(Call_type, NULL, NULL);
2834 if (!result) goto failed;
2835 value = ast2obj_expr(o->v.Call.func);
2836 if (!value) goto failed;
2837 if (PyObject_SetAttrString(result, "func", value) == -1)
2838 goto failed;
2839 Py_DECREF(value);
2840 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
2841 if (!value) goto failed;
2842 if (PyObject_SetAttrString(result, "args", value) == -1)
2843 goto failed;
2844 Py_DECREF(value);
2845 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
2846 if (!value) goto failed;
2847 if (PyObject_SetAttrString(result, "keywords", value) == -1)
2848 goto failed;
2849 Py_DECREF(value);
2850 value = ast2obj_expr(o->v.Call.starargs);
2851 if (!value) goto failed;
2852 if (PyObject_SetAttrString(result, "starargs", value) == -1)
2853 goto failed;
2854 Py_DECREF(value);
2855 value = ast2obj_expr(o->v.Call.kwargs);
2856 if (!value) goto failed;
2857 if (PyObject_SetAttrString(result, "kwargs", value) == -1)
2858 goto failed;
2859 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 case Num_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002862 result = PyType_GenericNew(Num_type, NULL, NULL);
2863 if (!result) goto failed;
2864 value = ast2obj_object(o->v.Num.n);
2865 if (!value) goto failed;
2866 if (PyObject_SetAttrString(result, "n", value) == -1)
2867 goto failed;
2868 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 break;
2870 case Str_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002871 result = PyType_GenericNew(Str_type, NULL, NULL);
2872 if (!result) goto failed;
2873 value = ast2obj_string(o->v.Str.s);
2874 if (!value) goto failed;
2875 if (PyObject_SetAttrString(result, "s", value) == -1)
2876 goto failed;
2877 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00002879 case Bytes_kind:
2880 result = PyType_GenericNew(Bytes_type, NULL, NULL);
2881 if (!result) goto failed;
Benjamin Petersone2498412011-08-09 16:08:39 -05002882 value = ast2obj_bytes(o->v.Bytes.s);
Thomas Wouters00e41de2007-02-23 19:56:57 +00002883 if (!value) goto failed;
2884 if (PyObject_SetAttrString(result, "s", value) == -1)
2885 goto failed;
2886 Py_DECREF(value);
2887 break;
Georg Brandl52318d62006-09-06 07:06:08 +00002888 case Ellipsis_kind:
2889 result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
2890 if (!result) goto failed;
2891 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892 case Attribute_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002893 result = PyType_GenericNew(Attribute_type, NULL, NULL);
2894 if (!result) goto failed;
2895 value = ast2obj_expr(o->v.Attribute.value);
2896 if (!value) goto failed;
2897 if (PyObject_SetAttrString(result, "value", value) == -1)
2898 goto failed;
2899 Py_DECREF(value);
2900 value = ast2obj_identifier(o->v.Attribute.attr);
2901 if (!value) goto failed;
2902 if (PyObject_SetAttrString(result, "attr", value) == -1)
2903 goto failed;
2904 Py_DECREF(value);
2905 value = ast2obj_expr_context(o->v.Attribute.ctx);
2906 if (!value) goto failed;
2907 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2908 goto failed;
2909 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 break;
2911 case Subscript_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002912 result = PyType_GenericNew(Subscript_type, NULL, NULL);
2913 if (!result) goto failed;
2914 value = ast2obj_expr(o->v.Subscript.value);
2915 if (!value) goto failed;
2916 if (PyObject_SetAttrString(result, "value", value) == -1)
2917 goto failed;
2918 Py_DECREF(value);
2919 value = ast2obj_slice(o->v.Subscript.slice);
2920 if (!value) goto failed;
2921 if (PyObject_SetAttrString(result, "slice", value) == -1)
2922 goto failed;
2923 Py_DECREF(value);
2924 value = ast2obj_expr_context(o->v.Subscript.ctx);
2925 if (!value) goto failed;
2926 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2927 goto failed;
2928 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00002930 case Starred_kind:
2931 result = PyType_GenericNew(Starred_type, NULL, NULL);
2932 if (!result) goto failed;
2933 value = ast2obj_expr(o->v.Starred.value);
2934 if (!value) goto failed;
2935 if (PyObject_SetAttrString(result, "value", value) == -1)
2936 goto failed;
2937 Py_DECREF(value);
2938 value = ast2obj_expr_context(o->v.Starred.ctx);
2939 if (!value) goto failed;
2940 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2941 goto failed;
2942 Py_DECREF(value);
2943 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002944 case Name_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002945 result = PyType_GenericNew(Name_type, NULL, NULL);
2946 if (!result) goto failed;
2947 value = ast2obj_identifier(o->v.Name.id);
2948 if (!value) goto failed;
2949 if (PyObject_SetAttrString(result, "id", value) == -1)
2950 goto failed;
2951 Py_DECREF(value);
2952 value = ast2obj_expr_context(o->v.Name.ctx);
2953 if (!value) goto failed;
2954 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2955 goto failed;
2956 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 break;
2958 case List_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002959 result = PyType_GenericNew(List_type, NULL, NULL);
2960 if (!result) goto failed;
2961 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
2962 if (!value) goto failed;
2963 if (PyObject_SetAttrString(result, "elts", value) == -1)
2964 goto failed;
2965 Py_DECREF(value);
2966 value = ast2obj_expr_context(o->v.List.ctx);
2967 if (!value) goto failed;
2968 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2969 goto failed;
2970 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 break;
2972 case Tuple_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002973 result = PyType_GenericNew(Tuple_type, NULL, NULL);
2974 if (!result) goto failed;
2975 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
2976 if (!value) goto failed;
2977 if (PyObject_SetAttrString(result, "elts", value) == -1)
2978 goto failed;
2979 Py_DECREF(value);
2980 value = ast2obj_expr_context(o->v.Tuple.ctx);
2981 if (!value) goto failed;
2982 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2983 goto failed;
2984 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002985 break;
2986 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002987 value = ast2obj_int(o->lineno);
2988 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002989 if (PyObject_SetAttrString(result, "lineno", value) < 0)
2990 goto failed;
2991 Py_DECREF(value);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002992 value = ast2obj_int(o->col_offset);
2993 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002994 if (PyObject_SetAttrString(result, "col_offset", value) < 0)
2995 goto failed;
2996 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002997 return result;
2998failed:
2999 Py_XDECREF(value);
3000 Py_XDECREF(result);
3001 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002}
3003
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003004PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003006 switch(o) {
3007 case Load:
3008 Py_INCREF(Load_singleton);
3009 return Load_singleton;
3010 case Store:
3011 Py_INCREF(Store_singleton);
3012 return Store_singleton;
3013 case Del:
3014 Py_INCREF(Del_singleton);
3015 return Del_singleton;
3016 case AugLoad:
3017 Py_INCREF(AugLoad_singleton);
3018 return AugLoad_singleton;
3019 case AugStore:
3020 Py_INCREF(AugStore_singleton);
3021 return AugStore_singleton;
3022 case Param:
3023 Py_INCREF(Param_singleton);
3024 return Param_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003025 default:
3026 /* should never happen, but just in case ... */
3027 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
3028 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003031PyObject*
3032ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003034 slice_ty o = (slice_ty)_o;
3035 PyObject *result = NULL, *value = NULL;
3036 if (!o) {
3037 Py_INCREF(Py_None);
3038 return Py_None;
3039 }
3040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 switch (o->kind) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 case Slice_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003043 result = PyType_GenericNew(Slice_type, NULL, NULL);
3044 if (!result) goto failed;
3045 value = ast2obj_expr(o->v.Slice.lower);
3046 if (!value) goto failed;
3047 if (PyObject_SetAttrString(result, "lower", value) == -1)
3048 goto failed;
3049 Py_DECREF(value);
3050 value = ast2obj_expr(o->v.Slice.upper);
3051 if (!value) goto failed;
3052 if (PyObject_SetAttrString(result, "upper", value) == -1)
3053 goto failed;
3054 Py_DECREF(value);
3055 value = ast2obj_expr(o->v.Slice.step);
3056 if (!value) goto failed;
3057 if (PyObject_SetAttrString(result, "step", value) == -1)
3058 goto failed;
3059 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 break;
3061 case ExtSlice_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003062 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3063 if (!result) goto failed;
3064 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3065 if (!value) goto failed;
3066 if (PyObject_SetAttrString(result, "dims", value) == -1)
3067 goto failed;
3068 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 break;
3070 case Index_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003071 result = PyType_GenericNew(Index_type, NULL, NULL);
3072 if (!result) goto failed;
3073 value = ast2obj_expr(o->v.Index.value);
3074 if (!value) goto failed;
3075 if (PyObject_SetAttrString(result, "value", value) == -1)
3076 goto failed;
3077 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 break;
3079 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003080 return result;
3081failed:
3082 Py_XDECREF(value);
3083 Py_XDECREF(result);
3084 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085}
3086
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003087PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003089 switch(o) {
3090 case And:
3091 Py_INCREF(And_singleton);
3092 return And_singleton;
3093 case Or:
3094 Py_INCREF(Or_singleton);
3095 return Or_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003096 default:
3097 /* should never happen, but just in case ... */
3098 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3099 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003101}
3102PyObject* ast2obj_operator(operator_ty o)
3103{
3104 switch(o) {
3105 case Add:
3106 Py_INCREF(Add_singleton);
3107 return Add_singleton;
3108 case Sub:
3109 Py_INCREF(Sub_singleton);
3110 return Sub_singleton;
3111 case Mult:
3112 Py_INCREF(Mult_singleton);
3113 return Mult_singleton;
3114 case Div:
3115 Py_INCREF(Div_singleton);
3116 return Div_singleton;
3117 case Mod:
3118 Py_INCREF(Mod_singleton);
3119 return Mod_singleton;
3120 case Pow:
3121 Py_INCREF(Pow_singleton);
3122 return Pow_singleton;
3123 case LShift:
3124 Py_INCREF(LShift_singleton);
3125 return LShift_singleton;
3126 case RShift:
3127 Py_INCREF(RShift_singleton);
3128 return RShift_singleton;
3129 case BitOr:
3130 Py_INCREF(BitOr_singleton);
3131 return BitOr_singleton;
3132 case BitXor:
3133 Py_INCREF(BitXor_singleton);
3134 return BitXor_singleton;
3135 case BitAnd:
3136 Py_INCREF(BitAnd_singleton);
3137 return BitAnd_singleton;
3138 case FloorDiv:
3139 Py_INCREF(FloorDiv_singleton);
3140 return FloorDiv_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003141 default:
3142 /* should never happen, but just in case ... */
3143 PyErr_Format(PyExc_SystemError, "unknown operator found");
3144 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003145 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003146}
3147PyObject* ast2obj_unaryop(unaryop_ty o)
3148{
3149 switch(o) {
3150 case Invert:
3151 Py_INCREF(Invert_singleton);
3152 return Invert_singleton;
3153 case Not:
3154 Py_INCREF(Not_singleton);
3155 return Not_singleton;
3156 case UAdd:
3157 Py_INCREF(UAdd_singleton);
3158 return UAdd_singleton;
3159 case USub:
3160 Py_INCREF(USub_singleton);
3161 return USub_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003162 default:
3163 /* should never happen, but just in case ... */
3164 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3165 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003166 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003167}
3168PyObject* ast2obj_cmpop(cmpop_ty o)
3169{
3170 switch(o) {
3171 case Eq:
3172 Py_INCREF(Eq_singleton);
3173 return Eq_singleton;
3174 case NotEq:
3175 Py_INCREF(NotEq_singleton);
3176 return NotEq_singleton;
3177 case Lt:
3178 Py_INCREF(Lt_singleton);
3179 return Lt_singleton;
3180 case LtE:
3181 Py_INCREF(LtE_singleton);
3182 return LtE_singleton;
3183 case Gt:
3184 Py_INCREF(Gt_singleton);
3185 return Gt_singleton;
3186 case GtE:
3187 Py_INCREF(GtE_singleton);
3188 return GtE_singleton;
3189 case Is:
3190 Py_INCREF(Is_singleton);
3191 return Is_singleton;
3192 case IsNot:
3193 Py_INCREF(IsNot_singleton);
3194 return IsNot_singleton;
3195 case In:
3196 Py_INCREF(In_singleton);
3197 return In_singleton;
3198 case NotIn:
3199 Py_INCREF(NotIn_singleton);
3200 return NotIn_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003201 default:
3202 /* should never happen, but just in case ... */
3203 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3204 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003205 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003206}
3207PyObject*
3208ast2obj_comprehension(void* _o)
3209{
3210 comprehension_ty o = (comprehension_ty)_o;
3211 PyObject *result = NULL, *value = NULL;
3212 if (!o) {
3213 Py_INCREF(Py_None);
3214 return Py_None;
3215 }
3216
3217 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3218 if (!result) return NULL;
3219 value = ast2obj_expr(o->target);
3220 if (!value) goto failed;
3221 if (PyObject_SetAttrString(result, "target", value) == -1)
3222 goto failed;
3223 Py_DECREF(value);
3224 value = ast2obj_expr(o->iter);
3225 if (!value) goto failed;
3226 if (PyObject_SetAttrString(result, "iter", value) == -1)
3227 goto failed;
3228 Py_DECREF(value);
3229 value = ast2obj_list(o->ifs, ast2obj_expr);
3230 if (!value) goto failed;
3231 if (PyObject_SetAttrString(result, "ifs", value) == -1)
3232 goto failed;
3233 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003234 return result;
3235failed:
3236 Py_XDECREF(value);
3237 Py_XDECREF(result);
3238 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003239}
3240
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003241PyObject*
3242ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003244 excepthandler_ty o = (excepthandler_ty)_o;
3245 PyObject *result = NULL, *value = NULL;
3246 if (!o) {
3247 Py_INCREF(Py_None);
3248 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003249 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003250
Neal Norwitzad74aa82008-03-31 05:14:30 +00003251 switch (o->kind) {
3252 case ExceptHandler_kind:
3253 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3254 if (!result) goto failed;
3255 value = ast2obj_expr(o->v.ExceptHandler.type);
3256 if (!value) goto failed;
3257 if (PyObject_SetAttrString(result, "type", value) == -1)
3258 goto failed;
3259 Py_DECREF(value);
3260 value = ast2obj_identifier(o->v.ExceptHandler.name);
3261 if (!value) goto failed;
3262 if (PyObject_SetAttrString(result, "name", value) == -1)
3263 goto failed;
3264 Py_DECREF(value);
3265 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3266 if (!value) goto failed;
3267 if (PyObject_SetAttrString(result, "body", value) == -1)
3268 goto failed;
3269 Py_DECREF(value);
3270 break;
3271 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003272 value = ast2obj_int(o->lineno);
3273 if (!value) goto failed;
Neal Norwitzad74aa82008-03-31 05:14:30 +00003274 if (PyObject_SetAttrString(result, "lineno", value) < 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003275 goto failed;
3276 Py_DECREF(value);
3277 value = ast2obj_int(o->col_offset);
3278 if (!value) goto failed;
Neal Norwitzad74aa82008-03-31 05:14:30 +00003279 if (PyObject_SetAttrString(result, "col_offset", value) < 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003280 goto failed;
3281 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003282 return result;
3283failed:
3284 Py_XDECREF(value);
3285 Py_XDECREF(result);
3286 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287}
3288
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003289PyObject*
3290ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003292 arguments_ty o = (arguments_ty)_o;
3293 PyObject *result = NULL, *value = NULL;
3294 if (!o) {
3295 Py_INCREF(Py_None);
3296 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003298
3299 result = PyType_GenericNew(arguments_type, NULL, NULL);
3300 if (!result) return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003301 value = ast2obj_list(o->args, ast2obj_arg);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003302 if (!value) goto failed;
3303 if (PyObject_SetAttrString(result, "args", value) == -1)
3304 goto failed;
3305 Py_DECREF(value);
3306 value = ast2obj_identifier(o->vararg);
3307 if (!value) goto failed;
3308 if (PyObject_SetAttrString(result, "vararg", value) == -1)
3309 goto failed;
3310 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00003311 value = ast2obj_expr(o->varargannotation);
3312 if (!value) goto failed;
3313 if (PyObject_SetAttrString(result, "varargannotation", value) == -1)
3314 goto failed;
3315 Py_DECREF(value);
3316 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003317 if (!value) goto failed;
3318 if (PyObject_SetAttrString(result, "kwonlyargs", value) == -1)
3319 goto failed;
3320 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003321 value = ast2obj_identifier(o->kwarg);
3322 if (!value) goto failed;
3323 if (PyObject_SetAttrString(result, "kwarg", value) == -1)
3324 goto failed;
3325 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00003326 value = ast2obj_expr(o->kwargannotation);
3327 if (!value) goto failed;
3328 if (PyObject_SetAttrString(result, "kwargannotation", value) == -1)
3329 goto failed;
3330 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003331 value = ast2obj_list(o->defaults, ast2obj_expr);
3332 if (!value) goto failed;
3333 if (PyObject_SetAttrString(result, "defaults", value) == -1)
3334 goto failed;
3335 Py_DECREF(value);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003336 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
3337 if (!value) goto failed;
3338 if (PyObject_SetAttrString(result, "kw_defaults", value) == -1)
3339 goto failed;
3340 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003341 return result;
3342failed:
3343 Py_XDECREF(value);
3344 Py_XDECREF(result);
3345 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346}
3347
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003348PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003349ast2obj_arg(void* _o)
3350{
3351 arg_ty o = (arg_ty)_o;
3352 PyObject *result = NULL, *value = NULL;
3353 if (!o) {
3354 Py_INCREF(Py_None);
3355 return Py_None;
3356 }
3357
Guido van Rossum1bc535d2007-05-15 18:46:22 +00003358 result = PyType_GenericNew(arg_type, NULL, NULL);
3359 if (!result) return NULL;
3360 value = ast2obj_identifier(o->arg);
3361 if (!value) goto failed;
3362 if (PyObject_SetAttrString(result, "arg", value) == -1)
3363 goto failed;
3364 Py_DECREF(value);
3365 value = ast2obj_expr(o->annotation);
3366 if (!value) goto failed;
3367 if (PyObject_SetAttrString(result, "annotation", value) == -1)
3368 goto failed;
3369 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00003370 return result;
3371failed:
3372 Py_XDECREF(value);
3373 Py_XDECREF(result);
3374 return NULL;
3375}
3376
3377PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003378ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003380 keyword_ty o = (keyword_ty)_o;
3381 PyObject *result = NULL, *value = NULL;
3382 if (!o) {
3383 Py_INCREF(Py_None);
3384 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003385 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003386
3387 result = PyType_GenericNew(keyword_type, NULL, NULL);
3388 if (!result) return NULL;
3389 value = ast2obj_identifier(o->arg);
3390 if (!value) goto failed;
3391 if (PyObject_SetAttrString(result, "arg", value) == -1)
3392 goto failed;
3393 Py_DECREF(value);
3394 value = ast2obj_expr(o->value);
3395 if (!value) goto failed;
3396 if (PyObject_SetAttrString(result, "value", value) == -1)
3397 goto failed;
3398 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003399 return result;
3400failed:
3401 Py_XDECREF(value);
3402 Py_XDECREF(result);
3403 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404}
3405
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003406PyObject*
3407ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003409 alias_ty o = (alias_ty)_o;
3410 PyObject *result = NULL, *value = NULL;
3411 if (!o) {
3412 Py_INCREF(Py_None);
3413 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003415
3416 result = PyType_GenericNew(alias_type, NULL, NULL);
3417 if (!result) return NULL;
3418 value = ast2obj_identifier(o->name);
3419 if (!value) goto failed;
3420 if (PyObject_SetAttrString(result, "name", value) == -1)
3421 goto failed;
3422 Py_DECREF(value);
3423 value = ast2obj_identifier(o->asname);
3424 if (!value) goto failed;
3425 if (PyObject_SetAttrString(result, "asname", value) == -1)
3426 goto failed;
3427 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003428 return result;
3429failed:
3430 Py_XDECREF(value);
3431 Py_XDECREF(result);
3432 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003433}
3434
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003435PyObject*
3436ast2obj_withitem(void* _o)
3437{
3438 withitem_ty o = (withitem_ty)_o;
3439 PyObject *result = NULL, *value = NULL;
3440 if (!o) {
3441 Py_INCREF(Py_None);
3442 return Py_None;
3443 }
3444
3445 result = PyType_GenericNew(withitem_type, NULL, NULL);
3446 if (!result) return NULL;
3447 value = ast2obj_expr(o->context_expr);
3448 if (!value) goto failed;
3449 if (PyObject_SetAttrString(result, "context_expr", value) == -1)
3450 goto failed;
3451 Py_DECREF(value);
3452 value = ast2obj_expr(o->optional_vars);
3453 if (!value) goto failed;
3454 if (PyObject_SetAttrString(result, "optional_vars", value) == -1)
3455 goto failed;
3456 Py_DECREF(value);
3457 return result;
3458failed:
3459 Py_XDECREF(value);
3460 Py_XDECREF(result);
3461 return NULL;
3462}
3463
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003464
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003465int
3466obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3467{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003468 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003469
Benjamin Petersond8f65972010-11-20 04:31:07 +00003470 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003471
3472 if (obj == Py_None) {
3473 *out = NULL;
3474 return 0;
3475 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003476 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3477 if (isinstance == -1) {
3478 return 1;
3479 }
3480 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003481 asdl_seq* body;
3482
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003483 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003484 int res;
3485 Py_ssize_t len;
3486 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003487 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003488 if (tmp == NULL) goto failed;
3489 if (!PyList_Check(tmp)) {
3490 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3491 goto failed;
3492 }
3493 len = PyList_GET_SIZE(tmp);
3494 body = asdl_seq_new(len, arena);
3495 if (body == NULL) goto failed;
3496 for (i = 0; i < len; i++) {
3497 stmt_ty value;
3498 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3499 if (res != 0) goto failed;
3500 asdl_seq_SET(body, i, value);
3501 }
3502 Py_XDECREF(tmp);
3503 tmp = NULL;
3504 } else {
3505 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
3506 return 1;
3507 }
3508 *out = Module(body, arena);
3509 if (*out == NULL) goto failed;
3510 return 0;
3511 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003512 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
3513 if (isinstance == -1) {
3514 return 1;
3515 }
3516 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003517 asdl_seq* body;
3518
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003519 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003520 int res;
3521 Py_ssize_t len;
3522 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003523 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003524 if (tmp == NULL) goto failed;
3525 if (!PyList_Check(tmp)) {
3526 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3527 goto failed;
3528 }
3529 len = PyList_GET_SIZE(tmp);
3530 body = asdl_seq_new(len, arena);
3531 if (body == NULL) goto failed;
3532 for (i = 0; i < len; i++) {
3533 stmt_ty value;
3534 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3535 if (res != 0) goto failed;
3536 asdl_seq_SET(body, i, value);
3537 }
3538 Py_XDECREF(tmp);
3539 tmp = NULL;
3540 } else {
3541 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
3542 return 1;
3543 }
3544 *out = Interactive(body, arena);
3545 if (*out == NULL) goto failed;
3546 return 0;
3547 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003548 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
3549 if (isinstance == -1) {
3550 return 1;
3551 }
3552 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003553 expr_ty body;
3554
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003555 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003556 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003557 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003558 if (tmp == NULL) goto failed;
3559 res = obj2ast_expr(tmp, &body, arena);
3560 if (res != 0) goto failed;
3561 Py_XDECREF(tmp);
3562 tmp = NULL;
3563 } else {
3564 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
3565 return 1;
3566 }
3567 *out = Expression(body, arena);
3568 if (*out == NULL) goto failed;
3569 return 0;
3570 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003571 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
3572 if (isinstance == -1) {
3573 return 1;
3574 }
3575 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003576 asdl_seq* body;
3577
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003578 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003579 int res;
3580 Py_ssize_t len;
3581 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003582 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003583 if (tmp == NULL) goto failed;
3584 if (!PyList_Check(tmp)) {
3585 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3586 goto failed;
3587 }
3588 len = PyList_GET_SIZE(tmp);
3589 body = asdl_seq_new(len, arena);
3590 if (body == NULL) goto failed;
3591 for (i = 0; i < len; i++) {
3592 stmt_ty value;
3593 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3594 if (res != 0) goto failed;
3595 asdl_seq_SET(body, i, value);
3596 }
3597 Py_XDECREF(tmp);
3598 tmp = NULL;
3599 } else {
3600 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
3601 return 1;
3602 }
3603 *out = Suite(body, arena);
3604 if (*out == NULL) goto failed;
3605 return 0;
3606 }
3607
Benjamin Peterson5b066812010-11-20 01:38:49 +00003608 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
3609 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00003610 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003611 return 1;
3612}
3613
3614int
3615obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
3616{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003617 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003618
Benjamin Petersond8f65972010-11-20 04:31:07 +00003619 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003620 int lineno;
3621 int col_offset;
3622
3623 if (obj == Py_None) {
3624 *out = NULL;
3625 return 0;
3626 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003627 if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003628 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003629 tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003630 if (tmp == NULL) goto failed;
3631 res = obj2ast_int(tmp, &lineno, arena);
3632 if (res != 0) goto failed;
3633 Py_XDECREF(tmp);
3634 tmp = NULL;
3635 } else {
3636 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
3637 return 1;
3638 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003639 if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003640 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003641 tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003642 if (tmp == NULL) goto failed;
3643 res = obj2ast_int(tmp, &col_offset, arena);
3644 if (res != 0) goto failed;
3645 Py_XDECREF(tmp);
3646 tmp = NULL;
3647 } else {
3648 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
3649 return 1;
3650 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003651 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
3652 if (isinstance == -1) {
3653 return 1;
3654 }
3655 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003656 identifier name;
3657 arguments_ty args;
3658 asdl_seq* body;
3659 asdl_seq* decorator_list;
3660 expr_ty returns;
3661
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003662 if (_PyObject_HasAttrId(obj, &PyId_name)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003663 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003664 tmp = _PyObject_GetAttrId(obj, &PyId_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003665 if (tmp == NULL) goto failed;
3666 res = obj2ast_identifier(tmp, &name, arena);
3667 if (res != 0) goto failed;
3668 Py_XDECREF(tmp);
3669 tmp = NULL;
3670 } else {
3671 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
3672 return 1;
3673 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003674 if (_PyObject_HasAttrId(obj, &PyId_args)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003675 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003676 tmp = _PyObject_GetAttrId(obj, &PyId_args);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003677 if (tmp == NULL) goto failed;
3678 res = obj2ast_arguments(tmp, &args, arena);
3679 if (res != 0) goto failed;
3680 Py_XDECREF(tmp);
3681 tmp = NULL;
3682 } else {
3683 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
3684 return 1;
3685 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003686 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003687 int res;
3688 Py_ssize_t len;
3689 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003690 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003691 if (tmp == NULL) goto failed;
3692 if (!PyList_Check(tmp)) {
3693 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3694 goto failed;
3695 }
3696 len = PyList_GET_SIZE(tmp);
3697 body = asdl_seq_new(len, arena);
3698 if (body == NULL) goto failed;
3699 for (i = 0; i < len; i++) {
3700 stmt_ty value;
3701 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3702 if (res != 0) goto failed;
3703 asdl_seq_SET(body, i, value);
3704 }
3705 Py_XDECREF(tmp);
3706 tmp = NULL;
3707 } else {
3708 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
3709 return 1;
3710 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003711 if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003712 int res;
3713 Py_ssize_t len;
3714 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003715 tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003716 if (tmp == NULL) goto failed;
3717 if (!PyList_Check(tmp)) {
3718 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3719 goto failed;
3720 }
3721 len = PyList_GET_SIZE(tmp);
3722 decorator_list = asdl_seq_new(len, arena);
3723 if (decorator_list == NULL) goto failed;
3724 for (i = 0; i < len; i++) {
3725 expr_ty value;
3726 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3727 if (res != 0) goto failed;
3728 asdl_seq_SET(decorator_list, i, value);
3729 }
3730 Py_XDECREF(tmp);
3731 tmp = NULL;
3732 } else {
3733 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
3734 return 1;
3735 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003736 if (_PyObject_HasAttrId(obj, &PyId_returns)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003737 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003738 tmp = _PyObject_GetAttrId(obj, &PyId_returns);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003739 if (tmp == NULL) goto failed;
3740 res = obj2ast_expr(tmp, &returns, arena);
3741 if (res != 0) goto failed;
3742 Py_XDECREF(tmp);
3743 tmp = NULL;
3744 } else {
3745 returns = NULL;
3746 }
3747 *out = FunctionDef(name, args, body, decorator_list, returns,
3748 lineno, col_offset, arena);
3749 if (*out == NULL) goto failed;
3750 return 0;
3751 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003752 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
3753 if (isinstance == -1) {
3754 return 1;
3755 }
3756 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003757 identifier name;
3758 asdl_seq* bases;
3759 asdl_seq* keywords;
3760 expr_ty starargs;
3761 expr_ty kwargs;
3762 asdl_seq* body;
3763 asdl_seq* decorator_list;
3764
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003765 if (_PyObject_HasAttrId(obj, &PyId_name)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003766 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003767 tmp = _PyObject_GetAttrId(obj, &PyId_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003768 if (tmp == NULL) goto failed;
3769 res = obj2ast_identifier(tmp, &name, arena);
3770 if (res != 0) goto failed;
3771 Py_XDECREF(tmp);
3772 tmp = NULL;
3773 } else {
3774 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
3775 return 1;
3776 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003777 if (_PyObject_HasAttrId(obj, &PyId_bases)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003778 int res;
3779 Py_ssize_t len;
3780 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003781 tmp = _PyObject_GetAttrId(obj, &PyId_bases);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003782 if (tmp == NULL) goto failed;
3783 if (!PyList_Check(tmp)) {
3784 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3785 goto failed;
3786 }
3787 len = PyList_GET_SIZE(tmp);
3788 bases = asdl_seq_new(len, arena);
3789 if (bases == NULL) goto failed;
3790 for (i = 0; i < len; i++) {
3791 expr_ty value;
3792 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3793 if (res != 0) goto failed;
3794 asdl_seq_SET(bases, i, value);
3795 }
3796 Py_XDECREF(tmp);
3797 tmp = NULL;
3798 } else {
3799 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
3800 return 1;
3801 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003802 if (_PyObject_HasAttrId(obj, &PyId_keywords)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003803 int res;
3804 Py_ssize_t len;
3805 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003806 tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003807 if (tmp == NULL) goto failed;
3808 if (!PyList_Check(tmp)) {
3809 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3810 goto failed;
3811 }
3812 len = PyList_GET_SIZE(tmp);
3813 keywords = asdl_seq_new(len, arena);
3814 if (keywords == NULL) goto failed;
3815 for (i = 0; i < len; i++) {
3816 keyword_ty value;
3817 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &value, arena);
3818 if (res != 0) goto failed;
3819 asdl_seq_SET(keywords, i, value);
3820 }
3821 Py_XDECREF(tmp);
3822 tmp = NULL;
3823 } else {
3824 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
3825 return 1;
3826 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003827 if (_PyObject_HasAttrId(obj, &PyId_starargs)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003828 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003829 tmp = _PyObject_GetAttrId(obj, &PyId_starargs);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003830 if (tmp == NULL) goto failed;
3831 res = obj2ast_expr(tmp, &starargs, arena);
3832 if (res != 0) goto failed;
3833 Py_XDECREF(tmp);
3834 tmp = NULL;
3835 } else {
3836 starargs = NULL;
3837 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003838 if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003839 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003840 tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003841 if (tmp == NULL) goto failed;
3842 res = obj2ast_expr(tmp, &kwargs, arena);
3843 if (res != 0) goto failed;
3844 Py_XDECREF(tmp);
3845 tmp = NULL;
3846 } else {
3847 kwargs = NULL;
3848 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003849 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003850 int res;
3851 Py_ssize_t len;
3852 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003853 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003854 if (tmp == NULL) goto failed;
3855 if (!PyList_Check(tmp)) {
3856 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3857 goto failed;
3858 }
3859 len = PyList_GET_SIZE(tmp);
3860 body = asdl_seq_new(len, arena);
3861 if (body == NULL) goto failed;
3862 for (i = 0; i < len; i++) {
3863 stmt_ty value;
3864 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3865 if (res != 0) goto failed;
3866 asdl_seq_SET(body, i, value);
3867 }
3868 Py_XDECREF(tmp);
3869 tmp = NULL;
3870 } else {
3871 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
3872 return 1;
3873 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003874 if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003875 int res;
3876 Py_ssize_t len;
3877 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003878 tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003879 if (tmp == NULL) goto failed;
3880 if (!PyList_Check(tmp)) {
3881 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3882 goto failed;
3883 }
3884 len = PyList_GET_SIZE(tmp);
3885 decorator_list = asdl_seq_new(len, arena);
3886 if (decorator_list == NULL) goto failed;
3887 for (i = 0; i < len; i++) {
3888 expr_ty value;
3889 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3890 if (res != 0) goto failed;
3891 asdl_seq_SET(decorator_list, i, value);
3892 }
3893 Py_XDECREF(tmp);
3894 tmp = NULL;
3895 } else {
3896 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
3897 return 1;
3898 }
3899 *out = ClassDef(name, bases, keywords, starargs, kwargs, body,
3900 decorator_list, lineno, col_offset, arena);
3901 if (*out == NULL) goto failed;
3902 return 0;
3903 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003904 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
3905 if (isinstance == -1) {
3906 return 1;
3907 }
3908 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003909 expr_ty value;
3910
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003911 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003912 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003913 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003914 if (tmp == NULL) goto failed;
3915 res = obj2ast_expr(tmp, &value, arena);
3916 if (res != 0) goto failed;
3917 Py_XDECREF(tmp);
3918 tmp = NULL;
3919 } else {
3920 value = NULL;
3921 }
3922 *out = Return(value, lineno, col_offset, arena);
3923 if (*out == NULL) goto failed;
3924 return 0;
3925 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003926 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
3927 if (isinstance == -1) {
3928 return 1;
3929 }
3930 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003931 asdl_seq* targets;
3932
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003933 if (_PyObject_HasAttrId(obj, &PyId_targets)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003934 int res;
3935 Py_ssize_t len;
3936 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003937 tmp = _PyObject_GetAttrId(obj, &PyId_targets);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003938 if (tmp == NULL) goto failed;
3939 if (!PyList_Check(tmp)) {
3940 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3941 goto failed;
3942 }
3943 len = PyList_GET_SIZE(tmp);
3944 targets = asdl_seq_new(len, arena);
3945 if (targets == NULL) goto failed;
3946 for (i = 0; i < len; i++) {
3947 expr_ty value;
3948 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3949 if (res != 0) goto failed;
3950 asdl_seq_SET(targets, i, value);
3951 }
3952 Py_XDECREF(tmp);
3953 tmp = NULL;
3954 } else {
3955 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
3956 return 1;
3957 }
3958 *out = Delete(targets, lineno, col_offset, arena);
3959 if (*out == NULL) goto failed;
3960 return 0;
3961 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003962 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
3963 if (isinstance == -1) {
3964 return 1;
3965 }
3966 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003967 asdl_seq* targets;
3968 expr_ty value;
3969
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003970 if (_PyObject_HasAttrId(obj, &PyId_targets)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003971 int res;
3972 Py_ssize_t len;
3973 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003974 tmp = _PyObject_GetAttrId(obj, &PyId_targets);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003975 if (tmp == NULL) goto failed;
3976 if (!PyList_Check(tmp)) {
3977 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3978 goto failed;
3979 }
3980 len = PyList_GET_SIZE(tmp);
3981 targets = asdl_seq_new(len, arena);
3982 if (targets == NULL) goto failed;
3983 for (i = 0; i < len; i++) {
3984 expr_ty value;
3985 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3986 if (res != 0) goto failed;
3987 asdl_seq_SET(targets, i, value);
3988 }
3989 Py_XDECREF(tmp);
3990 tmp = NULL;
3991 } else {
3992 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
3993 return 1;
3994 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003995 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003996 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02003997 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003998 if (tmp == NULL) goto failed;
3999 res = obj2ast_expr(tmp, &value, arena);
4000 if (res != 0) goto failed;
4001 Py_XDECREF(tmp);
4002 tmp = NULL;
4003 } else {
4004 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
4005 return 1;
4006 }
4007 *out = Assign(targets, value, lineno, col_offset, arena);
4008 if (*out == NULL) goto failed;
4009 return 0;
4010 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004011 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
4012 if (isinstance == -1) {
4013 return 1;
4014 }
4015 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004016 expr_ty target;
4017 operator_ty op;
4018 expr_ty value;
4019
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004020 if (_PyObject_HasAttrId(obj, &PyId_target)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004021 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004022 tmp = _PyObject_GetAttrId(obj, &PyId_target);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004023 if (tmp == NULL) goto failed;
4024 res = obj2ast_expr(tmp, &target, arena);
4025 if (res != 0) goto failed;
4026 Py_XDECREF(tmp);
4027 tmp = NULL;
4028 } else {
4029 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
4030 return 1;
4031 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004032 if (_PyObject_HasAttrId(obj, &PyId_op)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004033 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004034 tmp = _PyObject_GetAttrId(obj, &PyId_op);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004035 if (tmp == NULL) goto failed;
4036 res = obj2ast_operator(tmp, &op, arena);
4037 if (res != 0) goto failed;
4038 Py_XDECREF(tmp);
4039 tmp = NULL;
4040 } else {
4041 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
4042 return 1;
4043 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004044 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004045 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004046 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004047 if (tmp == NULL) goto failed;
4048 res = obj2ast_expr(tmp, &value, arena);
4049 if (res != 0) goto failed;
4050 Py_XDECREF(tmp);
4051 tmp = NULL;
4052 } else {
4053 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
4054 return 1;
4055 }
4056 *out = AugAssign(target, op, value, lineno, col_offset, arena);
4057 if (*out == NULL) goto failed;
4058 return 0;
4059 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004060 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
4061 if (isinstance == -1) {
4062 return 1;
4063 }
4064 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004065 expr_ty target;
4066 expr_ty iter;
4067 asdl_seq* body;
4068 asdl_seq* orelse;
4069
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004070 if (_PyObject_HasAttrId(obj, &PyId_target)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004071 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004072 tmp = _PyObject_GetAttrId(obj, &PyId_target);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004073 if (tmp == NULL) goto failed;
4074 res = obj2ast_expr(tmp, &target, arena);
4075 if (res != 0) goto failed;
4076 Py_XDECREF(tmp);
4077 tmp = NULL;
4078 } else {
4079 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4080 return 1;
4081 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004082 if (_PyObject_HasAttrId(obj, &PyId_iter)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004083 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004084 tmp = _PyObject_GetAttrId(obj, &PyId_iter);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004085 if (tmp == NULL) goto failed;
4086 res = obj2ast_expr(tmp, &iter, arena);
4087 if (res != 0) goto failed;
4088 Py_XDECREF(tmp);
4089 tmp = NULL;
4090 } else {
4091 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4092 return 1;
4093 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004094 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004095 int res;
4096 Py_ssize_t len;
4097 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004098 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004099 if (tmp == NULL) goto failed;
4100 if (!PyList_Check(tmp)) {
4101 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4102 goto failed;
4103 }
4104 len = PyList_GET_SIZE(tmp);
4105 body = asdl_seq_new(len, arena);
4106 if (body == NULL) goto failed;
4107 for (i = 0; i < len; i++) {
4108 stmt_ty value;
4109 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4110 if (res != 0) goto failed;
4111 asdl_seq_SET(body, i, value);
4112 }
4113 Py_XDECREF(tmp);
4114 tmp = NULL;
4115 } else {
4116 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4117 return 1;
4118 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004119 if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004120 int res;
4121 Py_ssize_t len;
4122 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004123 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004124 if (tmp == NULL) goto failed;
4125 if (!PyList_Check(tmp)) {
4126 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4127 goto failed;
4128 }
4129 len = PyList_GET_SIZE(tmp);
4130 orelse = asdl_seq_new(len, arena);
4131 if (orelse == NULL) goto failed;
4132 for (i = 0; i < len; i++) {
4133 stmt_ty value;
4134 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4135 if (res != 0) goto failed;
4136 asdl_seq_SET(orelse, i, value);
4137 }
4138 Py_XDECREF(tmp);
4139 tmp = NULL;
4140 } else {
4141 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4142 return 1;
4143 }
4144 *out = For(target, iter, body, orelse, lineno, col_offset,
4145 arena);
4146 if (*out == NULL) goto failed;
4147 return 0;
4148 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004149 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
4150 if (isinstance == -1) {
4151 return 1;
4152 }
4153 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004154 expr_ty test;
4155 asdl_seq* body;
4156 asdl_seq* orelse;
4157
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004158 if (_PyObject_HasAttrId(obj, &PyId_test)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004159 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004160 tmp = _PyObject_GetAttrId(obj, &PyId_test);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004161 if (tmp == NULL) goto failed;
4162 res = obj2ast_expr(tmp, &test, arena);
4163 if (res != 0) goto failed;
4164 Py_XDECREF(tmp);
4165 tmp = NULL;
4166 } else {
4167 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
4168 return 1;
4169 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004170 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004171 int res;
4172 Py_ssize_t len;
4173 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004174 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004175 if (tmp == NULL) goto failed;
4176 if (!PyList_Check(tmp)) {
4177 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4178 goto failed;
4179 }
4180 len = PyList_GET_SIZE(tmp);
4181 body = asdl_seq_new(len, arena);
4182 if (body == NULL) goto failed;
4183 for (i = 0; i < len; i++) {
4184 stmt_ty value;
4185 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4186 if (res != 0) goto failed;
4187 asdl_seq_SET(body, i, value);
4188 }
4189 Py_XDECREF(tmp);
4190 tmp = NULL;
4191 } else {
4192 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
4193 return 1;
4194 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004195 if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004196 int res;
4197 Py_ssize_t len;
4198 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004199 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004200 if (tmp == NULL) goto failed;
4201 if (!PyList_Check(tmp)) {
4202 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4203 goto failed;
4204 }
4205 len = PyList_GET_SIZE(tmp);
4206 orelse = asdl_seq_new(len, arena);
4207 if (orelse == NULL) goto failed;
4208 for (i = 0; i < len; i++) {
4209 stmt_ty value;
4210 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4211 if (res != 0) goto failed;
4212 asdl_seq_SET(orelse, i, value);
4213 }
4214 Py_XDECREF(tmp);
4215 tmp = NULL;
4216 } else {
4217 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
4218 return 1;
4219 }
4220 *out = While(test, body, orelse, lineno, col_offset, arena);
4221 if (*out == NULL) goto failed;
4222 return 0;
4223 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004224 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
4225 if (isinstance == -1) {
4226 return 1;
4227 }
4228 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004229 expr_ty test;
4230 asdl_seq* body;
4231 asdl_seq* orelse;
4232
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004233 if (_PyObject_HasAttrId(obj, &PyId_test)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004234 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004235 tmp = _PyObject_GetAttrId(obj, &PyId_test);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004236 if (tmp == NULL) goto failed;
4237 res = obj2ast_expr(tmp, &test, arena);
4238 if (res != 0) goto failed;
4239 Py_XDECREF(tmp);
4240 tmp = NULL;
4241 } else {
4242 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
4243 return 1;
4244 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004245 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004246 int res;
4247 Py_ssize_t len;
4248 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004249 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004250 if (tmp == NULL) goto failed;
4251 if (!PyList_Check(tmp)) {
4252 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4253 goto failed;
4254 }
4255 len = PyList_GET_SIZE(tmp);
4256 body = asdl_seq_new(len, arena);
4257 if (body == NULL) goto failed;
4258 for (i = 0; i < len; i++) {
4259 stmt_ty value;
4260 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4261 if (res != 0) goto failed;
4262 asdl_seq_SET(body, i, value);
4263 }
4264 Py_XDECREF(tmp);
4265 tmp = NULL;
4266 } else {
4267 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
4268 return 1;
4269 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004270 if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004271 int res;
4272 Py_ssize_t len;
4273 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004274 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004275 if (tmp == NULL) goto failed;
4276 if (!PyList_Check(tmp)) {
4277 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4278 goto failed;
4279 }
4280 len = PyList_GET_SIZE(tmp);
4281 orelse = asdl_seq_new(len, arena);
4282 if (orelse == NULL) goto failed;
4283 for (i = 0; i < len; i++) {
4284 stmt_ty value;
4285 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4286 if (res != 0) goto failed;
4287 asdl_seq_SET(orelse, i, value);
4288 }
4289 Py_XDECREF(tmp);
4290 tmp = NULL;
4291 } else {
4292 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
4293 return 1;
4294 }
4295 *out = If(test, body, orelse, lineno, col_offset, arena);
4296 if (*out == NULL) goto failed;
4297 return 0;
4298 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004299 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
4300 if (isinstance == -1) {
4301 return 1;
4302 }
4303 if (isinstance) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004304 asdl_seq* items;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004305 asdl_seq* body;
4306
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004307 if (_PyObject_HasAttrId(obj, &PyId_items)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004308 int res;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004309 Py_ssize_t len;
4310 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004311 tmp = _PyObject_GetAttrId(obj, &PyId_items);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004312 if (tmp == NULL) goto failed;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004313 if (!PyList_Check(tmp)) {
4314 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4315 goto failed;
4316 }
4317 len = PyList_GET_SIZE(tmp);
4318 items = asdl_seq_new(len, arena);
4319 if (items == NULL) goto failed;
4320 for (i = 0; i < len; i++) {
4321 withitem_ty value;
4322 res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &value, arena);
4323 if (res != 0) goto failed;
4324 asdl_seq_SET(items, i, value);
4325 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004326 Py_XDECREF(tmp);
4327 tmp = NULL;
4328 } else {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004329 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004330 return 1;
4331 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004332 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004333 int res;
4334 Py_ssize_t len;
4335 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004336 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004337 if (tmp == NULL) goto failed;
4338 if (!PyList_Check(tmp)) {
4339 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4340 goto failed;
4341 }
4342 len = PyList_GET_SIZE(tmp);
4343 body = asdl_seq_new(len, arena);
4344 if (body == NULL) goto failed;
4345 for (i = 0; i < len; i++) {
4346 stmt_ty value;
4347 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4348 if (res != 0) goto failed;
4349 asdl_seq_SET(body, i, value);
4350 }
4351 Py_XDECREF(tmp);
4352 tmp = NULL;
4353 } else {
4354 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
4355 return 1;
4356 }
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004357 *out = With(items, body, lineno, col_offset, arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004358 if (*out == NULL) goto failed;
4359 return 0;
4360 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004361 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
4362 if (isinstance == -1) {
4363 return 1;
4364 }
4365 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004366 expr_ty exc;
4367 expr_ty cause;
4368
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004369 if (_PyObject_HasAttrId(obj, &PyId_exc)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004370 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004371 tmp = _PyObject_GetAttrId(obj, &PyId_exc);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004372 if (tmp == NULL) goto failed;
4373 res = obj2ast_expr(tmp, &exc, arena);
4374 if (res != 0) goto failed;
4375 Py_XDECREF(tmp);
4376 tmp = NULL;
4377 } else {
4378 exc = NULL;
4379 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004380 if (_PyObject_HasAttrId(obj, &PyId_cause)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004381 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004382 tmp = _PyObject_GetAttrId(obj, &PyId_cause);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004383 if (tmp == NULL) goto failed;
4384 res = obj2ast_expr(tmp, &cause, arena);
4385 if (res != 0) goto failed;
4386 Py_XDECREF(tmp);
4387 tmp = NULL;
4388 } else {
4389 cause = NULL;
4390 }
4391 *out = Raise(exc, cause, lineno, col_offset, arena);
4392 if (*out == NULL) goto failed;
4393 return 0;
4394 }
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004395 isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004396 if (isinstance == -1) {
4397 return 1;
4398 }
4399 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004400 asdl_seq* body;
4401 asdl_seq* handlers;
4402 asdl_seq* orelse;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004403 asdl_seq* finalbody;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004404
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004405 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004406 int res;
4407 Py_ssize_t len;
4408 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004409 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004410 if (tmp == NULL) goto failed;
4411 if (!PyList_Check(tmp)) {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004412 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004413 goto failed;
4414 }
4415 len = PyList_GET_SIZE(tmp);
4416 body = asdl_seq_new(len, arena);
4417 if (body == NULL) goto failed;
4418 for (i = 0; i < len; i++) {
4419 stmt_ty value;
4420 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4421 if (res != 0) goto failed;
4422 asdl_seq_SET(body, i, value);
4423 }
4424 Py_XDECREF(tmp);
4425 tmp = NULL;
4426 } else {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004427 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004428 return 1;
4429 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004430 if (_PyObject_HasAttrId(obj, &PyId_handlers)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004431 int res;
4432 Py_ssize_t len;
4433 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004434 tmp = _PyObject_GetAttrId(obj, &PyId_handlers);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004435 if (tmp == NULL) goto failed;
4436 if (!PyList_Check(tmp)) {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004437 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004438 goto failed;
4439 }
4440 len = PyList_GET_SIZE(tmp);
4441 handlers = asdl_seq_new(len, arena);
4442 if (handlers == NULL) goto failed;
4443 for (i = 0; i < len; i++) {
4444 excepthandler_ty value;
4445 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &value, arena);
4446 if (res != 0) goto failed;
4447 asdl_seq_SET(handlers, i, value);
4448 }
4449 Py_XDECREF(tmp);
4450 tmp = NULL;
4451 } else {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004452 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004453 return 1;
4454 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004455 if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004456 int res;
4457 Py_ssize_t len;
4458 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004459 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004460 if (tmp == NULL) goto failed;
4461 if (!PyList_Check(tmp)) {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004462 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004463 goto failed;
4464 }
4465 len = PyList_GET_SIZE(tmp);
4466 orelse = asdl_seq_new(len, arena);
4467 if (orelse == NULL) goto failed;
4468 for (i = 0; i < len; i++) {
4469 stmt_ty value;
4470 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4471 if (res != 0) goto failed;
4472 asdl_seq_SET(orelse, i, value);
4473 }
4474 Py_XDECREF(tmp);
4475 tmp = NULL;
4476 } else {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004477 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004478 return 1;
4479 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004480 if (_PyObject_HasAttrId(obj, &PyId_finalbody)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004481 int res;
4482 Py_ssize_t len;
4483 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004484 tmp = _PyObject_GetAttrId(obj, &PyId_finalbody);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004485 if (tmp == NULL) goto failed;
4486 if (!PyList_Check(tmp)) {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004487 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004488 goto failed;
4489 }
4490 len = PyList_GET_SIZE(tmp);
4491 finalbody = asdl_seq_new(len, arena);
4492 if (finalbody == NULL) goto failed;
4493 for (i = 0; i < len; i++) {
4494 stmt_ty value;
4495 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4496 if (res != 0) goto failed;
4497 asdl_seq_SET(finalbody, i, value);
4498 }
4499 Py_XDECREF(tmp);
4500 tmp = NULL;
4501 } else {
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004502 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004503 return 1;
4504 }
Benjamin Peterson43af12b2011-05-29 11:43:10 -05004505 *out = Try(body, handlers, orelse, finalbody, lineno,
4506 col_offset, arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004507 if (*out == NULL) goto failed;
4508 return 0;
4509 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004510 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
4511 if (isinstance == -1) {
4512 return 1;
4513 }
4514 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004515 expr_ty test;
4516 expr_ty msg;
4517
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004518 if (_PyObject_HasAttrId(obj, &PyId_test)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004519 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004520 tmp = _PyObject_GetAttrId(obj, &PyId_test);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004521 if (tmp == NULL) goto failed;
4522 res = obj2ast_expr(tmp, &test, arena);
4523 if (res != 0) goto failed;
4524 Py_XDECREF(tmp);
4525 tmp = NULL;
4526 } else {
4527 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
4528 return 1;
4529 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004530 if (_PyObject_HasAttrId(obj, &PyId_msg)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004531 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004532 tmp = _PyObject_GetAttrId(obj, &PyId_msg);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004533 if (tmp == NULL) goto failed;
4534 res = obj2ast_expr(tmp, &msg, arena);
4535 if (res != 0) goto failed;
4536 Py_XDECREF(tmp);
4537 tmp = NULL;
4538 } else {
4539 msg = NULL;
4540 }
4541 *out = Assert(test, msg, lineno, col_offset, arena);
4542 if (*out == NULL) goto failed;
4543 return 0;
4544 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004545 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
4546 if (isinstance == -1) {
4547 return 1;
4548 }
4549 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004550 asdl_seq* names;
4551
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004552 if (_PyObject_HasAttrId(obj, &PyId_names)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004553 int res;
4554 Py_ssize_t len;
4555 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004556 tmp = _PyObject_GetAttrId(obj, &PyId_names);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004557 if (tmp == NULL) goto failed;
4558 if (!PyList_Check(tmp)) {
4559 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4560 goto failed;
4561 }
4562 len = PyList_GET_SIZE(tmp);
4563 names = asdl_seq_new(len, arena);
4564 if (names == NULL) goto failed;
4565 for (i = 0; i < len; i++) {
4566 alias_ty value;
4567 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
4568 if (res != 0) goto failed;
4569 asdl_seq_SET(names, i, value);
4570 }
4571 Py_XDECREF(tmp);
4572 tmp = NULL;
4573 } else {
4574 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
4575 return 1;
4576 }
4577 *out = Import(names, lineno, col_offset, arena);
4578 if (*out == NULL) goto failed;
4579 return 0;
4580 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004581 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
4582 if (isinstance == -1) {
4583 return 1;
4584 }
4585 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004586 identifier module;
4587 asdl_seq* names;
4588 int level;
4589
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004590 if (_PyObject_HasAttrId(obj, &PyId_module)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004591 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004592 tmp = _PyObject_GetAttrId(obj, &PyId_module);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004593 if (tmp == NULL) goto failed;
4594 res = obj2ast_identifier(tmp, &module, arena);
4595 if (res != 0) goto failed;
4596 Py_XDECREF(tmp);
4597 tmp = NULL;
4598 } else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00004599 module = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004600 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004601 if (_PyObject_HasAttrId(obj, &PyId_names)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004602 int res;
4603 Py_ssize_t len;
4604 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004605 tmp = _PyObject_GetAttrId(obj, &PyId_names);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004606 if (tmp == NULL) goto failed;
4607 if (!PyList_Check(tmp)) {
4608 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4609 goto failed;
4610 }
4611 len = PyList_GET_SIZE(tmp);
4612 names = asdl_seq_new(len, arena);
4613 if (names == NULL) goto failed;
4614 for (i = 0; i < len; i++) {
4615 alias_ty value;
4616 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
4617 if (res != 0) goto failed;
4618 asdl_seq_SET(names, i, value);
4619 }
4620 Py_XDECREF(tmp);
4621 tmp = NULL;
4622 } else {
4623 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
4624 return 1;
4625 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004626 if (_PyObject_HasAttrId(obj, &PyId_level)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004627 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004628 tmp = _PyObject_GetAttrId(obj, &PyId_level);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004629 if (tmp == NULL) goto failed;
4630 res = obj2ast_int(tmp, &level, arena);
4631 if (res != 0) goto failed;
4632 Py_XDECREF(tmp);
4633 tmp = NULL;
4634 } else {
4635 level = 0;
4636 }
4637 *out = ImportFrom(module, names, level, lineno, col_offset,
4638 arena);
4639 if (*out == NULL) goto failed;
4640 return 0;
4641 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004642 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
4643 if (isinstance == -1) {
4644 return 1;
4645 }
4646 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004647 asdl_seq* names;
4648
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004649 if (_PyObject_HasAttrId(obj, &PyId_names)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004650 int res;
4651 Py_ssize_t len;
4652 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004653 tmp = _PyObject_GetAttrId(obj, &PyId_names);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004654 if (tmp == NULL) goto failed;
4655 if (!PyList_Check(tmp)) {
4656 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4657 goto failed;
4658 }
4659 len = PyList_GET_SIZE(tmp);
4660 names = asdl_seq_new(len, arena);
4661 if (names == NULL) goto failed;
4662 for (i = 0; i < len; i++) {
4663 identifier value;
4664 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &value, arena);
4665 if (res != 0) goto failed;
4666 asdl_seq_SET(names, i, value);
4667 }
4668 Py_XDECREF(tmp);
4669 tmp = NULL;
4670 } else {
4671 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
4672 return 1;
4673 }
4674 *out = Global(names, lineno, col_offset, arena);
4675 if (*out == NULL) goto failed;
4676 return 0;
4677 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004678 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
4679 if (isinstance == -1) {
4680 return 1;
4681 }
4682 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004683 asdl_seq* names;
4684
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004685 if (_PyObject_HasAttrId(obj, &PyId_names)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004686 int res;
4687 Py_ssize_t len;
4688 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004689 tmp = _PyObject_GetAttrId(obj, &PyId_names);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004690 if (tmp == NULL) goto failed;
4691 if (!PyList_Check(tmp)) {
4692 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4693 goto failed;
4694 }
4695 len = PyList_GET_SIZE(tmp);
4696 names = asdl_seq_new(len, arena);
4697 if (names == NULL) goto failed;
4698 for (i = 0; i < len; i++) {
4699 identifier value;
4700 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &value, arena);
4701 if (res != 0) goto failed;
4702 asdl_seq_SET(names, i, value);
4703 }
4704 Py_XDECREF(tmp);
4705 tmp = NULL;
4706 } else {
4707 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
4708 return 1;
4709 }
4710 *out = Nonlocal(names, lineno, col_offset, arena);
4711 if (*out == NULL) goto failed;
4712 return 0;
4713 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004714 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
4715 if (isinstance == -1) {
4716 return 1;
4717 }
4718 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004719 expr_ty value;
4720
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004721 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004722 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004723 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004724 if (tmp == NULL) goto failed;
4725 res = obj2ast_expr(tmp, &value, arena);
4726 if (res != 0) goto failed;
4727 Py_XDECREF(tmp);
4728 tmp = NULL;
4729 } else {
4730 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
4731 return 1;
4732 }
4733 *out = Expr(value, lineno, col_offset, arena);
4734 if (*out == NULL) goto failed;
4735 return 0;
4736 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004737 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
4738 if (isinstance == -1) {
4739 return 1;
4740 }
4741 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004742
4743 *out = Pass(lineno, col_offset, arena);
4744 if (*out == NULL) goto failed;
4745 return 0;
4746 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004747 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
4748 if (isinstance == -1) {
4749 return 1;
4750 }
4751 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004752
4753 *out = Break(lineno, col_offset, arena);
4754 if (*out == NULL) goto failed;
4755 return 0;
4756 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004757 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
4758 if (isinstance == -1) {
4759 return 1;
4760 }
4761 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004762
4763 *out = Continue(lineno, col_offset, arena);
4764 if (*out == NULL) goto failed;
4765 return 0;
4766 }
4767
Benjamin Peterson5b066812010-11-20 01:38:49 +00004768 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
4769 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00004770 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004771 return 1;
4772}
4773
4774int
4775obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
4776{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004777 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004778
Benjamin Petersond8f65972010-11-20 04:31:07 +00004779 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004780 int lineno;
4781 int col_offset;
4782
4783 if (obj == Py_None) {
4784 *out = NULL;
4785 return 0;
4786 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004787 if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004788 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004789 tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004790 if (tmp == NULL) goto failed;
4791 res = obj2ast_int(tmp, &lineno, arena);
4792 if (res != 0) goto failed;
4793 Py_XDECREF(tmp);
4794 tmp = NULL;
4795 } else {
4796 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
4797 return 1;
4798 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004799 if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004800 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004801 tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004802 if (tmp == NULL) goto failed;
4803 res = obj2ast_int(tmp, &col_offset, arena);
4804 if (res != 0) goto failed;
4805 Py_XDECREF(tmp);
4806 tmp = NULL;
4807 } else {
4808 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
4809 return 1;
4810 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004811 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
4812 if (isinstance == -1) {
4813 return 1;
4814 }
4815 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004816 boolop_ty op;
4817 asdl_seq* values;
4818
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004819 if (_PyObject_HasAttrId(obj, &PyId_op)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004820 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004821 tmp = _PyObject_GetAttrId(obj, &PyId_op);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004822 if (tmp == NULL) goto failed;
4823 res = obj2ast_boolop(tmp, &op, arena);
4824 if (res != 0) goto failed;
4825 Py_XDECREF(tmp);
4826 tmp = NULL;
4827 } else {
4828 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
4829 return 1;
4830 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004831 if (_PyObject_HasAttrId(obj, &PyId_values)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004832 int res;
4833 Py_ssize_t len;
4834 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004835 tmp = _PyObject_GetAttrId(obj, &PyId_values);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004836 if (tmp == NULL) goto failed;
4837 if (!PyList_Check(tmp)) {
4838 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4839 goto failed;
4840 }
4841 len = PyList_GET_SIZE(tmp);
4842 values = asdl_seq_new(len, arena);
4843 if (values == NULL) goto failed;
4844 for (i = 0; i < len; i++) {
4845 expr_ty value;
4846 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
4847 if (res != 0) goto failed;
4848 asdl_seq_SET(values, i, value);
4849 }
4850 Py_XDECREF(tmp);
4851 tmp = NULL;
4852 } else {
4853 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
4854 return 1;
4855 }
4856 *out = BoolOp(op, values, lineno, col_offset, arena);
4857 if (*out == NULL) goto failed;
4858 return 0;
4859 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004860 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
4861 if (isinstance == -1) {
4862 return 1;
4863 }
4864 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004865 expr_ty left;
4866 operator_ty op;
4867 expr_ty right;
4868
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004869 if (_PyObject_HasAttrId(obj, &PyId_left)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004870 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004871 tmp = _PyObject_GetAttrId(obj, &PyId_left);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004872 if (tmp == NULL) goto failed;
4873 res = obj2ast_expr(tmp, &left, arena);
4874 if (res != 0) goto failed;
4875 Py_XDECREF(tmp);
4876 tmp = NULL;
4877 } else {
4878 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
4879 return 1;
4880 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004881 if (_PyObject_HasAttrId(obj, &PyId_op)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004882 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004883 tmp = _PyObject_GetAttrId(obj, &PyId_op);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004884 if (tmp == NULL) goto failed;
4885 res = obj2ast_operator(tmp, &op, arena);
4886 if (res != 0) goto failed;
4887 Py_XDECREF(tmp);
4888 tmp = NULL;
4889 } else {
4890 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
4891 return 1;
4892 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004893 if (_PyObject_HasAttrId(obj, &PyId_right)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004894 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004895 tmp = _PyObject_GetAttrId(obj, &PyId_right);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004896 if (tmp == NULL) goto failed;
4897 res = obj2ast_expr(tmp, &right, arena);
4898 if (res != 0) goto failed;
4899 Py_XDECREF(tmp);
4900 tmp = NULL;
4901 } else {
4902 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
4903 return 1;
4904 }
4905 *out = BinOp(left, op, right, lineno, col_offset, arena);
4906 if (*out == NULL) goto failed;
4907 return 0;
4908 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004909 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
4910 if (isinstance == -1) {
4911 return 1;
4912 }
4913 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004914 unaryop_ty op;
4915 expr_ty operand;
4916
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004917 if (_PyObject_HasAttrId(obj, &PyId_op)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004918 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004919 tmp = _PyObject_GetAttrId(obj, &PyId_op);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004920 if (tmp == NULL) goto failed;
4921 res = obj2ast_unaryop(tmp, &op, arena);
4922 if (res != 0) goto failed;
4923 Py_XDECREF(tmp);
4924 tmp = NULL;
4925 } else {
4926 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
4927 return 1;
4928 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004929 if (_PyObject_HasAttrId(obj, &PyId_operand)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004930 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004931 tmp = _PyObject_GetAttrId(obj, &PyId_operand);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004932 if (tmp == NULL) goto failed;
4933 res = obj2ast_expr(tmp, &operand, arena);
4934 if (res != 0) goto failed;
4935 Py_XDECREF(tmp);
4936 tmp = NULL;
4937 } else {
4938 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
4939 return 1;
4940 }
4941 *out = UnaryOp(op, operand, lineno, col_offset, arena);
4942 if (*out == NULL) goto failed;
4943 return 0;
4944 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004945 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
4946 if (isinstance == -1) {
4947 return 1;
4948 }
4949 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004950 arguments_ty args;
4951 expr_ty body;
4952
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004953 if (_PyObject_HasAttrId(obj, &PyId_args)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004954 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004955 tmp = _PyObject_GetAttrId(obj, &PyId_args);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004956 if (tmp == NULL) goto failed;
4957 res = obj2ast_arguments(tmp, &args, arena);
4958 if (res != 0) goto failed;
4959 Py_XDECREF(tmp);
4960 tmp = NULL;
4961 } else {
4962 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
4963 return 1;
4964 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004965 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004966 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004967 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004968 if (tmp == NULL) goto failed;
4969 res = obj2ast_expr(tmp, &body, arena);
4970 if (res != 0) goto failed;
4971 Py_XDECREF(tmp);
4972 tmp = NULL;
4973 } else {
4974 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
4975 return 1;
4976 }
4977 *out = Lambda(args, body, lineno, col_offset, arena);
4978 if (*out == NULL) goto failed;
4979 return 0;
4980 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004981 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
4982 if (isinstance == -1) {
4983 return 1;
4984 }
4985 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004986 expr_ty test;
4987 expr_ty body;
4988 expr_ty orelse;
4989
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004990 if (_PyObject_HasAttrId(obj, &PyId_test)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004991 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02004992 tmp = _PyObject_GetAttrId(obj, &PyId_test);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004993 if (tmp == NULL) goto failed;
4994 res = obj2ast_expr(tmp, &test, arena);
4995 if (res != 0) goto failed;
4996 Py_XDECREF(tmp);
4997 tmp = NULL;
4998 } else {
4999 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
5000 return 1;
5001 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005002 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005003 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005004 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005005 if (tmp == NULL) goto failed;
5006 res = obj2ast_expr(tmp, &body, arena);
5007 if (res != 0) goto failed;
5008 Py_XDECREF(tmp);
5009 tmp = NULL;
5010 } else {
5011 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
5012 return 1;
5013 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005014 if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005015 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005016 tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005017 if (tmp == NULL) goto failed;
5018 res = obj2ast_expr(tmp, &orelse, arena);
5019 if (res != 0) goto failed;
5020 Py_XDECREF(tmp);
5021 tmp = NULL;
5022 } else {
5023 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
5024 return 1;
5025 }
5026 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
5027 if (*out == NULL) goto failed;
5028 return 0;
5029 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005030 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
5031 if (isinstance == -1) {
5032 return 1;
5033 }
5034 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005035 asdl_seq* keys;
5036 asdl_seq* values;
5037
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005038 if (_PyObject_HasAttrId(obj, &PyId_keys)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005039 int res;
5040 Py_ssize_t len;
5041 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005042 tmp = _PyObject_GetAttrId(obj, &PyId_keys);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005043 if (tmp == NULL) goto failed;
5044 if (!PyList_Check(tmp)) {
5045 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5046 goto failed;
5047 }
5048 len = PyList_GET_SIZE(tmp);
5049 keys = asdl_seq_new(len, arena);
5050 if (keys == NULL) goto failed;
5051 for (i = 0; i < len; i++) {
5052 expr_ty value;
5053 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5054 if (res != 0) goto failed;
5055 asdl_seq_SET(keys, i, value);
5056 }
5057 Py_XDECREF(tmp);
5058 tmp = NULL;
5059 } else {
5060 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
5061 return 1;
5062 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005063 if (_PyObject_HasAttrId(obj, &PyId_values)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005064 int res;
5065 Py_ssize_t len;
5066 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005067 tmp = _PyObject_GetAttrId(obj, &PyId_values);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005068 if (tmp == NULL) goto failed;
5069 if (!PyList_Check(tmp)) {
5070 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5071 goto failed;
5072 }
5073 len = PyList_GET_SIZE(tmp);
5074 values = asdl_seq_new(len, arena);
5075 if (values == NULL) goto failed;
5076 for (i = 0; i < len; i++) {
5077 expr_ty value;
5078 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5079 if (res != 0) goto failed;
5080 asdl_seq_SET(values, i, value);
5081 }
5082 Py_XDECREF(tmp);
5083 tmp = NULL;
5084 } else {
5085 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
5086 return 1;
5087 }
5088 *out = Dict(keys, values, lineno, col_offset, arena);
5089 if (*out == NULL) goto failed;
5090 return 0;
5091 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005092 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
5093 if (isinstance == -1) {
5094 return 1;
5095 }
5096 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005097 asdl_seq* elts;
5098
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005099 if (_PyObject_HasAttrId(obj, &PyId_elts)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005100 int res;
5101 Py_ssize_t len;
5102 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005103 tmp = _PyObject_GetAttrId(obj, &PyId_elts);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005104 if (tmp == NULL) goto failed;
5105 if (!PyList_Check(tmp)) {
5106 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5107 goto failed;
5108 }
5109 len = PyList_GET_SIZE(tmp);
5110 elts = asdl_seq_new(len, arena);
5111 if (elts == NULL) goto failed;
5112 for (i = 0; i < len; i++) {
5113 expr_ty value;
5114 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5115 if (res != 0) goto failed;
5116 asdl_seq_SET(elts, i, value);
5117 }
5118 Py_XDECREF(tmp);
5119 tmp = NULL;
5120 } else {
5121 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
5122 return 1;
5123 }
5124 *out = Set(elts, lineno, col_offset, arena);
5125 if (*out == NULL) goto failed;
5126 return 0;
5127 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005128 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
5129 if (isinstance == -1) {
5130 return 1;
5131 }
5132 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005133 expr_ty elt;
5134 asdl_seq* generators;
5135
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005136 if (_PyObject_HasAttrId(obj, &PyId_elt)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005137 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005138 tmp = _PyObject_GetAttrId(obj, &PyId_elt);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005139 if (tmp == NULL) goto failed;
5140 res = obj2ast_expr(tmp, &elt, arena);
5141 if (res != 0) goto failed;
5142 Py_XDECREF(tmp);
5143 tmp = NULL;
5144 } else {
5145 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
5146 return 1;
5147 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005148 if (_PyObject_HasAttrId(obj, &PyId_generators)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005149 int res;
5150 Py_ssize_t len;
5151 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005152 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005153 if (tmp == NULL) goto failed;
5154 if (!PyList_Check(tmp)) {
5155 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5156 goto failed;
5157 }
5158 len = PyList_GET_SIZE(tmp);
5159 generators = asdl_seq_new(len, arena);
5160 if (generators == NULL) goto failed;
5161 for (i = 0; i < len; i++) {
5162 comprehension_ty value;
5163 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5164 if (res != 0) goto failed;
5165 asdl_seq_SET(generators, i, value);
5166 }
5167 Py_XDECREF(tmp);
5168 tmp = NULL;
5169 } else {
5170 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
5171 return 1;
5172 }
5173 *out = ListComp(elt, generators, lineno, col_offset, arena);
5174 if (*out == NULL) goto failed;
5175 return 0;
5176 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005177 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
5178 if (isinstance == -1) {
5179 return 1;
5180 }
5181 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005182 expr_ty elt;
5183 asdl_seq* generators;
5184
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005185 if (_PyObject_HasAttrId(obj, &PyId_elt)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005186 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005187 tmp = _PyObject_GetAttrId(obj, &PyId_elt);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005188 if (tmp == NULL) goto failed;
5189 res = obj2ast_expr(tmp, &elt, arena);
5190 if (res != 0) goto failed;
5191 Py_XDECREF(tmp);
5192 tmp = NULL;
5193 } else {
5194 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
5195 return 1;
5196 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005197 if (_PyObject_HasAttrId(obj, &PyId_generators)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005198 int res;
5199 Py_ssize_t len;
5200 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005201 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005202 if (tmp == NULL) goto failed;
5203 if (!PyList_Check(tmp)) {
5204 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5205 goto failed;
5206 }
5207 len = PyList_GET_SIZE(tmp);
5208 generators = asdl_seq_new(len, arena);
5209 if (generators == NULL) goto failed;
5210 for (i = 0; i < len; i++) {
5211 comprehension_ty value;
5212 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5213 if (res != 0) goto failed;
5214 asdl_seq_SET(generators, i, value);
5215 }
5216 Py_XDECREF(tmp);
5217 tmp = NULL;
5218 } else {
5219 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
5220 return 1;
5221 }
5222 *out = SetComp(elt, generators, lineno, col_offset, arena);
5223 if (*out == NULL) goto failed;
5224 return 0;
5225 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005226 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
5227 if (isinstance == -1) {
5228 return 1;
5229 }
5230 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005231 expr_ty key;
5232 expr_ty value;
5233 asdl_seq* generators;
5234
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005235 if (_PyObject_HasAttrId(obj, &PyId_key)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005236 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005237 tmp = _PyObject_GetAttrId(obj, &PyId_key);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005238 if (tmp == NULL) goto failed;
5239 res = obj2ast_expr(tmp, &key, arena);
5240 if (res != 0) goto failed;
5241 Py_XDECREF(tmp);
5242 tmp = NULL;
5243 } else {
5244 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
5245 return 1;
5246 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005247 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005248 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005249 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005250 if (tmp == NULL) goto failed;
5251 res = obj2ast_expr(tmp, &value, arena);
5252 if (res != 0) goto failed;
5253 Py_XDECREF(tmp);
5254 tmp = NULL;
5255 } else {
5256 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
5257 return 1;
5258 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005259 if (_PyObject_HasAttrId(obj, &PyId_generators)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005260 int res;
5261 Py_ssize_t len;
5262 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005263 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005264 if (tmp == NULL) goto failed;
5265 if (!PyList_Check(tmp)) {
5266 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5267 goto failed;
5268 }
5269 len = PyList_GET_SIZE(tmp);
5270 generators = asdl_seq_new(len, arena);
5271 if (generators == NULL) goto failed;
5272 for (i = 0; i < len; i++) {
5273 comprehension_ty value;
5274 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5275 if (res != 0) goto failed;
5276 asdl_seq_SET(generators, i, value);
5277 }
5278 Py_XDECREF(tmp);
5279 tmp = NULL;
5280 } else {
5281 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
5282 return 1;
5283 }
5284 *out = DictComp(key, value, generators, lineno, col_offset,
5285 arena);
5286 if (*out == NULL) goto failed;
5287 return 0;
5288 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005289 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
5290 if (isinstance == -1) {
5291 return 1;
5292 }
5293 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005294 expr_ty elt;
5295 asdl_seq* generators;
5296
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005297 if (_PyObject_HasAttrId(obj, &PyId_elt)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005298 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005299 tmp = _PyObject_GetAttrId(obj, &PyId_elt);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005300 if (tmp == NULL) goto failed;
5301 res = obj2ast_expr(tmp, &elt, arena);
5302 if (res != 0) goto failed;
5303 Py_XDECREF(tmp);
5304 tmp = NULL;
5305 } else {
5306 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
5307 return 1;
5308 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005309 if (_PyObject_HasAttrId(obj, &PyId_generators)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005310 int res;
5311 Py_ssize_t len;
5312 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005313 tmp = _PyObject_GetAttrId(obj, &PyId_generators);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005314 if (tmp == NULL) goto failed;
5315 if (!PyList_Check(tmp)) {
5316 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5317 goto failed;
5318 }
5319 len = PyList_GET_SIZE(tmp);
5320 generators = asdl_seq_new(len, arena);
5321 if (generators == NULL) goto failed;
5322 for (i = 0; i < len; i++) {
5323 comprehension_ty value;
5324 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5325 if (res != 0) goto failed;
5326 asdl_seq_SET(generators, i, value);
5327 }
5328 Py_XDECREF(tmp);
5329 tmp = NULL;
5330 } else {
5331 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
5332 return 1;
5333 }
5334 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
5335 if (*out == NULL) goto failed;
5336 return 0;
5337 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005338 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
5339 if (isinstance == -1) {
5340 return 1;
5341 }
5342 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005343 expr_ty value;
5344
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005345 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005346 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005347 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005348 if (tmp == NULL) goto failed;
5349 res = obj2ast_expr(tmp, &value, arena);
5350 if (res != 0) goto failed;
5351 Py_XDECREF(tmp);
5352 tmp = NULL;
5353 } else {
5354 value = NULL;
5355 }
5356 *out = Yield(value, lineno, col_offset, arena);
5357 if (*out == NULL) goto failed;
5358 return 0;
5359 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005360 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
5361 if (isinstance == -1) {
5362 return 1;
5363 }
5364 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005365 expr_ty left;
5366 asdl_int_seq* ops;
5367 asdl_seq* comparators;
5368
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005369 if (_PyObject_HasAttrId(obj, &PyId_left)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005370 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005371 tmp = _PyObject_GetAttrId(obj, &PyId_left);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005372 if (tmp == NULL) goto failed;
5373 res = obj2ast_expr(tmp, &left, arena);
5374 if (res != 0) goto failed;
5375 Py_XDECREF(tmp);
5376 tmp = NULL;
5377 } else {
5378 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
5379 return 1;
5380 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005381 if (_PyObject_HasAttrId(obj, &PyId_ops)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005382 int res;
5383 Py_ssize_t len;
5384 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005385 tmp = _PyObject_GetAttrId(obj, &PyId_ops);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005386 if (tmp == NULL) goto failed;
5387 if (!PyList_Check(tmp)) {
5388 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5389 goto failed;
5390 }
5391 len = PyList_GET_SIZE(tmp);
5392 ops = asdl_int_seq_new(len, arena);
5393 if (ops == NULL) goto failed;
5394 for (i = 0; i < len; i++) {
5395 cmpop_ty value;
5396 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &value, arena);
5397 if (res != 0) goto failed;
5398 asdl_seq_SET(ops, i, value);
5399 }
5400 Py_XDECREF(tmp);
5401 tmp = NULL;
5402 } else {
5403 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
5404 return 1;
5405 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005406 if (_PyObject_HasAttrId(obj, &PyId_comparators)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005407 int res;
5408 Py_ssize_t len;
5409 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005410 tmp = _PyObject_GetAttrId(obj, &PyId_comparators);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005411 if (tmp == NULL) goto failed;
5412 if (!PyList_Check(tmp)) {
5413 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5414 goto failed;
5415 }
5416 len = PyList_GET_SIZE(tmp);
5417 comparators = asdl_seq_new(len, arena);
5418 if (comparators == NULL) goto failed;
5419 for (i = 0; i < len; i++) {
5420 expr_ty value;
5421 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5422 if (res != 0) goto failed;
5423 asdl_seq_SET(comparators, i, value);
5424 }
5425 Py_XDECREF(tmp);
5426 tmp = NULL;
5427 } else {
5428 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
5429 return 1;
5430 }
5431 *out = Compare(left, ops, comparators, lineno, col_offset,
5432 arena);
5433 if (*out == NULL) goto failed;
5434 return 0;
5435 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005436 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
5437 if (isinstance == -1) {
5438 return 1;
5439 }
5440 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005441 expr_ty func;
5442 asdl_seq* args;
5443 asdl_seq* keywords;
5444 expr_ty starargs;
5445 expr_ty kwargs;
5446
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005447 if (_PyObject_HasAttrId(obj, &PyId_func)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005448 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005449 tmp = _PyObject_GetAttrId(obj, &PyId_func);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005450 if (tmp == NULL) goto failed;
5451 res = obj2ast_expr(tmp, &func, arena);
5452 if (res != 0) goto failed;
5453 Py_XDECREF(tmp);
5454 tmp = NULL;
5455 } else {
5456 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
5457 return 1;
5458 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005459 if (_PyObject_HasAttrId(obj, &PyId_args)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005460 int res;
5461 Py_ssize_t len;
5462 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005463 tmp = _PyObject_GetAttrId(obj, &PyId_args);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005464 if (tmp == NULL) goto failed;
5465 if (!PyList_Check(tmp)) {
5466 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5467 goto failed;
5468 }
5469 len = PyList_GET_SIZE(tmp);
5470 args = asdl_seq_new(len, arena);
5471 if (args == NULL) goto failed;
5472 for (i = 0; i < len; i++) {
5473 expr_ty value;
5474 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5475 if (res != 0) goto failed;
5476 asdl_seq_SET(args, i, value);
5477 }
5478 Py_XDECREF(tmp);
5479 tmp = NULL;
5480 } else {
5481 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
5482 return 1;
5483 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005484 if (_PyObject_HasAttrId(obj, &PyId_keywords)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005485 int res;
5486 Py_ssize_t len;
5487 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005488 tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005489 if (tmp == NULL) goto failed;
5490 if (!PyList_Check(tmp)) {
5491 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5492 goto failed;
5493 }
5494 len = PyList_GET_SIZE(tmp);
5495 keywords = asdl_seq_new(len, arena);
5496 if (keywords == NULL) goto failed;
5497 for (i = 0; i < len; i++) {
5498 keyword_ty value;
5499 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &value, arena);
5500 if (res != 0) goto failed;
5501 asdl_seq_SET(keywords, i, value);
5502 }
5503 Py_XDECREF(tmp);
5504 tmp = NULL;
5505 } else {
5506 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
5507 return 1;
5508 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005509 if (_PyObject_HasAttrId(obj, &PyId_starargs)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005510 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005511 tmp = _PyObject_GetAttrId(obj, &PyId_starargs);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005512 if (tmp == NULL) goto failed;
5513 res = obj2ast_expr(tmp, &starargs, arena);
5514 if (res != 0) goto failed;
5515 Py_XDECREF(tmp);
5516 tmp = NULL;
5517 } else {
5518 starargs = NULL;
5519 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005520 if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005521 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005522 tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005523 if (tmp == NULL) goto failed;
5524 res = obj2ast_expr(tmp, &kwargs, arena);
5525 if (res != 0) goto failed;
5526 Py_XDECREF(tmp);
5527 tmp = NULL;
5528 } else {
5529 kwargs = NULL;
5530 }
5531 *out = Call(func, args, keywords, starargs, kwargs, lineno,
5532 col_offset, arena);
5533 if (*out == NULL) goto failed;
5534 return 0;
5535 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005536 isinstance = PyObject_IsInstance(obj, (PyObject*)Num_type);
5537 if (isinstance == -1) {
5538 return 1;
5539 }
5540 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005541 object n;
5542
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005543 if (_PyObject_HasAttrId(obj, &PyId_n)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005544 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005545 tmp = _PyObject_GetAttrId(obj, &PyId_n);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005546 if (tmp == NULL) goto failed;
5547 res = obj2ast_object(tmp, &n, arena);
5548 if (res != 0) goto failed;
5549 Py_XDECREF(tmp);
5550 tmp = NULL;
5551 } else {
5552 PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
5553 return 1;
5554 }
5555 *out = Num(n, lineno, col_offset, arena);
5556 if (*out == NULL) goto failed;
5557 return 0;
5558 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005559 isinstance = PyObject_IsInstance(obj, (PyObject*)Str_type);
5560 if (isinstance == -1) {
5561 return 1;
5562 }
5563 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005564 string s;
5565
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005566 if (_PyObject_HasAttrId(obj, &PyId_s)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005567 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005568 tmp = _PyObject_GetAttrId(obj, &PyId_s);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005569 if (tmp == NULL) goto failed;
5570 res = obj2ast_string(tmp, &s, arena);
5571 if (res != 0) goto failed;
5572 Py_XDECREF(tmp);
5573 tmp = NULL;
5574 } else {
5575 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
5576 return 1;
5577 }
5578 *out = Str(s, lineno, col_offset, arena);
5579 if (*out == NULL) goto failed;
5580 return 0;
5581 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005582 isinstance = PyObject_IsInstance(obj, (PyObject*)Bytes_type);
5583 if (isinstance == -1) {
5584 return 1;
5585 }
5586 if (isinstance) {
Benjamin Petersone2498412011-08-09 16:08:39 -05005587 bytes s;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005588
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005589 if (_PyObject_HasAttrId(obj, &PyId_s)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005590 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005591 tmp = _PyObject_GetAttrId(obj, &PyId_s);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005592 if (tmp == NULL) goto failed;
Benjamin Petersone2498412011-08-09 16:08:39 -05005593 res = obj2ast_bytes(tmp, &s, arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005594 if (res != 0) goto failed;
5595 Py_XDECREF(tmp);
5596 tmp = NULL;
5597 } else {
5598 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Bytes");
5599 return 1;
5600 }
5601 *out = Bytes(s, lineno, col_offset, arena);
5602 if (*out == NULL) goto failed;
5603 return 0;
5604 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005605 isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type);
5606 if (isinstance == -1) {
5607 return 1;
5608 }
5609 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005610
5611 *out = Ellipsis(lineno, col_offset, arena);
5612 if (*out == NULL) goto failed;
5613 return 0;
5614 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005615 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
5616 if (isinstance == -1) {
5617 return 1;
5618 }
5619 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005620 expr_ty value;
5621 identifier attr;
5622 expr_context_ty ctx;
5623
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005624 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005625 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005626 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005627 if (tmp == NULL) goto failed;
5628 res = obj2ast_expr(tmp, &value, arena);
5629 if (res != 0) goto failed;
5630 Py_XDECREF(tmp);
5631 tmp = NULL;
5632 } else {
5633 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
5634 return 1;
5635 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005636 if (_PyObject_HasAttrId(obj, &PyId_attr)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005637 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005638 tmp = _PyObject_GetAttrId(obj, &PyId_attr);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005639 if (tmp == NULL) goto failed;
5640 res = obj2ast_identifier(tmp, &attr, arena);
5641 if (res != 0) goto failed;
5642 Py_XDECREF(tmp);
5643 tmp = NULL;
5644 } else {
5645 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
5646 return 1;
5647 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005648 if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005649 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005650 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005651 if (tmp == NULL) goto failed;
5652 res = obj2ast_expr_context(tmp, &ctx, arena);
5653 if (res != 0) goto failed;
5654 Py_XDECREF(tmp);
5655 tmp = NULL;
5656 } else {
5657 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
5658 return 1;
5659 }
5660 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
5661 if (*out == NULL) goto failed;
5662 return 0;
5663 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005664 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
5665 if (isinstance == -1) {
5666 return 1;
5667 }
5668 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005669 expr_ty value;
5670 slice_ty slice;
5671 expr_context_ty ctx;
5672
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005673 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005674 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005675 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005676 if (tmp == NULL) goto failed;
5677 res = obj2ast_expr(tmp, &value, arena);
5678 if (res != 0) goto failed;
5679 Py_XDECREF(tmp);
5680 tmp = NULL;
5681 } else {
5682 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
5683 return 1;
5684 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005685 if (_PyObject_HasAttrId(obj, &PyId_slice)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005686 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005687 tmp = _PyObject_GetAttrId(obj, &PyId_slice);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005688 if (tmp == NULL) goto failed;
5689 res = obj2ast_slice(tmp, &slice, arena);
5690 if (res != 0) goto failed;
5691 Py_XDECREF(tmp);
5692 tmp = NULL;
5693 } else {
5694 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
5695 return 1;
5696 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005697 if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005698 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005699 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005700 if (tmp == NULL) goto failed;
5701 res = obj2ast_expr_context(tmp, &ctx, arena);
5702 if (res != 0) goto failed;
5703 Py_XDECREF(tmp);
5704 tmp = NULL;
5705 } else {
5706 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
5707 return 1;
5708 }
5709 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
5710 if (*out == NULL) goto failed;
5711 return 0;
5712 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005713 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
5714 if (isinstance == -1) {
5715 return 1;
5716 }
5717 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005718 expr_ty value;
5719 expr_context_ty ctx;
5720
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005721 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005722 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005723 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005724 if (tmp == NULL) goto failed;
5725 res = obj2ast_expr(tmp, &value, arena);
5726 if (res != 0) goto failed;
5727 Py_XDECREF(tmp);
5728 tmp = NULL;
5729 } else {
5730 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
5731 return 1;
5732 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005733 if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005734 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005735 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005736 if (tmp == NULL) goto failed;
5737 res = obj2ast_expr_context(tmp, &ctx, arena);
5738 if (res != 0) goto failed;
5739 Py_XDECREF(tmp);
5740 tmp = NULL;
5741 } else {
5742 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
5743 return 1;
5744 }
5745 *out = Starred(value, ctx, lineno, col_offset, arena);
5746 if (*out == NULL) goto failed;
5747 return 0;
5748 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005749 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
5750 if (isinstance == -1) {
5751 return 1;
5752 }
5753 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005754 identifier id;
5755 expr_context_ty ctx;
5756
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005757 if (_PyObject_HasAttrId(obj, &PyId_id)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005758 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005759 tmp = _PyObject_GetAttrId(obj, &PyId_id);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005760 if (tmp == NULL) goto failed;
5761 res = obj2ast_identifier(tmp, &id, arena);
5762 if (res != 0) goto failed;
5763 Py_XDECREF(tmp);
5764 tmp = NULL;
5765 } else {
5766 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
5767 return 1;
5768 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005769 if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005770 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005771 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005772 if (tmp == NULL) goto failed;
5773 res = obj2ast_expr_context(tmp, &ctx, arena);
5774 if (res != 0) goto failed;
5775 Py_XDECREF(tmp);
5776 tmp = NULL;
5777 } else {
5778 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
5779 return 1;
5780 }
5781 *out = Name(id, ctx, lineno, col_offset, arena);
5782 if (*out == NULL) goto failed;
5783 return 0;
5784 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005785 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
5786 if (isinstance == -1) {
5787 return 1;
5788 }
5789 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005790 asdl_seq* elts;
5791 expr_context_ty ctx;
5792
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005793 if (_PyObject_HasAttrId(obj, &PyId_elts)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005794 int res;
5795 Py_ssize_t len;
5796 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005797 tmp = _PyObject_GetAttrId(obj, &PyId_elts);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005798 if (tmp == NULL) goto failed;
5799 if (!PyList_Check(tmp)) {
5800 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5801 goto failed;
5802 }
5803 len = PyList_GET_SIZE(tmp);
5804 elts = asdl_seq_new(len, arena);
5805 if (elts == NULL) goto failed;
5806 for (i = 0; i < len; i++) {
5807 expr_ty value;
5808 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5809 if (res != 0) goto failed;
5810 asdl_seq_SET(elts, i, value);
5811 }
5812 Py_XDECREF(tmp);
5813 tmp = NULL;
5814 } else {
5815 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
5816 return 1;
5817 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005818 if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005819 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005820 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005821 if (tmp == NULL) goto failed;
5822 res = obj2ast_expr_context(tmp, &ctx, arena);
5823 if (res != 0) goto failed;
5824 Py_XDECREF(tmp);
5825 tmp = NULL;
5826 } else {
5827 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
5828 return 1;
5829 }
5830 *out = List(elts, ctx, lineno, col_offset, arena);
5831 if (*out == NULL) goto failed;
5832 return 0;
5833 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005834 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
5835 if (isinstance == -1) {
5836 return 1;
5837 }
5838 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005839 asdl_seq* elts;
5840 expr_context_ty ctx;
5841
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005842 if (_PyObject_HasAttrId(obj, &PyId_elts)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005843 int res;
5844 Py_ssize_t len;
5845 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005846 tmp = _PyObject_GetAttrId(obj, &PyId_elts);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005847 if (tmp == NULL) goto failed;
5848 if (!PyList_Check(tmp)) {
5849 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5850 goto failed;
5851 }
5852 len = PyList_GET_SIZE(tmp);
5853 elts = asdl_seq_new(len, arena);
5854 if (elts == NULL) goto failed;
5855 for (i = 0; i < len; i++) {
5856 expr_ty value;
5857 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5858 if (res != 0) goto failed;
5859 asdl_seq_SET(elts, i, value);
5860 }
5861 Py_XDECREF(tmp);
5862 tmp = NULL;
5863 } else {
5864 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
5865 return 1;
5866 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005867 if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005868 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005869 tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005870 if (tmp == NULL) goto failed;
5871 res = obj2ast_expr_context(tmp, &ctx, arena);
5872 if (res != 0) goto failed;
5873 Py_XDECREF(tmp);
5874 tmp = NULL;
5875 } else {
5876 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
5877 return 1;
5878 }
5879 *out = Tuple(elts, ctx, lineno, col_offset, arena);
5880 if (*out == NULL) goto failed;
5881 return 0;
5882 }
5883
Benjamin Peterson5b066812010-11-20 01:38:49 +00005884 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
5885 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00005886 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005887 return 1;
5888}
5889
5890int
5891obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
5892{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005893 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005894
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005895 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
5896 if (isinstance == -1) {
5897 return 1;
5898 }
5899 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005900 *out = Load;
5901 return 0;
5902 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005903 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
5904 if (isinstance == -1) {
5905 return 1;
5906 }
5907 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005908 *out = Store;
5909 return 0;
5910 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005911 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
5912 if (isinstance == -1) {
5913 return 1;
5914 }
5915 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005916 *out = Del;
5917 return 0;
5918 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005919 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
5920 if (isinstance == -1) {
5921 return 1;
5922 }
5923 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005924 *out = AugLoad;
5925 return 0;
5926 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005927 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
5928 if (isinstance == -1) {
5929 return 1;
5930 }
5931 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005932 *out = AugStore;
5933 return 0;
5934 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005935 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
5936 if (isinstance == -1) {
5937 return 1;
5938 }
5939 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005940 *out = Param;
5941 return 0;
5942 }
5943
Benjamin Peterson5b066812010-11-20 01:38:49 +00005944 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005945 return 1;
5946}
5947
5948int
5949obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
5950{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005951 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005952
Benjamin Petersond8f65972010-11-20 04:31:07 +00005953 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005954
5955 if (obj == Py_None) {
5956 *out = NULL;
5957 return 0;
5958 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005959 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
5960 if (isinstance == -1) {
5961 return 1;
5962 }
5963 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005964 expr_ty lower;
5965 expr_ty upper;
5966 expr_ty step;
5967
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005968 if (_PyObject_HasAttrId(obj, &PyId_lower)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005969 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005970 tmp = _PyObject_GetAttrId(obj, &PyId_lower);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005971 if (tmp == NULL) goto failed;
5972 res = obj2ast_expr(tmp, &lower, arena);
5973 if (res != 0) goto failed;
5974 Py_XDECREF(tmp);
5975 tmp = NULL;
5976 } else {
5977 lower = NULL;
5978 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005979 if (_PyObject_HasAttrId(obj, &PyId_upper)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005980 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005981 tmp = _PyObject_GetAttrId(obj, &PyId_upper);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005982 if (tmp == NULL) goto failed;
5983 res = obj2ast_expr(tmp, &upper, arena);
5984 if (res != 0) goto failed;
5985 Py_XDECREF(tmp);
5986 tmp = NULL;
5987 } else {
5988 upper = NULL;
5989 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005990 if (_PyObject_HasAttrId(obj, &PyId_step)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005991 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02005992 tmp = _PyObject_GetAttrId(obj, &PyId_step);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005993 if (tmp == NULL) goto failed;
5994 res = obj2ast_expr(tmp, &step, arena);
5995 if (res != 0) goto failed;
5996 Py_XDECREF(tmp);
5997 tmp = NULL;
5998 } else {
5999 step = NULL;
6000 }
6001 *out = Slice(lower, upper, step, arena);
6002 if (*out == NULL) goto failed;
6003 return 0;
6004 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006005 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
6006 if (isinstance == -1) {
6007 return 1;
6008 }
6009 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006010 asdl_seq* dims;
6011
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006012 if (_PyObject_HasAttrId(obj, &PyId_dims)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006013 int res;
6014 Py_ssize_t len;
6015 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006016 tmp = _PyObject_GetAttrId(obj, &PyId_dims);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006017 if (tmp == NULL) goto failed;
6018 if (!PyList_Check(tmp)) {
6019 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6020 goto failed;
6021 }
6022 len = PyList_GET_SIZE(tmp);
6023 dims = asdl_seq_new(len, arena);
6024 if (dims == NULL) goto failed;
6025 for (i = 0; i < len; i++) {
6026 slice_ty value;
6027 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &value, arena);
6028 if (res != 0) goto failed;
6029 asdl_seq_SET(dims, i, value);
6030 }
6031 Py_XDECREF(tmp);
6032 tmp = NULL;
6033 } else {
6034 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
6035 return 1;
6036 }
6037 *out = ExtSlice(dims, arena);
6038 if (*out == NULL) goto failed;
6039 return 0;
6040 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006041 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
6042 if (isinstance == -1) {
6043 return 1;
6044 }
6045 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006046 expr_ty value;
6047
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006048 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006049 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006050 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006051 if (tmp == NULL) goto failed;
6052 res = obj2ast_expr(tmp, &value, arena);
6053 if (res != 0) goto failed;
6054 Py_XDECREF(tmp);
6055 tmp = NULL;
6056 } else {
6057 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
6058 return 1;
6059 }
6060 *out = Index(value, arena);
6061 if (*out == NULL) goto failed;
6062 return 0;
6063 }
6064
Benjamin Peterson5b066812010-11-20 01:38:49 +00006065 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
6066 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00006067 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006068 return 1;
6069}
6070
6071int
6072obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
6073{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006074 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006075
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006076 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
6077 if (isinstance == -1) {
6078 return 1;
6079 }
6080 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006081 *out = And;
6082 return 0;
6083 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006084 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
6085 if (isinstance == -1) {
6086 return 1;
6087 }
6088 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006089 *out = Or;
6090 return 0;
6091 }
6092
Benjamin Peterson5b066812010-11-20 01:38:49 +00006093 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006094 return 1;
6095}
6096
6097int
6098obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
6099{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006100 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006101
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006102 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
6103 if (isinstance == -1) {
6104 return 1;
6105 }
6106 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006107 *out = Add;
6108 return 0;
6109 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006110 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
6111 if (isinstance == -1) {
6112 return 1;
6113 }
6114 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006115 *out = Sub;
6116 return 0;
6117 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006118 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
6119 if (isinstance == -1) {
6120 return 1;
6121 }
6122 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006123 *out = Mult;
6124 return 0;
6125 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006126 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
6127 if (isinstance == -1) {
6128 return 1;
6129 }
6130 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006131 *out = Div;
6132 return 0;
6133 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006134 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
6135 if (isinstance == -1) {
6136 return 1;
6137 }
6138 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006139 *out = Mod;
6140 return 0;
6141 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006142 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
6143 if (isinstance == -1) {
6144 return 1;
6145 }
6146 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006147 *out = Pow;
6148 return 0;
6149 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006150 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
6151 if (isinstance == -1) {
6152 return 1;
6153 }
6154 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006155 *out = LShift;
6156 return 0;
6157 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006158 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
6159 if (isinstance == -1) {
6160 return 1;
6161 }
6162 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006163 *out = RShift;
6164 return 0;
6165 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006166 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
6167 if (isinstance == -1) {
6168 return 1;
6169 }
6170 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006171 *out = BitOr;
6172 return 0;
6173 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006174 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
6175 if (isinstance == -1) {
6176 return 1;
6177 }
6178 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006179 *out = BitXor;
6180 return 0;
6181 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006182 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
6183 if (isinstance == -1) {
6184 return 1;
6185 }
6186 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006187 *out = BitAnd;
6188 return 0;
6189 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006190 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
6191 if (isinstance == -1) {
6192 return 1;
6193 }
6194 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006195 *out = FloorDiv;
6196 return 0;
6197 }
6198
Benjamin Peterson5b066812010-11-20 01:38:49 +00006199 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006200 return 1;
6201}
6202
6203int
6204obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
6205{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006206 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006207
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006208 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
6209 if (isinstance == -1) {
6210 return 1;
6211 }
6212 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006213 *out = Invert;
6214 return 0;
6215 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006216 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
6217 if (isinstance == -1) {
6218 return 1;
6219 }
6220 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006221 *out = Not;
6222 return 0;
6223 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006224 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
6225 if (isinstance == -1) {
6226 return 1;
6227 }
6228 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006229 *out = UAdd;
6230 return 0;
6231 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006232 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
6233 if (isinstance == -1) {
6234 return 1;
6235 }
6236 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006237 *out = USub;
6238 return 0;
6239 }
6240
Benjamin Peterson5b066812010-11-20 01:38:49 +00006241 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006242 return 1;
6243}
6244
6245int
6246obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
6247{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006248 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006249
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006250 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
6251 if (isinstance == -1) {
6252 return 1;
6253 }
6254 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006255 *out = Eq;
6256 return 0;
6257 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006258 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
6259 if (isinstance == -1) {
6260 return 1;
6261 }
6262 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006263 *out = NotEq;
6264 return 0;
6265 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006266 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
6267 if (isinstance == -1) {
6268 return 1;
6269 }
6270 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006271 *out = Lt;
6272 return 0;
6273 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006274 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
6275 if (isinstance == -1) {
6276 return 1;
6277 }
6278 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006279 *out = LtE;
6280 return 0;
6281 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006282 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
6283 if (isinstance == -1) {
6284 return 1;
6285 }
6286 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006287 *out = Gt;
6288 return 0;
6289 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006290 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
6291 if (isinstance == -1) {
6292 return 1;
6293 }
6294 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006295 *out = GtE;
6296 return 0;
6297 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006298 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
6299 if (isinstance == -1) {
6300 return 1;
6301 }
6302 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006303 *out = Is;
6304 return 0;
6305 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006306 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
6307 if (isinstance == -1) {
6308 return 1;
6309 }
6310 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006311 *out = IsNot;
6312 return 0;
6313 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006314 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
6315 if (isinstance == -1) {
6316 return 1;
6317 }
6318 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006319 *out = In;
6320 return 0;
6321 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006322 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
6323 if (isinstance == -1) {
6324 return 1;
6325 }
6326 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006327 *out = NotIn;
6328 return 0;
6329 }
6330
Benjamin Peterson5b066812010-11-20 01:38:49 +00006331 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006332 return 1;
6333}
6334
6335int
6336obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
6337{
6338 PyObject* tmp = NULL;
6339 expr_ty target;
6340 expr_ty iter;
6341 asdl_seq* ifs;
6342
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006343 if (_PyObject_HasAttrId(obj, &PyId_target)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006344 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006345 tmp = _PyObject_GetAttrId(obj, &PyId_target);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006346 if (tmp == NULL) goto failed;
6347 res = obj2ast_expr(tmp, &target, arena);
6348 if (res != 0) goto failed;
6349 Py_XDECREF(tmp);
6350 tmp = NULL;
6351 } else {
6352 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
6353 return 1;
6354 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006355 if (_PyObject_HasAttrId(obj, &PyId_iter)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006356 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006357 tmp = _PyObject_GetAttrId(obj, &PyId_iter);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006358 if (tmp == NULL) goto failed;
6359 res = obj2ast_expr(tmp, &iter, arena);
6360 if (res != 0) goto failed;
6361 Py_XDECREF(tmp);
6362 tmp = NULL;
6363 } else {
6364 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
6365 return 1;
6366 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006367 if (_PyObject_HasAttrId(obj, &PyId_ifs)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006368 int res;
6369 Py_ssize_t len;
6370 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006371 tmp = _PyObject_GetAttrId(obj, &PyId_ifs);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006372 if (tmp == NULL) goto failed;
6373 if (!PyList_Check(tmp)) {
6374 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6375 goto failed;
6376 }
6377 len = PyList_GET_SIZE(tmp);
6378 ifs = asdl_seq_new(len, arena);
6379 if (ifs == NULL) goto failed;
6380 for (i = 0; i < len; i++) {
6381 expr_ty value;
6382 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6383 if (res != 0) goto failed;
6384 asdl_seq_SET(ifs, i, value);
6385 }
6386 Py_XDECREF(tmp);
6387 tmp = NULL;
6388 } else {
6389 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
6390 return 1;
6391 }
6392 *out = comprehension(target, iter, ifs, arena);
6393 return 0;
6394failed:
6395 Py_XDECREF(tmp);
6396 return 1;
6397}
6398
6399int
6400obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
6401{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006402 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00006403
Benjamin Petersond8f65972010-11-20 04:31:07 +00006404 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006405 int lineno;
6406 int col_offset;
6407
Neal Norwitzad74aa82008-03-31 05:14:30 +00006408 if (obj == Py_None) {
6409 *out = NULL;
6410 return 0;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006411 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006412 if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006413 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006414 tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006415 if (tmp == NULL) goto failed;
6416 res = obj2ast_int(tmp, &lineno, arena);
6417 if (res != 0) goto failed;
6418 Py_XDECREF(tmp);
6419 tmp = NULL;
6420 } else {
6421 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
6422 return 1;
6423 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006424 if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006425 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006426 tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006427 if (tmp == NULL) goto failed;
6428 res = obj2ast_int(tmp, &col_offset, arena);
6429 if (res != 0) goto failed;
6430 Py_XDECREF(tmp);
6431 tmp = NULL;
6432 } else {
6433 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
6434 return 1;
6435 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006436 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
6437 if (isinstance == -1) {
6438 return 1;
6439 }
6440 if (isinstance) {
Neal Norwitzad74aa82008-03-31 05:14:30 +00006441 expr_ty type;
6442 identifier name;
6443 asdl_seq* body;
6444
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006445 if (_PyObject_HasAttrId(obj, &PyId_type)) {
Neal Norwitzad74aa82008-03-31 05:14:30 +00006446 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006447 tmp = _PyObject_GetAttrId(obj, &PyId_type);
Neal Norwitzad74aa82008-03-31 05:14:30 +00006448 if (tmp == NULL) goto failed;
6449 res = obj2ast_expr(tmp, &type, arena);
6450 if (res != 0) goto failed;
6451 Py_XDECREF(tmp);
6452 tmp = NULL;
6453 } else {
6454 type = NULL;
6455 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006456 if (_PyObject_HasAttrId(obj, &PyId_name)) {
Neal Norwitzad74aa82008-03-31 05:14:30 +00006457 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006458 tmp = _PyObject_GetAttrId(obj, &PyId_name);
Neal Norwitzad74aa82008-03-31 05:14:30 +00006459 if (tmp == NULL) goto failed;
6460 res = obj2ast_identifier(tmp, &name, arena);
6461 if (res != 0) goto failed;
6462 Py_XDECREF(tmp);
6463 tmp = NULL;
6464 } else {
6465 name = NULL;
6466 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006467 if (_PyObject_HasAttrId(obj, &PyId_body)) {
Neal Norwitzad74aa82008-03-31 05:14:30 +00006468 int res;
6469 Py_ssize_t len;
6470 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006471 tmp = _PyObject_GetAttrId(obj, &PyId_body);
Neal Norwitzad74aa82008-03-31 05:14:30 +00006472 if (tmp == NULL) goto failed;
6473 if (!PyList_Check(tmp)) {
6474 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6475 goto failed;
6476 }
6477 len = PyList_GET_SIZE(tmp);
6478 body = asdl_seq_new(len, arena);
6479 if (body == NULL) goto failed;
6480 for (i = 0; i < len; i++) {
6481 stmt_ty value;
6482 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
6483 if (res != 0) goto failed;
6484 asdl_seq_SET(body, i, value);
6485 }
6486 Py_XDECREF(tmp);
6487 tmp = NULL;
6488 } else {
6489 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
6490 return 1;
6491 }
6492 *out = ExceptHandler(type, name, body, lineno, col_offset,
6493 arena);
6494 if (*out == NULL) goto failed;
6495 return 0;
6496 }
6497
Benjamin Peterson5b066812010-11-20 01:38:49 +00006498 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
6499 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00006500 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006501 return 1;
6502}
6503
6504int
6505obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
6506{
6507 PyObject* tmp = NULL;
6508 asdl_seq* args;
6509 identifier vararg;
6510 expr_ty varargannotation;
6511 asdl_seq* kwonlyargs;
6512 identifier kwarg;
6513 expr_ty kwargannotation;
6514 asdl_seq* defaults;
6515 asdl_seq* kw_defaults;
6516
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006517 if (_PyObject_HasAttrId(obj, &PyId_args)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006518 int res;
6519 Py_ssize_t len;
6520 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006521 tmp = _PyObject_GetAttrId(obj, &PyId_args);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006522 if (tmp == NULL) goto failed;
6523 if (!PyList_Check(tmp)) {
6524 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6525 goto failed;
6526 }
6527 len = PyList_GET_SIZE(tmp);
6528 args = asdl_seq_new(len, arena);
6529 if (args == NULL) goto failed;
6530 for (i = 0; i < len; i++) {
6531 arg_ty value;
6532 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &value, arena);
6533 if (res != 0) goto failed;
6534 asdl_seq_SET(args, i, value);
6535 }
6536 Py_XDECREF(tmp);
6537 tmp = NULL;
6538 } else {
6539 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
6540 return 1;
6541 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006542 if (_PyObject_HasAttrId(obj, &PyId_vararg)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006543 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006544 tmp = _PyObject_GetAttrId(obj, &PyId_vararg);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006545 if (tmp == NULL) goto failed;
6546 res = obj2ast_identifier(tmp, &vararg, arena);
6547 if (res != 0) goto failed;
6548 Py_XDECREF(tmp);
6549 tmp = NULL;
6550 } else {
6551 vararg = NULL;
6552 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006553 if (_PyObject_HasAttrId(obj, &PyId_varargannotation)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006554 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006555 tmp = _PyObject_GetAttrId(obj, &PyId_varargannotation);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006556 if (tmp == NULL) goto failed;
6557 res = obj2ast_expr(tmp, &varargannotation, arena);
6558 if (res != 0) goto failed;
6559 Py_XDECREF(tmp);
6560 tmp = NULL;
6561 } else {
6562 varargannotation = NULL;
6563 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006564 if (_PyObject_HasAttrId(obj, &PyId_kwonlyargs)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006565 int res;
6566 Py_ssize_t len;
6567 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006568 tmp = _PyObject_GetAttrId(obj, &PyId_kwonlyargs);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006569 if (tmp == NULL) goto failed;
6570 if (!PyList_Check(tmp)) {
6571 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6572 goto failed;
6573 }
6574 len = PyList_GET_SIZE(tmp);
6575 kwonlyargs = asdl_seq_new(len, arena);
6576 if (kwonlyargs == NULL) goto failed;
6577 for (i = 0; i < len; i++) {
6578 arg_ty value;
6579 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &value, arena);
6580 if (res != 0) goto failed;
6581 asdl_seq_SET(kwonlyargs, i, value);
6582 }
6583 Py_XDECREF(tmp);
6584 tmp = NULL;
6585 } else {
6586 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
6587 return 1;
6588 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006589 if (_PyObject_HasAttrId(obj, &PyId_kwarg)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006590 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006591 tmp = _PyObject_GetAttrId(obj, &PyId_kwarg);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006592 if (tmp == NULL) goto failed;
6593 res = obj2ast_identifier(tmp, &kwarg, arena);
6594 if (res != 0) goto failed;
6595 Py_XDECREF(tmp);
6596 tmp = NULL;
6597 } else {
6598 kwarg = NULL;
6599 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006600 if (_PyObject_HasAttrId(obj, &PyId_kwargannotation)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006601 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006602 tmp = _PyObject_GetAttrId(obj, &PyId_kwargannotation);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006603 if (tmp == NULL) goto failed;
6604 res = obj2ast_expr(tmp, &kwargannotation, arena);
6605 if (res != 0) goto failed;
6606 Py_XDECREF(tmp);
6607 tmp = NULL;
6608 } else {
6609 kwargannotation = NULL;
6610 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006611 if (_PyObject_HasAttrId(obj, &PyId_defaults)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006612 int res;
6613 Py_ssize_t len;
6614 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006615 tmp = _PyObject_GetAttrId(obj, &PyId_defaults);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006616 if (tmp == NULL) goto failed;
6617 if (!PyList_Check(tmp)) {
6618 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6619 goto failed;
6620 }
6621 len = PyList_GET_SIZE(tmp);
6622 defaults = asdl_seq_new(len, arena);
6623 if (defaults == NULL) goto failed;
6624 for (i = 0; i < len; i++) {
6625 expr_ty value;
6626 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6627 if (res != 0) goto failed;
6628 asdl_seq_SET(defaults, i, value);
6629 }
6630 Py_XDECREF(tmp);
6631 tmp = NULL;
6632 } else {
6633 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
6634 return 1;
6635 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006636 if (_PyObject_HasAttrId(obj, &PyId_kw_defaults)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006637 int res;
6638 Py_ssize_t len;
6639 Py_ssize_t i;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006640 tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006641 if (tmp == NULL) goto failed;
6642 if (!PyList_Check(tmp)) {
6643 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6644 goto failed;
6645 }
6646 len = PyList_GET_SIZE(tmp);
6647 kw_defaults = asdl_seq_new(len, arena);
6648 if (kw_defaults == NULL) goto failed;
6649 for (i = 0; i < len; i++) {
6650 expr_ty value;
6651 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6652 if (res != 0) goto failed;
6653 asdl_seq_SET(kw_defaults, i, value);
6654 }
6655 Py_XDECREF(tmp);
6656 tmp = NULL;
6657 } else {
6658 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
6659 return 1;
6660 }
6661 *out = arguments(args, vararg, varargannotation, kwonlyargs, kwarg,
6662 kwargannotation, defaults, kw_defaults, arena);
6663 return 0;
6664failed:
6665 Py_XDECREF(tmp);
6666 return 1;
6667}
6668
6669int
6670obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
6671{
6672 PyObject* tmp = NULL;
6673 identifier arg;
6674 expr_ty annotation;
6675
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006676 if (_PyObject_HasAttrId(obj, &PyId_arg)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006677 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006678 tmp = _PyObject_GetAttrId(obj, &PyId_arg);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006679 if (tmp == NULL) goto failed;
6680 res = obj2ast_identifier(tmp, &arg, arena);
6681 if (res != 0) goto failed;
6682 Py_XDECREF(tmp);
6683 tmp = NULL;
6684 } else {
6685 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
6686 return 1;
6687 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006688 if (_PyObject_HasAttrId(obj, &PyId_annotation)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006689 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006690 tmp = _PyObject_GetAttrId(obj, &PyId_annotation);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006691 if (tmp == NULL) goto failed;
6692 res = obj2ast_expr(tmp, &annotation, arena);
6693 if (res != 0) goto failed;
6694 Py_XDECREF(tmp);
6695 tmp = NULL;
6696 } else {
6697 annotation = NULL;
6698 }
6699 *out = arg(arg, annotation, arena);
6700 return 0;
6701failed:
6702 Py_XDECREF(tmp);
6703 return 1;
6704}
6705
6706int
6707obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
6708{
6709 PyObject* tmp = NULL;
6710 identifier arg;
6711 expr_ty value;
6712
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006713 if (_PyObject_HasAttrId(obj, &PyId_arg)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006714 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006715 tmp = _PyObject_GetAttrId(obj, &PyId_arg);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006716 if (tmp == NULL) goto failed;
6717 res = obj2ast_identifier(tmp, &arg, arena);
6718 if (res != 0) goto failed;
6719 Py_XDECREF(tmp);
6720 tmp = NULL;
6721 } else {
6722 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword");
6723 return 1;
6724 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006725 if (_PyObject_HasAttrId(obj, &PyId_value)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006726 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006727 tmp = _PyObject_GetAttrId(obj, &PyId_value);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006728 if (tmp == NULL) goto failed;
6729 res = obj2ast_expr(tmp, &value, arena);
6730 if (res != 0) goto failed;
6731 Py_XDECREF(tmp);
6732 tmp = NULL;
6733 } else {
6734 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
6735 return 1;
6736 }
6737 *out = keyword(arg, value, arena);
6738 return 0;
6739failed:
6740 Py_XDECREF(tmp);
6741 return 1;
6742}
6743
6744int
6745obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
6746{
6747 PyObject* tmp = NULL;
6748 identifier name;
6749 identifier asname;
6750
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006751 if (_PyObject_HasAttrId(obj, &PyId_name)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006752 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006753 tmp = _PyObject_GetAttrId(obj, &PyId_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006754 if (tmp == NULL) goto failed;
6755 res = obj2ast_identifier(tmp, &name, arena);
6756 if (res != 0) goto failed;
6757 Py_XDECREF(tmp);
6758 tmp = NULL;
6759 } else {
6760 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
6761 return 1;
6762 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006763 if (_PyObject_HasAttrId(obj, &PyId_asname)) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006764 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006765 tmp = _PyObject_GetAttrId(obj, &PyId_asname);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006766 if (tmp == NULL) goto failed;
6767 res = obj2ast_identifier(tmp, &asname, arena);
6768 if (res != 0) goto failed;
6769 Py_XDECREF(tmp);
6770 tmp = NULL;
6771 } else {
6772 asname = NULL;
6773 }
6774 *out = alias(name, asname, arena);
6775 return 0;
6776failed:
6777 Py_XDECREF(tmp);
6778 return 1;
6779}
6780
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05006781int
6782obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
6783{
6784 PyObject* tmp = NULL;
6785 expr_ty context_expr;
6786 expr_ty optional_vars;
6787
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006788 if (_PyObject_HasAttrId(obj, &PyId_context_expr)) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05006789 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006790 tmp = _PyObject_GetAttrId(obj, &PyId_context_expr);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05006791 if (tmp == NULL) goto failed;
6792 res = obj2ast_expr(tmp, &context_expr, arena);
6793 if (res != 0) goto failed;
6794 Py_XDECREF(tmp);
6795 tmp = NULL;
6796 } else {
6797 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
6798 return 1;
6799 }
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006800 if (_PyObject_HasAttrId(obj, &PyId_optional_vars)) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05006801 int res;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02006802 tmp = _PyObject_GetAttrId(obj, &PyId_optional_vars);
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05006803 if (tmp == NULL) goto failed;
6804 res = obj2ast_expr(tmp, &optional_vars, arena);
6805 if (res != 0) goto failed;
6806 Py_XDECREF(tmp);
6807 tmp = NULL;
6808 } else {
6809 optional_vars = NULL;
6810 }
6811 *out = withitem(context_expr, optional_vars, arena);
6812 return 0;
6813failed:
6814 Py_XDECREF(tmp);
6815 return 1;
6816}
6817
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006818
Martin v. Löwis1a214512008-06-11 05:26:20 +00006819static struct PyModuleDef _astmodule = {
6820 PyModuleDef_HEAD_INIT, "_ast"
6821};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006822PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006823PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006824{
6825 PyObject *m, *d;
Martin v. Löwis1a214512008-06-11 05:26:20 +00006826 if (!init_types()) return NULL;
6827 m = PyModule_Create(&_astmodule);
6828 if (!m) return NULL;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006829 d = PyModule_GetDict(m);
Martin v. Löwis1a214512008-06-11 05:26:20 +00006830 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return
6831 NULL;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006832 if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006833 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00006834 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return
6835 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006836 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006837 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006838 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006839 < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006840 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006841 0) return NULL;
6842 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
6843 NULL;
6844 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return
6845 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006846 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006847 < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006848 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006849 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006850 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006851 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006852 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006853 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006854 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006855 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006856 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006857 0) return NULL;
6858 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return
6859 NULL;
6860 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
6861 NULL;
6862 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
6863 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return
6864 NULL;
6865 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
6866 NULL;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05006867 if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return
6868 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006869 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006870 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006871 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006872 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006873 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006874 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006875 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006876 return NULL;
Jeremy Hylton81e95022007-02-27 06:50:52 +00006877 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006878 return NULL;
6879 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return
6880 NULL;
6881 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return
6882 NULL;
6883 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
6884 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006885 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006886 return NULL;
6887 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return
6888 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006889 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006890 return NULL;
6891 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
6892 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006893 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006894 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006895 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006896 return NULL;
6897 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
6898 NULL;
6899 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return
6900 NULL;
6901 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return
6902 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006903 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006904 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00006905 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006906 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00006907 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006908 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006909 if (PyDict_SetItemString(d, "GeneratorExp",
Martin v. Löwis1a214512008-06-11 05:26:20 +00006910 (PyObject*)GeneratorExp_type) < 0) return NULL;
6911 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
6912 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006913 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006914 return NULL;
6915 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return
6916 NULL;
6917 if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return
6918 NULL;
6919 if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return
6920 NULL;
6921 if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return
6922 NULL;
Georg Brandl52318d62006-09-06 07:06:08 +00006923 if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006924 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006925 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006926 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006927 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006928 0) return NULL;
Guido van Rossum0368b722007-05-11 16:50:42 +00006929 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006930 return NULL;
6931 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return
6932 NULL;
6933 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return
6934 NULL;
6935 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
6936 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006937 if (PyDict_SetItemString(d, "expr_context",
Martin v. Löwis1a214512008-06-11 05:26:20 +00006938 (PyObject*)expr_context_type) < 0) return NULL;
6939 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return
6940 NULL;
6941 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
6942 NULL;
6943 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return
6944 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006945 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006946 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006947 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006948 return NULL;
6949 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
6950 NULL;
6951 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
6952 NULL;
6953 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
6954 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006955 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006956 return NULL;
6957 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
6958 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006959 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006960 return NULL;
6961 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return
6962 NULL;
6963 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006964 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006965 return NULL;
6966 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return
6967 NULL;
6968 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return
6969 NULL;
6970 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return
6971 NULL;
6972 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return
6973 NULL;
6974 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return
6975 NULL;
6976 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return
6977 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006978 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006979 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006980 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006981 return NULL;
6982 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
6983 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006984 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006985 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006986 if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006987 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006988 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006989 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006990 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006991 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006992 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006993 return NULL;
6994 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return
6995 NULL;
6996 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return
6997 NULL;
6998 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return
6999 NULL;
7000 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
7001 NULL;
7002 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
7003 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
7004 NULL;
7005 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
7006 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return
7007 NULL;
7008 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
7009 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return
7010 NULL;
7011 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
7012 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
7013 NULL;
7014 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
7015 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
7016 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007017 if (PyDict_SetItemString(d, "comprehension",
Martin v. Löwis1a214512008-06-11 05:26:20 +00007018 (PyObject*)comprehension_type) < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007019 if (PyDict_SetItemString(d, "excepthandler",
Martin v. Löwis1a214512008-06-11 05:26:20 +00007020 (PyObject*)excepthandler_type) < 0) return NULL;
Neal Norwitzad74aa82008-03-31 05:14:30 +00007021 if (PyDict_SetItemString(d, "ExceptHandler",
Martin v. Löwis1a214512008-06-11 05:26:20 +00007022 (PyObject*)ExceptHandler_type) < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007023 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00007024 0) return NULL;
7025 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return
7026 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007027 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007028 return NULL;
7029 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
7030 NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05007031 if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
7032 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00007033 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00007034}
7035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007036
Martin v. Löwisbd260da2006-02-26 19:42:26 +00007037PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007038{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00007039 init_types();
7040 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007041}
Martin v. Löwis5b222132007-06-10 09:51:05 +00007042
Neal Norwitzdb4115f2008-03-31 04:20:05 +00007043/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
7044mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007045{
7046 mod_ty res;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00007047 PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
7048 (PyObject*)Interactive_type};
7049 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00007050 int isinstance;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00007051 assert(0 <= mode && mode <= 2);
7052
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007053 init_types();
Neal Norwitzdb4115f2008-03-31 04:20:05 +00007054
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00007055 isinstance = PyObject_IsInstance(ast, req_type[mode]);
7056 if (isinstance == -1)
7057 return NULL;
7058 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00007059 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
7060 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007061 return NULL;
7062 }
7063 if (obj2ast_mod(ast, &res, arena) != 0)
7064 return NULL;
7065 else
7066 return res;
7067}
7068
7069int PyAST_Check(PyObject* obj)
7070{
7071 init_types();
Neal Norwitz207c9f32008-03-31 04:42:11 +00007072 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007073}
7074
Martin v. Löwis5b222132007-06-10 09:51:05 +00007075