blob: a276b6cf21b8d17c996e265147c7072359e8004a [file] [log] [blame]
Thomas Wouterscf297e42007-02-23 15:07:44 +00001/* File automatically generated by Parser/asdl_c.py. */
2
3
4/*
Benjamin Petersonefad2442011-07-22 10:39:12 -05005 __version__ 82163.
Thomas Wouterscf297e42007-02-23 15:07:44 +00006
7 This module must be committed separately after each AST grammar change;
8 The __version__ number is set to the revision number of the commit
9 containing the grammar change.
10*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011
12#include "Python.h"
13#include "Python-ast.h"
14
Neal Norwitz207c9f32008-03-31 04:42:11 +000015static PyTypeObject AST_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +000016static PyTypeObject *mod_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +000017static PyObject* ast2obj_mod(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000018static PyTypeObject *Module_type;
19static char *Module_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000020 "body",
21};
Neal Norwitz53d960c2006-02-28 22:47:29 +000022static PyTypeObject *Interactive_type;
23static char *Interactive_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000024 "body",
25};
Neal Norwitz53d960c2006-02-28 22:47:29 +000026static PyTypeObject *Expression_type;
27static char *Expression_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000028 "body",
29};
Neal Norwitz53d960c2006-02-28 22:47:29 +000030static PyTypeObject *Suite_type;
31static char *Suite_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000032 "body",
33};
Neal Norwitz53d960c2006-02-28 22:47:29 +000034static PyTypeObject *stmt_type;
35static char *stmt_attributes[] = {
Martin v. Löwis577b5b92006-02-27 15:23:19 +000036 "lineno",
Martin v. Löwis49c5da12006-03-01 22:49:05 +000037 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +000038};
Martin v. Löwisbd260da2006-02-26 19:42:26 +000039static PyObject* ast2obj_stmt(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +000040static PyTypeObject *FunctionDef_type;
41static char *FunctionDef_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000042 "name",
43 "args",
44 "body",
Guido van Rossumd59da4b2007-05-22 18:11:13 +000045 "decorator_list",
Neal Norwitzc1505362006-12-28 06:47:50 +000046 "returns",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000047};
Neal Norwitz53d960c2006-02-28 22:47:29 +000048static PyTypeObject *ClassDef_type;
49static char *ClassDef_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000050 "name",
51 "bases",
Guido van Rossum52cc1d82007-03-18 15:41:51 +000052 "keywords",
53 "starargs",
54 "kwargs",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000055 "body",
Guido van Rossumd59da4b2007-05-22 18:11:13 +000056 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +000057};
Neal Norwitz53d960c2006-02-28 22:47:29 +000058static PyTypeObject *Return_type;
59static char *Return_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000060 "value",
61};
Neal Norwitz53d960c2006-02-28 22:47:29 +000062static PyTypeObject *Delete_type;
63static char *Delete_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000064 "targets",
65};
Neal Norwitz53d960c2006-02-28 22:47:29 +000066static PyTypeObject *Assign_type;
67static char *Assign_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000068 "targets",
69 "value",
70};
Neal Norwitz53d960c2006-02-28 22:47:29 +000071static PyTypeObject *AugAssign_type;
72static char *AugAssign_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000073 "target",
74 "op",
75 "value",
76};
Neal Norwitz53d960c2006-02-28 22:47:29 +000077static PyTypeObject *For_type;
78static char *For_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000079 "target",
80 "iter",
81 "body",
82 "orelse",
83};
Neal Norwitz53d960c2006-02-28 22:47:29 +000084static PyTypeObject *While_type;
85static char *While_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000086 "test",
87 "body",
88 "orelse",
89};
Neal Norwitz53d960c2006-02-28 22:47:29 +000090static PyTypeObject *If_type;
91static char *If_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +000092 "test",
93 "body",
94 "orelse",
95};
Neal Norwitz53d960c2006-02-28 22:47:29 +000096static PyTypeObject *With_type;
97static char *With_fields[]={
Guido van Rossumc2e20742006-02-27 22:32:47 +000098 "context_expr",
99 "optional_vars",
100 "body",
101};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000102static PyTypeObject *Raise_type;
103static char *Raise_fields[]={
Collin Winter828f04a2007-08-31 00:04:24 +0000104 "exc",
105 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000106};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000107static PyTypeObject *TryExcept_type;
108static char *TryExcept_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000109 "body",
110 "handlers",
111 "orelse",
112};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000113static PyTypeObject *TryFinally_type;
114static char *TryFinally_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000115 "body",
116 "finalbody",
117};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000118static PyTypeObject *Assert_type;
119static char *Assert_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000120 "test",
121 "msg",
122};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000123static PyTypeObject *Import_type;
124static char *Import_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000125 "names",
126};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000127static PyTypeObject *ImportFrom_type;
128static char *ImportFrom_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000129 "module",
130 "names",
Thomas Woutersf7f438b2006-02-28 16:09:29 +0000131 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000132};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000133static PyTypeObject *Global_type;
134static char *Global_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000135 "names",
136};
Jeremy Hylton81e95022007-02-27 06:50:52 +0000137static PyTypeObject *Nonlocal_type;
138static char *Nonlocal_fields[]={
139 "names",
140};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000141static PyTypeObject *Expr_type;
142static char *Expr_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000143 "value",
144};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000145static PyTypeObject *Pass_type;
146static PyTypeObject *Break_type;
147static PyTypeObject *Continue_type;
148static PyTypeObject *expr_type;
149static char *expr_attributes[] = {
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000150 "lineno",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000151 "col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000152};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000153static PyObject* ast2obj_expr(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000154static PyTypeObject *BoolOp_type;
155static char *BoolOp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000156 "op",
157 "values",
158};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000159static PyTypeObject *BinOp_type;
160static char *BinOp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000161 "left",
162 "op",
163 "right",
164};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000165static PyTypeObject *UnaryOp_type;
166static char *UnaryOp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000167 "op",
168 "operand",
169};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000170static PyTypeObject *Lambda_type;
171static char *Lambda_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000172 "args",
173 "body",
174};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000175static PyTypeObject *IfExp_type;
176static char *IfExp_fields[]={
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000177 "test",
178 "body",
179 "orelse",
180};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000181static PyTypeObject *Dict_type;
182static char *Dict_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000183 "keys",
184 "values",
185};
Guido van Rossum86e58e22006-08-28 15:27:34 +0000186static PyTypeObject *Set_type;
187static char *Set_fields[]={
188 "elts",
189};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000190static PyTypeObject *ListComp_type;
191static char *ListComp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000192 "elt",
193 "generators",
194};
Nick Coghlan650f0d02007-04-15 12:05:43 +0000195static PyTypeObject *SetComp_type;
196static char *SetComp_fields[]={
197 "elt",
198 "generators",
199};
Guido van Rossum992d4a32007-07-11 13:09:30 +0000200static PyTypeObject *DictComp_type;
201static char *DictComp_fields[]={
202 "key",
203 "value",
204 "generators",
205};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000206static PyTypeObject *GeneratorExp_type;
207static char *GeneratorExp_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000208 "elt",
209 "generators",
210};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000211static PyTypeObject *Yield_type;
212static char *Yield_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000213 "value",
214};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000215static PyTypeObject *Compare_type;
216static char *Compare_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000217 "left",
218 "ops",
219 "comparators",
220};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000221static PyTypeObject *Call_type;
222static char *Call_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000223 "func",
224 "args",
225 "keywords",
226 "starargs",
227 "kwargs",
228};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000229static PyTypeObject *Num_type;
230static char *Num_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000231 "n",
232};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000233static PyTypeObject *Str_type;
234static char *Str_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000235 "s",
236};
Thomas Wouters00e41de2007-02-23 19:56:57 +0000237static PyTypeObject *Bytes_type;
238static char *Bytes_fields[]={
239 "s",
240};
Georg Brandl52318d62006-09-06 07:06:08 +0000241static PyTypeObject *Ellipsis_type;
Neal Norwitz53d960c2006-02-28 22:47:29 +0000242static PyTypeObject *Attribute_type;
243static char *Attribute_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000244 "value",
245 "attr",
246 "ctx",
247};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000248static PyTypeObject *Subscript_type;
249static char *Subscript_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000250 "value",
251 "slice",
252 "ctx",
253};
Guido van Rossum0368b722007-05-11 16:50:42 +0000254static PyTypeObject *Starred_type;
255static char *Starred_fields[]={
256 "value",
257 "ctx",
258};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000259static PyTypeObject *Name_type;
260static char *Name_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000261 "id",
262 "ctx",
263};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000264static PyTypeObject *List_type;
265static char *List_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000266 "elts",
267 "ctx",
268};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000269static PyTypeObject *Tuple_type;
270static char *Tuple_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000271 "elts",
272 "ctx",
273};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000274static PyTypeObject *expr_context_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000275static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
276*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
277static PyObject* ast2obj_expr_context(expr_context_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000278static PyTypeObject *Load_type;
279static PyTypeObject *Store_type;
280static PyTypeObject *Del_type;
281static PyTypeObject *AugLoad_type;
282static PyTypeObject *AugStore_type;
283static PyTypeObject *Param_type;
284static PyTypeObject *slice_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000285static PyObject* ast2obj_slice(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000286static PyTypeObject *Slice_type;
287static char *Slice_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000288 "lower",
289 "upper",
290 "step",
291};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000292static PyTypeObject *ExtSlice_type;
293static char *ExtSlice_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000294 "dims",
295};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000296static PyTypeObject *Index_type;
297static char *Index_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000298 "value",
299};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000300static PyTypeObject *boolop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000301static PyObject *And_singleton, *Or_singleton;
302static PyObject* ast2obj_boolop(boolop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000303static PyTypeObject *And_type;
304static PyTypeObject *Or_type;
305static PyTypeObject *operator_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000306static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
307*Div_singleton, *Mod_singleton, *Pow_singleton, *LShift_singleton,
308*RShift_singleton, *BitOr_singleton, *BitXor_singleton, *BitAnd_singleton,
309*FloorDiv_singleton;
310static PyObject* ast2obj_operator(operator_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000311static PyTypeObject *Add_type;
312static PyTypeObject *Sub_type;
313static PyTypeObject *Mult_type;
314static PyTypeObject *Div_type;
315static PyTypeObject *Mod_type;
316static PyTypeObject *Pow_type;
317static PyTypeObject *LShift_type;
318static PyTypeObject *RShift_type;
319static PyTypeObject *BitOr_type;
320static PyTypeObject *BitXor_type;
321static PyTypeObject *BitAnd_type;
322static PyTypeObject *FloorDiv_type;
323static PyTypeObject *unaryop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000324static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
325*USub_singleton;
326static PyObject* ast2obj_unaryop(unaryop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000327static PyTypeObject *Invert_type;
328static PyTypeObject *Not_type;
329static PyTypeObject *UAdd_type;
330static PyTypeObject *USub_type;
331static PyTypeObject *cmpop_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000332static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
333*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
334*NotIn_singleton;
335static PyObject* ast2obj_cmpop(cmpop_ty);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000336static PyTypeObject *Eq_type;
337static PyTypeObject *NotEq_type;
338static PyTypeObject *Lt_type;
339static PyTypeObject *LtE_type;
340static PyTypeObject *Gt_type;
341static PyTypeObject *GtE_type;
342static PyTypeObject *Is_type;
343static PyTypeObject *IsNot_type;
344static PyTypeObject *In_type;
345static PyTypeObject *NotIn_type;
346static PyTypeObject *comprehension_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000347static PyObject* ast2obj_comprehension(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000348static char *comprehension_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000349 "target",
350 "iter",
351 "ifs",
352};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000353static PyTypeObject *excepthandler_type;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000354static char *excepthandler_attributes[] = {
355 "lineno",
356 "col_offset",
357};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000358static PyObject* ast2obj_excepthandler(void*);
Neal Norwitzad74aa82008-03-31 05:14:30 +0000359static PyTypeObject *ExceptHandler_type;
360static char *ExceptHandler_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000361 "type",
362 "name",
363 "body",
364};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000365static PyTypeObject *arguments_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000366static PyObject* ast2obj_arguments(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000367static char *arguments_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000368 "args",
369 "vararg",
Neal Norwitzc1505362006-12-28 06:47:50 +0000370 "varargannotation",
Guido van Rossum4f72a782006-10-27 23:31:49 +0000371 "kwonlyargs",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000372 "kwarg",
Neal Norwitzc1505362006-12-28 06:47:50 +0000373 "kwargannotation",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000374 "defaults",
Guido van Rossum4f72a782006-10-27 23:31:49 +0000375 "kw_defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000376};
Neal Norwitzc1505362006-12-28 06:47:50 +0000377static PyTypeObject *arg_type;
378static PyObject* ast2obj_arg(void*);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000379static char *arg_fields[]={
Neal Norwitzc1505362006-12-28 06:47:50 +0000380 "arg",
381 "annotation",
382};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000383static PyTypeObject *keyword_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000384static PyObject* ast2obj_keyword(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000385static char *keyword_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000386 "arg",
387 "value",
388};
Neal Norwitz53d960c2006-02-28 22:47:29 +0000389static PyTypeObject *alias_type;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000390static PyObject* ast2obj_alias(void*);
Neal Norwitz53d960c2006-02-28 22:47:29 +0000391static char *alias_fields[]={
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000392 "name",
393 "asname",
394};
395
396
Neal Norwitz207c9f32008-03-31 04:42:11 +0000397static int
398ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
399{
400 Py_ssize_t i, numfields = 0;
401 int res = -1;
402 PyObject *key, *value, *fields;
403 fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields");
404 if (!fields)
405 PyErr_Clear();
406 if (fields) {
407 numfields = PySequence_Size(fields);
408 if (numfields == -1)
409 goto cleanup;
410 }
411 res = 0; /* if no error occurs, this stays 0 to the end */
412 if (PyTuple_GET_SIZE(args) > 0) {
413 if (numfields != PyTuple_GET_SIZE(args)) {
414 PyErr_Format(PyExc_TypeError, "%.400s constructor takes %s"
Amaury Forgeot d'Arc245c70b2008-09-10 22:24:24 +0000415 "%zd positional argument%s",
Neal Norwitz207c9f32008-03-31 04:42:11 +0000416 Py_TYPE(self)->tp_name,
417 numfields == 0 ? "" : "either 0 or ",
418 numfields, numfields == 1 ? "" : "s");
419 res = -1;
420 goto cleanup;
421 }
422 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
423 /* cannot be reached when fields is NULL */
424 PyObject *name = PySequence_GetItem(fields, i);
425 if (!name) {
426 res = -1;
427 goto cleanup;
428 }
429 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
430 Py_DECREF(name);
431 if (res < 0)
432 goto cleanup;
433 }
434 }
435 if (kw) {
436 i = 0; /* needed by PyDict_Next */
437 while (PyDict_Next(kw, &i, &key, &value)) {
438 res = PyObject_SetAttr(self, key, value);
439 if (res < 0)
440 goto cleanup;
441 }
442 }
443 cleanup:
444 Py_XDECREF(fields);
445 return res;
446}
447
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000448/* Pickling support */
449static PyObject *
450ast_type_reduce(PyObject *self, PyObject *unused)
451{
452 PyObject *res;
453 PyObject *dict = PyObject_GetAttrString(self, "__dict__");
454 if (dict == NULL) {
455 if (PyErr_ExceptionMatches(PyExc_AttributeError))
456 PyErr_Clear();
457 else
458 return NULL;
459 }
460 if (dict) {
461 res = Py_BuildValue("O()O", Py_TYPE(self), dict);
462 Py_DECREF(dict);
463 return res;
464 }
465 return Py_BuildValue("O()", Py_TYPE(self));
466}
467
468static PyMethodDef ast_type_methods[] = {
469 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
470 {NULL}
471};
472
Neal Norwitz207c9f32008-03-31 04:42:11 +0000473static PyTypeObject AST_type = {
474 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000475 "_ast.AST",
Neal Norwitz207c9f32008-03-31 04:42:11 +0000476 sizeof(PyObject),
477 0,
478 0, /* tp_dealloc */
479 0, /* tp_print */
480 0, /* tp_getattr */
481 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000482 0, /* tp_reserved */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000483 0, /* tp_repr */
484 0, /* tp_as_number */
485 0, /* tp_as_sequence */
486 0, /* tp_as_mapping */
487 0, /* tp_hash */
488 0, /* tp_call */
489 0, /* tp_str */
490 PyObject_GenericGetAttr, /* tp_getattro */
491 PyObject_GenericSetAttr, /* tp_setattro */
492 0, /* tp_as_buffer */
493 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
494 0, /* tp_doc */
495 0, /* tp_traverse */
496 0, /* tp_clear */
497 0, /* tp_richcompare */
498 0, /* tp_weaklistoffset */
499 0, /* tp_iter */
500 0, /* tp_iternext */
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000501 ast_type_methods, /* tp_methods */
Neal Norwitz207c9f32008-03-31 04:42:11 +0000502 0, /* tp_members */
503 0, /* tp_getset */
504 0, /* tp_base */
505 0, /* tp_dict */
506 0, /* tp_descr_get */
507 0, /* tp_descr_set */
508 0, /* tp_dictoffset */
509 (initproc)ast_type_init, /* tp_init */
510 PyType_GenericAlloc, /* tp_alloc */
511 PyType_GenericNew, /* tp_new */
512 PyObject_Del, /* tp_free */
513};
514
515
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000516static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
517{
518 PyObject *fnames, *result;
519 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000520 fnames = PyTuple_New(num_fields);
521 if (!fnames) return NULL;
522 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000523 PyObject *field = PyUnicode_FromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000524 if (!field) {
525 Py_DECREF(fnames);
526 return NULL;
527 }
528 PyTuple_SET_ITEM(fnames, i, field);
529 }
Victor Stinner7eeb5b52010-06-07 19:57:46 +0000530 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){sOss}",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000531 type, base, "_fields", fnames, "__module__", "_ast");
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000532 Py_DECREF(fnames);
533 return (PyTypeObject*)result;
534}
535
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000536static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
537{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000538 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000539 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000540 if (!l)
541 return 0;
542 for (i = 0; i < num_fields; i++) {
Neal Norwitze4dc3242007-08-25 01:33:49 +0000543 s = PyUnicode_FromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000544 if (!s) {
545 Py_DECREF(l);
546 return 0;
547 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000548 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000549 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550 result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0;
551 Py_DECREF(l);
552 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000553}
554
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000555/* Conversion AST -> Python */
556
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000557static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
558{
559 int i, n = asdl_seq_LEN(seq);
560 PyObject *result = PyList_New(n);
561 PyObject *value;
562 if (!result)
563 return NULL;
564 for (i = 0; i < n; i++) {
565 value = func(asdl_seq_GET(seq, i));
566 if (!value) {
567 Py_DECREF(result);
568 return NULL;
569 }
570 PyList_SET_ITEM(result, i, value);
571 }
572 return result;
573}
574
575static PyObject* ast2obj_object(void *o)
576{
577 if (!o)
578 o = Py_None;
579 Py_INCREF((PyObject*)o);
580 return (PyObject*)o;
581}
582#define ast2obj_identifier ast2obj_object
583#define ast2obj_string ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000584
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000585static PyObject* ast2obj_int(long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000586{
Christian Heimes217cfd12007-12-02 14:31:20 +0000587 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000588}
589
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000590/* Conversion Python -> AST */
591
592static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
593{
594 if (obj == Py_None)
595 obj = NULL;
596 if (obj)
597 PyArena_AddPyObject(arena, obj);
598 Py_XINCREF(obj);
599 *out = obj;
600 return 0;
601}
602
Benjamin Peterson180e6352011-07-22 11:09:07 -0500603static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500604{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500605 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
606 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500607 return 1;
608 }
609 return obj2ast_object(obj, out, arena);
610}
611
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500612static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
613{
Benjamin Peterson0224d4e2011-08-31 22:13:03 -0400614 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
Benjamin Peterson180e6352011-07-22 11:09:07 -0500615 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
616 return 1;
617 }
618 return obj2ast_object(obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500619}
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000620
621static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
622{
623 int i;
624 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +0100625 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000626 return 1;
627 }
628
629 i = (int)PyLong_AsLong(obj);
630 if (i == -1 && PyErr_Occurred())
631 return 1;
632 *out = i;
633 return 0;
634}
635
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000636static int add_ast_fields(void)
Benjamin Petersonce825f12008-10-24 23:11:02 +0000637{
638 PyObject *empty_tuple, *d;
639 if (PyType_Ready(&AST_type) < 0)
640 return -1;
641 d = AST_type.tp_dict;
642 empty_tuple = PyTuple_New(0);
643 if (!empty_tuple ||
644 PyDict_SetItemString(d, "_fields", empty_tuple) < 0 ||
645 PyDict_SetItemString(d, "_attributes", empty_tuple) < 0) {
646 Py_XDECREF(empty_tuple);
647 return -1;
648 }
649 Py_DECREF(empty_tuple);
650 return 0;
651}
652
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000653
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000654static int init_types(void)
655{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000656 static int initialized;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000657 if (initialized) return 1;
Benjamin Petersonce825f12008-10-24 23:11:02 +0000658 if (add_ast_fields() < 0) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000659 mod_type = make_type("mod", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000660 if (!mod_type) return 0;
661 if (!add_attributes(mod_type, NULL, 0)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000662 Module_type = make_type("Module", mod_type, Module_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000663 if (!Module_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000664 Interactive_type = make_type("Interactive", mod_type,
665 Interactive_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000666 if (!Interactive_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000667 Expression_type = make_type("Expression", mod_type, Expression_fields,
668 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000669 if (!Expression_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000670 Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000671 if (!Suite_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000672 stmt_type = make_type("stmt", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000673 if (!stmt_type) return 0;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000674 if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000675 FunctionDef_type = make_type("FunctionDef", stmt_type,
Neal Norwitzc1505362006-12-28 06:47:50 +0000676 FunctionDef_fields, 5);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000677 if (!FunctionDef_type) return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000678 ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 7);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000679 if (!ClassDef_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000680 Return_type = make_type("Return", stmt_type, Return_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000681 if (!Return_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000682 Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000683 if (!Delete_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000684 Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000685 if (!Assign_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000686 AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000687 if (!AugAssign_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000688 For_type = make_type("For", stmt_type, For_fields, 4);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000689 if (!For_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000690 While_type = make_type("While", stmt_type, While_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000691 if (!While_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000692 If_type = make_type("If", stmt_type, If_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000693 if (!If_type) return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000694 With_type = make_type("With", stmt_type, With_fields, 3);
695 if (!With_type) return 0;
Collin Winter828f04a2007-08-31 00:04:24 +0000696 Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000697 if (!Raise_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000698 TryExcept_type = make_type("TryExcept", stmt_type, TryExcept_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000699 if (!TryExcept_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000700 TryFinally_type = make_type("TryFinally", stmt_type, TryFinally_fields,
701 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000702 if (!TryFinally_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000703 Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000704 if (!Assert_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000705 Import_type = make_type("Import", stmt_type, Import_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000706 if (!Import_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000707 ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields,
Thomas Woutersf7f438b2006-02-28 16:09:29 +0000708 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000709 if (!ImportFrom_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000710 Global_type = make_type("Global", stmt_type, Global_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000711 if (!Global_type) return 0;
Jeremy Hylton81e95022007-02-27 06:50:52 +0000712 Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
713 if (!Nonlocal_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000714 Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000715 if (!Expr_type) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000716 Pass_type = make_type("Pass", stmt_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000717 if (!Pass_type) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000718 Break_type = make_type("Break", stmt_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000719 if (!Break_type) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000720 Continue_type = make_type("Continue", stmt_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000721 if (!Continue_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000722 expr_type = make_type("expr", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000723 if (!expr_type) return 0;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000724 if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000725 BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000726 if (!BoolOp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000727 BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000728 if (!BinOp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000729 UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000730 if (!UnaryOp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000731 Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000732 if (!Lambda_type) return 0;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000733 IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000734 if (!IfExp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000735 Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000736 if (!Dict_type) return 0;
Guido van Rossum86e58e22006-08-28 15:27:34 +0000737 Set_type = make_type("Set", expr_type, Set_fields, 1);
738 if (!Set_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000739 ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000740 if (!ListComp_type) return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000741 SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
742 if (!SetComp_type) return 0;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000743 DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
744 if (!DictComp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000745 GeneratorExp_type = make_type("GeneratorExp", expr_type,
746 GeneratorExp_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000747 if (!GeneratorExp_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000748 Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000749 if (!Yield_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000750 Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000751 if (!Compare_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000752 Call_type = make_type("Call", expr_type, Call_fields, 5);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000753 if (!Call_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000754 Num_type = make_type("Num", expr_type, Num_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000755 if (!Num_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000756 Str_type = make_type("Str", expr_type, Str_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000757 if (!Str_type) return 0;
Thomas Wouters00e41de2007-02-23 19:56:57 +0000758 Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);
759 if (!Bytes_type) return 0;
Georg Brandl52318d62006-09-06 07:06:08 +0000760 Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);
761 if (!Ellipsis_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000762 Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000763 if (!Attribute_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000764 Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000765 if (!Subscript_type) return 0;
Guido van Rossum0368b722007-05-11 16:50:42 +0000766 Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
767 if (!Starred_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000768 Name_type = make_type("Name", expr_type, Name_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000769 if (!Name_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000770 List_type = make_type("List", expr_type, List_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000771 if (!List_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000772 Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000773 if (!Tuple_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000774 expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000775 if (!expr_context_type) return 0;
776 if (!add_attributes(expr_context_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000777 Load_type = make_type("Load", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000778 if (!Load_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000779 Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000780 if (!Load_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000781 Store_type = make_type("Store", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000782 if (!Store_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000783 Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000784 if (!Store_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000785 Del_type = make_type("Del", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000786 if (!Del_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000787 Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000788 if (!Del_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000789 AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000790 if (!AugLoad_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000791 AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000792 if (!AugLoad_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000793 AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000794 if (!AugStore_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000795 AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000796 if (!AugStore_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000797 Param_type = make_type("Param", expr_context_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000798 if (!Param_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000799 Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000800 if (!Param_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000801 slice_type = make_type("slice", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000802 if (!slice_type) return 0;
803 if (!add_attributes(slice_type, NULL, 0)) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000804 Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000805 if (!Slice_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000806 ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000807 if (!ExtSlice_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000808 Index_type = make_type("Index", slice_type, Index_fields, 1);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000809 if (!Index_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000810 boolop_type = make_type("boolop", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000811 if (!boolop_type) return 0;
812 if (!add_attributes(boolop_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000813 And_type = make_type("And", boolop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000814 if (!And_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000815 And_singleton = PyType_GenericNew(And_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000816 if (!And_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000817 Or_type = make_type("Or", boolop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000818 if (!Or_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000819 Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000820 if (!Or_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000821 operator_type = make_type("operator", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000822 if (!operator_type) return 0;
823 if (!add_attributes(operator_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000824 Add_type = make_type("Add", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000825 if (!Add_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000826 Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000827 if (!Add_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000828 Sub_type = make_type("Sub", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000829 if (!Sub_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000830 Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000831 if (!Sub_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000832 Mult_type = make_type("Mult", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000833 if (!Mult_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000834 Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000835 if (!Mult_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000836 Div_type = make_type("Div", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000837 if (!Div_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000838 Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000839 if (!Div_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000840 Mod_type = make_type("Mod", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000841 if (!Mod_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000842 Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000843 if (!Mod_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000844 Pow_type = make_type("Pow", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000845 if (!Pow_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000846 Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000847 if (!Pow_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000848 LShift_type = make_type("LShift", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000849 if (!LShift_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000850 LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000851 if (!LShift_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000852 RShift_type = make_type("RShift", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000853 if (!RShift_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000854 RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000855 if (!RShift_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000856 BitOr_type = make_type("BitOr", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000857 if (!BitOr_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000858 BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000859 if (!BitOr_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000860 BitXor_type = make_type("BitXor", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000861 if (!BitXor_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000862 BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000863 if (!BitXor_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000864 BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000865 if (!BitAnd_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000866 BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000867 if (!BitAnd_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000868 FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000869 if (!FloorDiv_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000870 FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000871 if (!FloorDiv_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000872 unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000873 if (!unaryop_type) return 0;
874 if (!add_attributes(unaryop_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000875 Invert_type = make_type("Invert", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000876 if (!Invert_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000877 Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000878 if (!Invert_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000879 Not_type = make_type("Not", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000880 if (!Not_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000881 Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000882 if (!Not_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000883 UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000884 if (!UAdd_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000885 UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000886 if (!UAdd_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000887 USub_type = make_type("USub", unaryop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000888 if (!USub_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000889 USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000890 if (!USub_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000891 cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000892 if (!cmpop_type) return 0;
893 if (!add_attributes(cmpop_type, NULL, 0)) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000894 Eq_type = make_type("Eq", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000895 if (!Eq_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000896 Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000897 if (!Eq_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000898 NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000899 if (!NotEq_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000900 NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000901 if (!NotEq_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000902 Lt_type = make_type("Lt", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000903 if (!Lt_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000904 Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000905 if (!Lt_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000906 LtE_type = make_type("LtE", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000907 if (!LtE_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000908 LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000909 if (!LtE_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000910 Gt_type = make_type("Gt", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000911 if (!Gt_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000912 Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000913 if (!Gt_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000914 GtE_type = make_type("GtE", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000915 if (!GtE_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000916 GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000917 if (!GtE_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000918 Is_type = make_type("Is", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000919 if (!Is_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000920 Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000921 if (!Is_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000922 IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000923 if (!IsNot_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000924 IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000925 if (!IsNot_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000926 In_type = make_type("In", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000927 if (!In_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000928 In_singleton = PyType_GenericNew(In_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000929 if (!In_singleton) return 0;
Martin v. Löwis8d0701d2006-02-26 23:40:20 +0000930 NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000931 if (!NotIn_type) return 0;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000932 NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000933 if (!NotIn_singleton) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000934 comprehension_type = make_type("comprehension", &AST_type,
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000935 comprehension_fields, 3);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000936 if (!comprehension_type) return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000937 excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000938 if (!excepthandler_type) return 0;
Neal Norwitzad74aa82008-03-31 05:14:30 +0000939 if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
940 return 0;
941 ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
942 ExceptHandler_fields, 3);
943 if (!ExceptHandler_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000944 arguments_type = make_type("arguments", &AST_type, arguments_fields, 8);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000945 if (!arguments_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000946 arg_type = make_type("arg", &AST_type, arg_fields, 2);
Neal Norwitzc1505362006-12-28 06:47:50 +0000947 if (!arg_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000948 keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000949 if (!keyword_type) return 0;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000950 alias_type = make_type("alias", &AST_type, alias_fields, 2);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000951 if (!alias_type) return 0;
952 initialized = 1;
953 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000954}
Neal Norwitz7b5a6042005-11-13 19:14:20 +0000955
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000956static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
957static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
958static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
959static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
960 arena);
961static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
962static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
963static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
964static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
965static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
966static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
967 arena);
968static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
969 arena);
970static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
971static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
972static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
973static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
974
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000976Module(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977{
978 mod_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000979 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000980 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 p->kind = Module_kind;
983 p->v.Module.body = body;
984 return p;
985}
986
987mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000988Interactive(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989{
990 mod_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000991 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +0000992 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994 p->kind = Interactive_kind;
995 p->v.Interactive.body = body;
996 return p;
997}
998
999mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001000Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001{
1002 mod_ty p;
1003 if (!body) {
1004 PyErr_SetString(PyExc_ValueError,
1005 "field body is required for Expression");
1006 return NULL;
1007 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001008 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001009 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 p->kind = Expression_kind;
1012 p->v.Expression.body = body;
1013 return p;
1014}
1015
1016mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001017Suite(asdl_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018{
1019 mod_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001020 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001021 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023 p->kind = Suite_kind;
1024 p->v.Suite.body = body;
1025 return p;
1026}
1027
1028stmt_ty
1029FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001030 decorator_list, expr_ty returns, int lineno, int col_offset,
1031 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032{
1033 stmt_ty p;
1034 if (!name) {
1035 PyErr_SetString(PyExc_ValueError,
1036 "field name is required for FunctionDef");
1037 return NULL;
1038 }
1039 if (!args) {
1040 PyErr_SetString(PyExc_ValueError,
1041 "field args is required for FunctionDef");
1042 return NULL;
1043 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001044 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001045 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047 p->kind = FunctionDef_kind;
1048 p->v.FunctionDef.name = name;
1049 p->v.FunctionDef.args = args;
1050 p->v.FunctionDef.body = body;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001051 p->v.FunctionDef.decorator_list = decorator_list;
Neal Norwitzc1505362006-12-28 06:47:50 +00001052 p->v.FunctionDef.returns = returns;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001054 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055 return p;
1056}
1057
1058stmt_ty
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001059ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, expr_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001060 starargs, expr_ty kwargs, asdl_seq * body, asdl_seq * decorator_list,
1061 int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001062{
1063 stmt_ty p;
1064 if (!name) {
1065 PyErr_SetString(PyExc_ValueError,
1066 "field name is required for ClassDef");
1067 return NULL;
1068 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001069 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001070 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 p->kind = ClassDef_kind;
1073 p->v.ClassDef.name = name;
1074 p->v.ClassDef.bases = bases;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001075 p->v.ClassDef.keywords = keywords;
1076 p->v.ClassDef.starargs = starargs;
1077 p->v.ClassDef.kwargs = kwargs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078 p->v.ClassDef.body = body;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001079 p->v.ClassDef.decorator_list = decorator_list;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001081 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 return p;
1083}
1084
1085stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001086Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001087{
1088 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001089 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001090 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 p->kind = Return_kind;
1093 p->v.Return.value = value;
1094 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001095 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096 return p;
1097}
1098
1099stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001100Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101{
1102 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001103 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001104 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106 p->kind = Delete_kind;
1107 p->v.Delete.targets = targets;
1108 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001109 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110 return p;
1111}
1112
1113stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001114Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1115 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116{
1117 stmt_ty p;
1118 if (!value) {
1119 PyErr_SetString(PyExc_ValueError,
1120 "field value is required for Assign");
1121 return NULL;
1122 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001123 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001124 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001126 p->kind = Assign_kind;
1127 p->v.Assign.targets = targets;
1128 p->v.Assign.value = value;
1129 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001130 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 return p;
1132}
1133
1134stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001135AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1136 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137{
1138 stmt_ty p;
1139 if (!target) {
1140 PyErr_SetString(PyExc_ValueError,
1141 "field target is required for AugAssign");
1142 return NULL;
1143 }
1144 if (!op) {
1145 PyErr_SetString(PyExc_ValueError,
1146 "field op is required for AugAssign");
1147 return NULL;
1148 }
1149 if (!value) {
1150 PyErr_SetString(PyExc_ValueError,
1151 "field value is required for AugAssign");
1152 return NULL;
1153 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001154 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001155 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 p->kind = AugAssign_kind;
1158 p->v.AugAssign.target = target;
1159 p->v.AugAssign.op = op;
1160 p->v.AugAssign.value = value;
1161 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001162 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163 return p;
1164}
1165
1166stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001168 lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169{
1170 stmt_ty p;
1171 if (!target) {
1172 PyErr_SetString(PyExc_ValueError,
1173 "field target is required for For");
1174 return NULL;
1175 }
1176 if (!iter) {
1177 PyErr_SetString(PyExc_ValueError,
1178 "field iter is required for For");
1179 return NULL;
1180 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001181 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001182 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 p->kind = For_kind;
1185 p->v.For.target = target;
1186 p->v.For.iter = iter;
1187 p->v.For.body = body;
1188 p->v.For.orelse = orelse;
1189 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001190 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 return p;
1192}
1193
1194stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001195While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1196 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197{
1198 stmt_ty p;
1199 if (!test) {
1200 PyErr_SetString(PyExc_ValueError,
1201 "field test is required for While");
1202 return NULL;
1203 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001204 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001205 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 p->kind = While_kind;
1208 p->v.While.test = test;
1209 p->v.While.body = body;
1210 p->v.While.orelse = orelse;
1211 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001212 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 return p;
1214}
1215
1216stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001217If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1218 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219{
1220 stmt_ty p;
1221 if (!test) {
1222 PyErr_SetString(PyExc_ValueError,
1223 "field test is required for If");
1224 return NULL;
1225 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001226 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001227 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 p->kind = If_kind;
1230 p->v.If.test = test;
1231 p->v.If.body = body;
1232 p->v.If.orelse = orelse;
1233 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001234 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 return p;
1236}
1237
1238stmt_ty
Guido van Rossumc2e20742006-02-27 22:32:47 +00001239With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int lineno,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001240 int col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001241{
1242 stmt_ty p;
1243 if (!context_expr) {
1244 PyErr_SetString(PyExc_ValueError,
1245 "field context_expr is required for With");
1246 return NULL;
1247 }
1248 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001249 if (!p)
Guido van Rossumc2e20742006-02-27 22:32:47 +00001250 return NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001251 p->kind = With_kind;
1252 p->v.With.context_expr = context_expr;
1253 p->v.With.optional_vars = optional_vars;
1254 p->v.With.body = body;
1255 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001256 p->col_offset = col_offset;
Guido van Rossumc2e20742006-02-27 22:32:47 +00001257 return p;
1258}
1259
1260stmt_ty
Collin Winter828f04a2007-08-31 00:04:24 +00001261Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262{
1263 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001264 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001265 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 p->kind = Raise_kind;
Collin Winter828f04a2007-08-31 00:04:24 +00001268 p->v.Raise.exc = exc;
1269 p->v.Raise.cause = cause;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001270 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001271 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 return p;
1273}
1274
1275stmt_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001276TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001277 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278{
1279 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001280 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001281 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001282 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 p->kind = TryExcept_kind;
1284 p->v.TryExcept.body = body;
1285 p->v.TryExcept.handlers = handlers;
1286 p->v.TryExcept.orelse = orelse;
1287 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001288 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289 return p;
1290}
1291
1292stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001293TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int col_offset,
1294 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001295{
1296 stmt_ty p;
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 = TryFinally_kind;
1301 p->v.TryFinally.body = body;
1302 p->v.TryFinally.finalbody = finalbody;
1303 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001304 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 return p;
1306}
1307
1308stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001309Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310{
1311 stmt_ty p;
1312 if (!test) {
1313 PyErr_SetString(PyExc_ValueError,
1314 "field test is required for Assert");
1315 return NULL;
1316 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001317 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001318 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001320 p->kind = Assert_kind;
1321 p->v.Assert.test = test;
1322 p->v.Assert.msg = msg;
1323 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001324 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001325 return p;
1326}
1327
1328stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001329Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330{
1331 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001332 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001333 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 p->kind = Import_kind;
1336 p->v.Import.names = names;
1337 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001338 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001339 return p;
1340}
1341
1342stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001343ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1344 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001345{
1346 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001347 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001348 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350 p->kind = ImportFrom_kind;
1351 p->v.ImportFrom.module = module;
1352 p->v.ImportFrom.names = names;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001353 p->v.ImportFrom.level = level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001355 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 return p;
1357}
1358
1359stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001360Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361{
1362 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001363 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001364 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 p->kind = Global_kind;
1367 p->v.Global.names = names;
1368 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001369 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 return p;
1371}
1372
1373stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00001374Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1375{
1376 stmt_ty p;
1377 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1378 if (!p)
1379 return NULL;
1380 p->kind = Nonlocal_kind;
1381 p->v.Nonlocal.names = names;
1382 p->lineno = lineno;
1383 p->col_offset = col_offset;
1384 return p;
1385}
1386
1387stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001388Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389{
1390 stmt_ty p;
1391 if (!value) {
1392 PyErr_SetString(PyExc_ValueError,
1393 "field value is required for Expr");
1394 return NULL;
1395 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001396 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001397 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 p->kind = Expr_kind;
1400 p->v.Expr.value = value;
1401 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001402 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403 return p;
1404}
1405
1406stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001407Pass(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001408{
1409 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001410 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001411 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 p->kind = Pass_kind;
1414 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001415 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 return p;
1417}
1418
1419stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001420Break(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421{
1422 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001423 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001424 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426 p->kind = Break_kind;
1427 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001428 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429 return p;
1430}
1431
1432stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001433Continue(int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434{
1435 stmt_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001436 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001437 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 p->kind = Continue_kind;
1440 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001441 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442 return p;
1443}
1444
1445expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001446BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1447 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448{
1449 expr_ty p;
1450 if (!op) {
1451 PyErr_SetString(PyExc_ValueError,
1452 "field op is required for BoolOp");
1453 return NULL;
1454 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001455 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001456 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 p->kind = BoolOp_kind;
1459 p->v.BoolOp.op = op;
1460 p->v.BoolOp.values = values;
1461 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001462 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 return p;
1464}
1465
1466expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001467BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1468 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469{
1470 expr_ty p;
1471 if (!left) {
1472 PyErr_SetString(PyExc_ValueError,
1473 "field left is required for BinOp");
1474 return NULL;
1475 }
1476 if (!op) {
1477 PyErr_SetString(PyExc_ValueError,
1478 "field op is required for BinOp");
1479 return NULL;
1480 }
1481 if (!right) {
1482 PyErr_SetString(PyExc_ValueError,
1483 "field right is required for BinOp");
1484 return NULL;
1485 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001486 p = (expr_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 = BinOp_kind;
1490 p->v.BinOp.left = left;
1491 p->v.BinOp.op = op;
1492 p->v.BinOp.right = right;
1493 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001494 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 return p;
1496}
1497
1498expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001499UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1500 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501{
1502 expr_ty p;
1503 if (!op) {
1504 PyErr_SetString(PyExc_ValueError,
1505 "field op is required for UnaryOp");
1506 return NULL;
1507 }
1508 if (!operand) {
1509 PyErr_SetString(PyExc_ValueError,
1510 "field operand is required for UnaryOp");
1511 return NULL;
1512 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001513 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001514 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516 p->kind = UnaryOp_kind;
1517 p->v.UnaryOp.op = op;
1518 p->v.UnaryOp.operand = operand;
1519 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001520 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 return p;
1522}
1523
1524expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001525Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
1526 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527{
1528 expr_ty p;
1529 if (!args) {
1530 PyErr_SetString(PyExc_ValueError,
1531 "field args is required for Lambda");
1532 return NULL;
1533 }
1534 if (!body) {
1535 PyErr_SetString(PyExc_ValueError,
1536 "field body is required for Lambda");
1537 return NULL;
1538 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001539 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001540 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542 p->kind = Lambda_kind;
1543 p->v.Lambda.args = args;
1544 p->v.Lambda.body = body;
1545 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001546 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547 return p;
1548}
1549
1550expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001551IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1552 PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001553{
1554 expr_ty p;
1555 if (!test) {
1556 PyErr_SetString(PyExc_ValueError,
1557 "field test is required for IfExp");
1558 return NULL;
1559 }
1560 if (!body) {
1561 PyErr_SetString(PyExc_ValueError,
1562 "field body is required for IfExp");
1563 return NULL;
1564 }
1565 if (!orelse) {
1566 PyErr_SetString(PyExc_ValueError,
1567 "field orelse is required for IfExp");
1568 return NULL;
1569 }
1570 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001571 if (!p)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001572 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001573 p->kind = IfExp_kind;
1574 p->v.IfExp.test = test;
1575 p->v.IfExp.body = body;
1576 p->v.IfExp.orelse = orelse;
1577 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001578 p->col_offset = col_offset;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001579 return p;
1580}
1581
1582expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001583Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1584 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001585{
1586 expr_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001587 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001588 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001590 p->kind = Dict_kind;
1591 p->v.Dict.keys = keys;
1592 p->v.Dict.values = values;
1593 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001594 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001595 return p;
1596}
1597
1598expr_ty
Guido van Rossum86e58e22006-08-28 15:27:34 +00001599Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1600{
1601 expr_ty p;
1602 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001603 if (!p)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001604 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001605 p->kind = Set_kind;
1606 p->v.Set.elts = elts;
1607 p->lineno = lineno;
1608 p->col_offset = col_offset;
1609 return p;
1610}
1611
1612expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001613ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1614 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615{
1616 expr_ty p;
1617 if (!elt) {
1618 PyErr_SetString(PyExc_ValueError,
1619 "field elt is required for ListComp");
1620 return NULL;
1621 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001622 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001623 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001625 p->kind = ListComp_kind;
1626 p->v.ListComp.elt = elt;
1627 p->v.ListComp.generators = generators;
1628 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001629 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630 return p;
1631}
1632
1633expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001634SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1635 *arena)
1636{
1637 expr_ty p;
1638 if (!elt) {
1639 PyErr_SetString(PyExc_ValueError,
1640 "field elt is required for SetComp");
1641 return NULL;
1642 }
1643 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1644 if (!p)
1645 return NULL;
1646 p->kind = SetComp_kind;
1647 p->v.SetComp.elt = elt;
1648 p->v.SetComp.generators = generators;
1649 p->lineno = lineno;
1650 p->col_offset = col_offset;
1651 return p;
1652}
1653
1654expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001655DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1656 col_offset, PyArena *arena)
1657{
1658 expr_ty p;
1659 if (!key) {
1660 PyErr_SetString(PyExc_ValueError,
1661 "field key is required for DictComp");
1662 return NULL;
1663 }
1664 if (!value) {
1665 PyErr_SetString(PyExc_ValueError,
1666 "field value is required for DictComp");
1667 return NULL;
1668 }
1669 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1670 if (!p)
1671 return NULL;
1672 p->kind = DictComp_kind;
1673 p->v.DictComp.key = key;
1674 p->v.DictComp.value = value;
1675 p->v.DictComp.generators = generators;
1676 p->lineno = lineno;
1677 p->col_offset = col_offset;
1678 return p;
1679}
1680
1681expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001682GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1683 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684{
1685 expr_ty p;
1686 if (!elt) {
1687 PyErr_SetString(PyExc_ValueError,
1688 "field elt is required for GeneratorExp");
1689 return NULL;
1690 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001691 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001692 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694 p->kind = GeneratorExp_kind;
1695 p->v.GeneratorExp.elt = elt;
1696 p->v.GeneratorExp.generators = generators;
1697 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001698 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001699 return p;
1700}
1701
1702expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001703Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704{
1705 expr_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001706 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001707 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001709 p->kind = Yield_kind;
1710 p->v.Yield.value = value;
1711 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001712 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 return p;
1714}
1715
1716expr_ty
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001717Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
1718 int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719{
1720 expr_ty p;
1721 if (!left) {
1722 PyErr_SetString(PyExc_ValueError,
1723 "field left is required for Compare");
1724 return NULL;
1725 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001726 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001727 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 p->kind = Compare_kind;
1730 p->v.Compare.left = left;
1731 p->v.Compare.ops = ops;
1732 p->v.Compare.comparators = comparators;
1733 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001734 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735 return p;
1736}
1737
1738expr_ty
1739Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001740 expr_ty kwargs, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741{
1742 expr_ty p;
1743 if (!func) {
1744 PyErr_SetString(PyExc_ValueError,
1745 "field func is required for Call");
1746 return NULL;
1747 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001748 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001749 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001751 p->kind = Call_kind;
1752 p->v.Call.func = func;
1753 p->v.Call.args = args;
1754 p->v.Call.keywords = keywords;
1755 p->v.Call.starargs = starargs;
1756 p->v.Call.kwargs = kwargs;
1757 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001758 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001759 return p;
1760}
1761
1762expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001763Num(object n, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764{
1765 expr_ty p;
1766 if (!n) {
1767 PyErr_SetString(PyExc_ValueError,
1768 "field n is required for Num");
1769 return NULL;
1770 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001771 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001772 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 p->kind = Num_kind;
1775 p->v.Num.n = n;
1776 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001777 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 return p;
1779}
1780
1781expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001782Str(string s, int lineno, int col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783{
1784 expr_ty p;
1785 if (!s) {
1786 PyErr_SetString(PyExc_ValueError,
1787 "field s is required for Str");
1788 return NULL;
1789 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001790 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001791 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001792 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001793 p->kind = Str_kind;
1794 p->v.Str.s = s;
1795 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001796 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797 return p;
1798}
1799
1800expr_ty
Thomas Wouters00e41de2007-02-23 19:56:57 +00001801Bytes(string s, int lineno, int col_offset, PyArena *arena)
1802{
1803 expr_ty p;
1804 if (!s) {
1805 PyErr_SetString(PyExc_ValueError,
1806 "field s is required for Bytes");
1807 return NULL;
1808 }
1809 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001810 if (!p)
Thomas Wouters00e41de2007-02-23 19:56:57 +00001811 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001812 p->kind = Bytes_kind;
1813 p->v.Bytes.s = s;
1814 p->lineno = lineno;
1815 p->col_offset = col_offset;
1816 return p;
1817}
1818
1819expr_ty
Georg Brandl52318d62006-09-06 07:06:08 +00001820Ellipsis(int lineno, int col_offset, PyArena *arena)
1821{
1822 expr_ty p;
1823 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001824 if (!p)
Georg Brandl52318d62006-09-06 07:06:08 +00001825 return NULL;
Georg Brandl52318d62006-09-06 07:06:08 +00001826 p->kind = Ellipsis_kind;
1827 p->lineno = lineno;
1828 p->col_offset = col_offset;
1829 return p;
1830}
1831
1832expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001833Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
1834 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835{
1836 expr_ty p;
1837 if (!value) {
1838 PyErr_SetString(PyExc_ValueError,
1839 "field value is required for Attribute");
1840 return NULL;
1841 }
1842 if (!attr) {
1843 PyErr_SetString(PyExc_ValueError,
1844 "field attr is required for Attribute");
1845 return NULL;
1846 }
1847 if (!ctx) {
1848 PyErr_SetString(PyExc_ValueError,
1849 "field ctx is required for Attribute");
1850 return NULL;
1851 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001852 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001853 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 p->kind = Attribute_kind;
1856 p->v.Attribute.value = value;
1857 p->v.Attribute.attr = attr;
1858 p->v.Attribute.ctx = ctx;
1859 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001860 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 return p;
1862}
1863
1864expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001865Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
1866 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867{
1868 expr_ty p;
1869 if (!value) {
1870 PyErr_SetString(PyExc_ValueError,
1871 "field value is required for Subscript");
1872 return NULL;
1873 }
1874 if (!slice) {
1875 PyErr_SetString(PyExc_ValueError,
1876 "field slice is required for Subscript");
1877 return NULL;
1878 }
1879 if (!ctx) {
1880 PyErr_SetString(PyExc_ValueError,
1881 "field ctx is required for Subscript");
1882 return NULL;
1883 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001884 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001885 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001886 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 p->kind = Subscript_kind;
1888 p->v.Subscript.value = value;
1889 p->v.Subscript.slice = slice;
1890 p->v.Subscript.ctx = ctx;
1891 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001892 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 return p;
1894}
1895
1896expr_ty
Guido van Rossum0368b722007-05-11 16:50:42 +00001897Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
1898 *arena)
1899{
1900 expr_ty p;
1901 if (!value) {
1902 PyErr_SetString(PyExc_ValueError,
1903 "field value is required for Starred");
1904 return NULL;
1905 }
1906 if (!ctx) {
1907 PyErr_SetString(PyExc_ValueError,
1908 "field ctx is required for Starred");
1909 return NULL;
1910 }
1911 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1912 if (!p)
1913 return NULL;
1914 p->kind = Starred_kind;
1915 p->v.Starred.value = value;
1916 p->v.Starred.ctx = ctx;
1917 p->lineno = lineno;
1918 p->col_offset = col_offset;
1919 return p;
1920}
1921
1922expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001923Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
1924 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925{
1926 expr_ty p;
1927 if (!id) {
1928 PyErr_SetString(PyExc_ValueError,
1929 "field id is required for Name");
1930 return NULL;
1931 }
1932 if (!ctx) {
1933 PyErr_SetString(PyExc_ValueError,
1934 "field ctx is required for Name");
1935 return NULL;
1936 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001937 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001938 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 p->kind = Name_kind;
1941 p->v.Name.id = id;
1942 p->v.Name.ctx = ctx;
1943 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001944 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 return p;
1946}
1947
1948expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001949List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
1950 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951{
1952 expr_ty p;
1953 if (!ctx) {
1954 PyErr_SetString(PyExc_ValueError,
1955 "field ctx is required for List");
1956 return NULL;
1957 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001958 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001959 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 p->kind = List_kind;
1962 p->v.List.elts = elts;
1963 p->v.List.ctx = ctx;
1964 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001965 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 return p;
1967}
1968
1969expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001970Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
1971 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972{
1973 expr_ty p;
1974 if (!ctx) {
1975 PyErr_SetString(PyExc_ValueError,
1976 "field ctx is required for Tuple");
1977 return NULL;
1978 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001979 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001980 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982 p->kind = Tuple_kind;
1983 p->v.Tuple.elts = elts;
1984 p->v.Tuple.ctx = ctx;
1985 p->lineno = lineno;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001986 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 return p;
1988}
1989
1990slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001991Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992{
1993 slice_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001994 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00001995 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 p->kind = Slice_kind;
1998 p->v.Slice.lower = lower;
1999 p->v.Slice.upper = upper;
2000 p->v.Slice.step = step;
2001 return p;
2002}
2003
2004slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005ExtSlice(asdl_seq * dims, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006{
2007 slice_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002008 p = (slice_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 = ExtSlice_kind;
2012 p->v.ExtSlice.dims = dims;
2013 return p;
2014}
2015
2016slice_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002017Index(expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018{
2019 slice_ty p;
2020 if (!value) {
2021 PyErr_SetString(PyExc_ValueError,
2022 "field value is required for Index");
2023 return NULL;
2024 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002025 p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002026 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 p->kind = Index_kind;
2029 p->v.Index.value = value;
2030 return p;
2031}
2032
2033comprehension_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002034comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035{
2036 comprehension_ty p;
2037 if (!target) {
2038 PyErr_SetString(PyExc_ValueError,
2039 "field target is required for comprehension");
2040 return NULL;
2041 }
2042 if (!iter) {
2043 PyErr_SetString(PyExc_ValueError,
2044 "field iter is required for comprehension");
2045 return NULL;
2046 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002047 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002048 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 p->target = target;
2051 p->iter = iter;
2052 p->ifs = ifs;
2053 return p;
2054}
2055
2056excepthandler_ty
Neal Norwitzad74aa82008-03-31 05:14:30 +00002057ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002058 col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059{
2060 excepthandler_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002061 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002062 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063 return NULL;
Neal Norwitzad74aa82008-03-31 05:14:30 +00002064 p->kind = ExceptHandler_kind;
2065 p->v.ExceptHandler.type = type;
2066 p->v.ExceptHandler.name = name;
2067 p->v.ExceptHandler.body = body;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002068 p->lineno = lineno;
2069 p->col_offset = col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 return p;
2071}
2072
2073arguments_ty
Neal Norwitzc1505362006-12-28 06:47:50 +00002074arguments(asdl_seq * args, identifier vararg, expr_ty varargannotation,
2075 asdl_seq * kwonlyargs, identifier kwarg, expr_ty kwargannotation,
2076 asdl_seq * defaults, asdl_seq * kw_defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077{
2078 arguments_ty p;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002079 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002080 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 p->args = args;
2083 p->vararg = vararg;
Neal Norwitzc1505362006-12-28 06:47:50 +00002084 p->varargannotation = varargannotation;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002085 p->kwonlyargs = kwonlyargs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 p->kwarg = kwarg;
Neal Norwitzc1505362006-12-28 06:47:50 +00002087 p->kwargannotation = kwargannotation;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 p->defaults = defaults;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002089 p->kw_defaults = kw_defaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 return p;
2091}
2092
Neal Norwitzc1505362006-12-28 06:47:50 +00002093arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002094arg(identifier arg, expr_ty annotation, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00002095{
2096 arg_ty p;
2097 if (!arg) {
2098 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002099 "field arg is required for arg");
Neal Norwitzc1505362006-12-28 06:47:50 +00002100 return NULL;
2101 }
2102 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002103 if (!p)
Neal Norwitzc1505362006-12-28 06:47:50 +00002104 return NULL;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00002105 p->arg = arg;
2106 p->annotation = annotation;
Neal Norwitzc1505362006-12-28 06:47:50 +00002107 return p;
2108}
2109
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110keyword_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002111keyword(identifier arg, expr_ty value, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112{
2113 keyword_ty p;
2114 if (!arg) {
2115 PyErr_SetString(PyExc_ValueError,
2116 "field arg is required for keyword");
2117 return NULL;
2118 }
2119 if (!value) {
2120 PyErr_SetString(PyExc_ValueError,
2121 "field value is required for keyword");
2122 return NULL;
2123 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002124 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002125 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127 p->arg = arg;
2128 p->value = value;
2129 return p;
2130}
2131
2132alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002133alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134{
2135 alias_ty p;
2136 if (!name) {
2137 PyErr_SetString(PyExc_ValueError,
2138 "field name is required for alias");
2139 return NULL;
2140 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002141 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
Thomas Woutersa44f3a32007-02-26 18:20:15 +00002142 if (!p)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002144 p->name = name;
2145 p->asname = asname;
2146 return p;
2147}
2148
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002149
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002150PyObject*
2151ast2obj_mod(void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002152{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002153 mod_ty o = (mod_ty)_o;
2154 PyObject *result = NULL, *value = NULL;
2155 if (!o) {
2156 Py_INCREF(Py_None);
2157 return Py_None;
2158 }
Neal Norwitz7b5a6042005-11-13 19:14:20 +00002159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 switch (o->kind) {
2161 case Module_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002162 result = PyType_GenericNew(Module_type, NULL, NULL);
2163 if (!result) goto failed;
2164 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2165 if (!value) goto failed;
2166 if (PyObject_SetAttrString(result, "body", value) == -1)
2167 goto failed;
2168 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 break;
2170 case Interactive_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002171 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2172 if (!result) goto failed;
2173 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2174 if (!value) goto failed;
2175 if (PyObject_SetAttrString(result, "body", value) == -1)
2176 goto failed;
2177 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178 break;
2179 case Expression_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002180 result = PyType_GenericNew(Expression_type, NULL, NULL);
2181 if (!result) goto failed;
2182 value = ast2obj_expr(o->v.Expression.body);
2183 if (!value) goto failed;
2184 if (PyObject_SetAttrString(result, "body", value) == -1)
2185 goto failed;
2186 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 break;
2188 case Suite_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002189 result = PyType_GenericNew(Suite_type, NULL, NULL);
2190 if (!result) goto failed;
2191 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2192 if (!value) goto failed;
2193 if (PyObject_SetAttrString(result, "body", value) == -1)
2194 goto failed;
2195 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 break;
2197 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002198 return result;
2199failed:
2200 Py_XDECREF(value);
2201 Py_XDECREF(result);
2202 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203}
2204
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002205PyObject*
2206ast2obj_stmt(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002208 stmt_ty o = (stmt_ty)_o;
2209 PyObject *result = NULL, *value = NULL;
2210 if (!o) {
2211 Py_INCREF(Py_None);
2212 return Py_None;
2213 }
2214
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215 switch (o->kind) {
2216 case FunctionDef_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002217 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2218 if (!result) goto failed;
2219 value = ast2obj_identifier(o->v.FunctionDef.name);
2220 if (!value) goto failed;
2221 if (PyObject_SetAttrString(result, "name", value) == -1)
2222 goto failed;
2223 Py_DECREF(value);
2224 value = ast2obj_arguments(o->v.FunctionDef.args);
2225 if (!value) goto failed;
2226 if (PyObject_SetAttrString(result, "args", value) == -1)
2227 goto failed;
2228 Py_DECREF(value);
2229 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2230 if (!value) goto failed;
2231 if (PyObject_SetAttrString(result, "body", value) == -1)
2232 goto failed;
2233 Py_DECREF(value);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002234 value = ast2obj_list(o->v.FunctionDef.decorator_list,
2235 ast2obj_expr);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002236 if (!value) goto failed;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002237 if (PyObject_SetAttrString(result, "decorator_list", value) ==
2238 -1)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002239 goto failed;
2240 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00002241 value = ast2obj_expr(o->v.FunctionDef.returns);
2242 if (!value) goto failed;
2243 if (PyObject_SetAttrString(result, "returns", value) == -1)
2244 goto failed;
2245 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246 break;
2247 case ClassDef_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002248 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2249 if (!result) goto failed;
2250 value = ast2obj_identifier(o->v.ClassDef.name);
2251 if (!value) goto failed;
2252 if (PyObject_SetAttrString(result, "name", value) == -1)
2253 goto failed;
2254 Py_DECREF(value);
2255 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2256 if (!value) goto failed;
2257 if (PyObject_SetAttrString(result, "bases", value) == -1)
2258 goto failed;
2259 Py_DECREF(value);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002260 value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
2261 if (!value) goto failed;
2262 if (PyObject_SetAttrString(result, "keywords", value) == -1)
2263 goto failed;
2264 Py_DECREF(value);
2265 value = ast2obj_expr(o->v.ClassDef.starargs);
2266 if (!value) goto failed;
2267 if (PyObject_SetAttrString(result, "starargs", value) == -1)
2268 goto failed;
2269 Py_DECREF(value);
2270 value = ast2obj_expr(o->v.ClassDef.kwargs);
2271 if (!value) goto failed;
2272 if (PyObject_SetAttrString(result, "kwargs", value) == -1)
2273 goto failed;
2274 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002275 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2276 if (!value) goto failed;
2277 if (PyObject_SetAttrString(result, "body", value) == -1)
2278 goto failed;
2279 Py_DECREF(value);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002280 value = ast2obj_list(o->v.ClassDef.decorator_list,
2281 ast2obj_expr);
2282 if (!value) goto failed;
2283 if (PyObject_SetAttrString(result, "decorator_list", value) ==
2284 -1)
2285 goto failed;
2286 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 break;
2288 case Return_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002289 result = PyType_GenericNew(Return_type, NULL, NULL);
2290 if (!result) goto failed;
2291 value = ast2obj_expr(o->v.Return.value);
2292 if (!value) goto failed;
2293 if (PyObject_SetAttrString(result, "value", value) == -1)
2294 goto failed;
2295 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 break;
2297 case Delete_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002298 result = PyType_GenericNew(Delete_type, NULL, NULL);
2299 if (!result) goto failed;
2300 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2301 if (!value) goto failed;
2302 if (PyObject_SetAttrString(result, "targets", value) == -1)
2303 goto failed;
2304 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 break;
2306 case Assign_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002307 result = PyType_GenericNew(Assign_type, NULL, NULL);
2308 if (!result) goto failed;
2309 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2310 if (!value) goto failed;
2311 if (PyObject_SetAttrString(result, "targets", value) == -1)
2312 goto failed;
2313 Py_DECREF(value);
2314 value = ast2obj_expr(o->v.Assign.value);
2315 if (!value) goto failed;
2316 if (PyObject_SetAttrString(result, "value", value) == -1)
2317 goto failed;
2318 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 break;
2320 case AugAssign_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002321 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2322 if (!result) goto failed;
2323 value = ast2obj_expr(o->v.AugAssign.target);
2324 if (!value) goto failed;
2325 if (PyObject_SetAttrString(result, "target", value) == -1)
2326 goto failed;
2327 Py_DECREF(value);
2328 value = ast2obj_operator(o->v.AugAssign.op);
2329 if (!value) goto failed;
2330 if (PyObject_SetAttrString(result, "op", value) == -1)
2331 goto failed;
2332 Py_DECREF(value);
2333 value = ast2obj_expr(o->v.AugAssign.value);
2334 if (!value) goto failed;
2335 if (PyObject_SetAttrString(result, "value", value) == -1)
2336 goto failed;
2337 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 case For_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002340 result = PyType_GenericNew(For_type, NULL, NULL);
2341 if (!result) goto failed;
2342 value = ast2obj_expr(o->v.For.target);
2343 if (!value) goto failed;
2344 if (PyObject_SetAttrString(result, "target", value) == -1)
2345 goto failed;
2346 Py_DECREF(value);
2347 value = ast2obj_expr(o->v.For.iter);
2348 if (!value) goto failed;
2349 if (PyObject_SetAttrString(result, "iter", value) == -1)
2350 goto failed;
2351 Py_DECREF(value);
2352 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2353 if (!value) goto failed;
2354 if (PyObject_SetAttrString(result, "body", value) == -1)
2355 goto failed;
2356 Py_DECREF(value);
2357 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2358 if (!value) goto failed;
2359 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2360 goto failed;
2361 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 break;
2363 case While_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002364 result = PyType_GenericNew(While_type, NULL, NULL);
2365 if (!result) goto failed;
2366 value = ast2obj_expr(o->v.While.test);
2367 if (!value) goto failed;
2368 if (PyObject_SetAttrString(result, "test", value) == -1)
2369 goto failed;
2370 Py_DECREF(value);
2371 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2372 if (!value) goto failed;
2373 if (PyObject_SetAttrString(result, "body", value) == -1)
2374 goto failed;
2375 Py_DECREF(value);
2376 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2377 if (!value) goto failed;
2378 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2379 goto failed;
2380 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381 break;
2382 case If_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002383 result = PyType_GenericNew(If_type, NULL, NULL);
2384 if (!result) goto failed;
2385 value = ast2obj_expr(o->v.If.test);
2386 if (!value) goto failed;
2387 if (PyObject_SetAttrString(result, "test", value) == -1)
2388 goto failed;
2389 Py_DECREF(value);
2390 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2391 if (!value) goto failed;
2392 if (PyObject_SetAttrString(result, "body", value) == -1)
2393 goto failed;
2394 Py_DECREF(value);
2395 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2396 if (!value) goto failed;
2397 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2398 goto failed;
2399 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 break;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002401 case With_kind:
2402 result = PyType_GenericNew(With_type, NULL, NULL);
2403 if (!result) goto failed;
2404 value = ast2obj_expr(o->v.With.context_expr);
2405 if (!value) goto failed;
2406 if (PyObject_SetAttrString(result, "context_expr", value) == -1)
2407 goto failed;
2408 Py_DECREF(value);
2409 value = ast2obj_expr(o->v.With.optional_vars);
2410 if (!value) goto failed;
2411 if (PyObject_SetAttrString(result, "optional_vars", value) ==
2412 -1)
2413 goto failed;
2414 Py_DECREF(value);
2415 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2416 if (!value) goto failed;
2417 if (PyObject_SetAttrString(result, "body", value) == -1)
2418 goto failed;
2419 Py_DECREF(value);
2420 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 case Raise_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002422 result = PyType_GenericNew(Raise_type, NULL, NULL);
2423 if (!result) goto failed;
Collin Winter828f04a2007-08-31 00:04:24 +00002424 value = ast2obj_expr(o->v.Raise.exc);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002425 if (!value) goto failed;
Collin Winter828f04a2007-08-31 00:04:24 +00002426 if (PyObject_SetAttrString(result, "exc", value) == -1)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002427 goto failed;
2428 Py_DECREF(value);
Collin Winter828f04a2007-08-31 00:04:24 +00002429 value = ast2obj_expr(o->v.Raise.cause);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002430 if (!value) goto failed;
Collin Winter828f04a2007-08-31 00:04:24 +00002431 if (PyObject_SetAttrString(result, "cause", value) == -1)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002432 goto failed;
2433 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434 break;
2435 case TryExcept_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002436 result = PyType_GenericNew(TryExcept_type, NULL, NULL);
2437 if (!result) goto failed;
2438 value = ast2obj_list(o->v.TryExcept.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.TryExcept.handlers,
2444 ast2obj_excepthandler);
2445 if (!value) goto failed;
2446 if (PyObject_SetAttrString(result, "handlers", value) == -1)
2447 goto failed;
2448 Py_DECREF(value);
2449 value = ast2obj_list(o->v.TryExcept.orelse, ast2obj_stmt);
2450 if (!value) goto failed;
2451 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2452 goto failed;
2453 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 break;
2455 case TryFinally_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002456 result = PyType_GenericNew(TryFinally_type, NULL, NULL);
2457 if (!result) goto failed;
2458 value = ast2obj_list(o->v.TryFinally.body, ast2obj_stmt);
2459 if (!value) goto failed;
2460 if (PyObject_SetAttrString(result, "body", value) == -1)
2461 goto failed;
2462 Py_DECREF(value);
2463 value = ast2obj_list(o->v.TryFinally.finalbody, ast2obj_stmt);
2464 if (!value) goto failed;
2465 if (PyObject_SetAttrString(result, "finalbody", value) == -1)
2466 goto failed;
2467 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 break;
2469 case Assert_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002470 result = PyType_GenericNew(Assert_type, NULL, NULL);
2471 if (!result) goto failed;
2472 value = ast2obj_expr(o->v.Assert.test);
2473 if (!value) goto failed;
2474 if (PyObject_SetAttrString(result, "test", value) == -1)
2475 goto failed;
2476 Py_DECREF(value);
2477 value = ast2obj_expr(o->v.Assert.msg);
2478 if (!value) goto failed;
2479 if (PyObject_SetAttrString(result, "msg", value) == -1)
2480 goto failed;
2481 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 break;
2483 case Import_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002484 result = PyType_GenericNew(Import_type, NULL, NULL);
2485 if (!result) goto failed;
2486 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2487 if (!value) goto failed;
2488 if (PyObject_SetAttrString(result, "names", value) == -1)
2489 goto failed;
2490 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 break;
2492 case ImportFrom_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002493 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
2494 if (!result) goto failed;
2495 value = ast2obj_identifier(o->v.ImportFrom.module);
2496 if (!value) goto failed;
2497 if (PyObject_SetAttrString(result, "module", value) == -1)
2498 goto failed;
2499 Py_DECREF(value);
2500 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
2501 if (!value) goto failed;
2502 if (PyObject_SetAttrString(result, "names", value) == -1)
2503 goto failed;
2504 Py_DECREF(value);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002505 value = ast2obj_int(o->v.ImportFrom.level);
2506 if (!value) goto failed;
2507 if (PyObject_SetAttrString(result, "level", value) == -1)
2508 goto failed;
2509 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 case Global_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002512 result = PyType_GenericNew(Global_type, NULL, NULL);
2513 if (!result) goto failed;
2514 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
2515 if (!value) goto failed;
2516 if (PyObject_SetAttrString(result, "names", value) == -1)
2517 goto failed;
2518 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 break;
Jeremy Hylton81e95022007-02-27 06:50:52 +00002520 case Nonlocal_kind:
2521 result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
2522 if (!result) goto failed;
2523 value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
2524 if (!value) goto failed;
2525 if (PyObject_SetAttrString(result, "names", value) == -1)
2526 goto failed;
2527 Py_DECREF(value);
2528 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 case Expr_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002530 result = PyType_GenericNew(Expr_type, NULL, NULL);
2531 if (!result) goto failed;
2532 value = ast2obj_expr(o->v.Expr.value);
2533 if (!value) goto failed;
2534 if (PyObject_SetAttrString(result, "value", value) == -1)
2535 goto failed;
2536 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 break;
2538 case Pass_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002539 result = PyType_GenericNew(Pass_type, NULL, NULL);
2540 if (!result) goto failed;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 break;
2542 case Break_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002543 result = PyType_GenericNew(Break_type, NULL, NULL);
2544 if (!result) goto failed;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 break;
2546 case Continue_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002547 result = PyType_GenericNew(Continue_type, NULL, NULL);
2548 if (!result) goto failed;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 break;
2550 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002551 value = ast2obj_int(o->lineno);
2552 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002553 if (PyObject_SetAttrString(result, "lineno", value) < 0)
2554 goto failed;
2555 Py_DECREF(value);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002556 value = ast2obj_int(o->col_offset);
2557 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002558 if (PyObject_SetAttrString(result, "col_offset", value) < 0)
2559 goto failed;
2560 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002561 return result;
2562failed:
2563 Py_XDECREF(value);
2564 Py_XDECREF(result);
2565 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566}
2567
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002568PyObject*
2569ast2obj_expr(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002571 expr_ty o = (expr_ty)_o;
2572 PyObject *result = NULL, *value = NULL;
2573 if (!o) {
2574 Py_INCREF(Py_None);
2575 return Py_None;
2576 }
2577
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 switch (o->kind) {
2579 case BoolOp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002580 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
2581 if (!result) goto failed;
2582 value = ast2obj_boolop(o->v.BoolOp.op);
2583 if (!value) goto failed;
2584 if (PyObject_SetAttrString(result, "op", value) == -1)
2585 goto failed;
2586 Py_DECREF(value);
2587 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
2588 if (!value) goto failed;
2589 if (PyObject_SetAttrString(result, "values", value) == -1)
2590 goto failed;
2591 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592 break;
2593 case BinOp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002594 result = PyType_GenericNew(BinOp_type, NULL, NULL);
2595 if (!result) goto failed;
2596 value = ast2obj_expr(o->v.BinOp.left);
2597 if (!value) goto failed;
2598 if (PyObject_SetAttrString(result, "left", value) == -1)
2599 goto failed;
2600 Py_DECREF(value);
2601 value = ast2obj_operator(o->v.BinOp.op);
2602 if (!value) goto failed;
2603 if (PyObject_SetAttrString(result, "op", value) == -1)
2604 goto failed;
2605 Py_DECREF(value);
2606 value = ast2obj_expr(o->v.BinOp.right);
2607 if (!value) goto failed;
2608 if (PyObject_SetAttrString(result, "right", value) == -1)
2609 goto failed;
2610 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 break;
2612 case UnaryOp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002613 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
2614 if (!result) goto failed;
2615 value = ast2obj_unaryop(o->v.UnaryOp.op);
2616 if (!value) goto failed;
2617 if (PyObject_SetAttrString(result, "op", value) == -1)
2618 goto failed;
2619 Py_DECREF(value);
2620 value = ast2obj_expr(o->v.UnaryOp.operand);
2621 if (!value) goto failed;
2622 if (PyObject_SetAttrString(result, "operand", value) == -1)
2623 goto failed;
2624 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 break;
2626 case Lambda_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002627 result = PyType_GenericNew(Lambda_type, NULL, NULL);
2628 if (!result) goto failed;
2629 value = ast2obj_arguments(o->v.Lambda.args);
2630 if (!value) goto failed;
2631 if (PyObject_SetAttrString(result, "args", value) == -1)
2632 goto failed;
2633 Py_DECREF(value);
2634 value = ast2obj_expr(o->v.Lambda.body);
2635 if (!value) goto failed;
2636 if (PyObject_SetAttrString(result, "body", value) == -1)
2637 goto failed;
2638 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639 break;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002640 case IfExp_kind:
2641 result = PyType_GenericNew(IfExp_type, NULL, NULL);
2642 if (!result) goto failed;
2643 value = ast2obj_expr(o->v.IfExp.test);
2644 if (!value) goto failed;
2645 if (PyObject_SetAttrString(result, "test", value) == -1)
2646 goto failed;
2647 Py_DECREF(value);
2648 value = ast2obj_expr(o->v.IfExp.body);
2649 if (!value) goto failed;
2650 if (PyObject_SetAttrString(result, "body", value) == -1)
2651 goto failed;
2652 Py_DECREF(value);
2653 value = ast2obj_expr(o->v.IfExp.orelse);
2654 if (!value) goto failed;
2655 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2656 goto failed;
2657 Py_DECREF(value);
2658 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 case Dict_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002660 result = PyType_GenericNew(Dict_type, NULL, NULL);
2661 if (!result) goto failed;
2662 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
2663 if (!value) goto failed;
2664 if (PyObject_SetAttrString(result, "keys", value) == -1)
2665 goto failed;
2666 Py_DECREF(value);
2667 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
2668 if (!value) goto failed;
2669 if (PyObject_SetAttrString(result, "values", value) == -1)
2670 goto failed;
2671 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 break;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002673 case Set_kind:
2674 result = PyType_GenericNew(Set_type, NULL, NULL);
2675 if (!result) goto failed;
2676 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
2677 if (!value) goto failed;
2678 if (PyObject_SetAttrString(result, "elts", value) == -1)
2679 goto failed;
2680 Py_DECREF(value);
2681 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 case ListComp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002683 result = PyType_GenericNew(ListComp_type, NULL, NULL);
2684 if (!result) goto failed;
2685 value = ast2obj_expr(o->v.ListComp.elt);
2686 if (!value) goto failed;
2687 if (PyObject_SetAttrString(result, "elt", value) == -1)
2688 goto failed;
2689 Py_DECREF(value);
2690 value = ast2obj_list(o->v.ListComp.generators,
2691 ast2obj_comprehension);
2692 if (!value) goto failed;
2693 if (PyObject_SetAttrString(result, "generators", value) == -1)
2694 goto failed;
2695 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 break;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002697 case SetComp_kind:
2698 result = PyType_GenericNew(SetComp_type, NULL, NULL);
2699 if (!result) goto failed;
2700 value = ast2obj_expr(o->v.SetComp.elt);
2701 if (!value) goto failed;
2702 if (PyObject_SetAttrString(result, "elt", value) == -1)
2703 goto failed;
2704 Py_DECREF(value);
2705 value = ast2obj_list(o->v.SetComp.generators,
2706 ast2obj_comprehension);
2707 if (!value) goto failed;
2708 if (PyObject_SetAttrString(result, "generators", value) == -1)
2709 goto failed;
2710 Py_DECREF(value);
2711 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002712 case DictComp_kind:
2713 result = PyType_GenericNew(DictComp_type, NULL, NULL);
2714 if (!result) goto failed;
2715 value = ast2obj_expr(o->v.DictComp.key);
2716 if (!value) goto failed;
2717 if (PyObject_SetAttrString(result, "key", value) == -1)
2718 goto failed;
2719 Py_DECREF(value);
2720 value = ast2obj_expr(o->v.DictComp.value);
2721 if (!value) goto failed;
2722 if (PyObject_SetAttrString(result, "value", value) == -1)
2723 goto failed;
2724 Py_DECREF(value);
2725 value = ast2obj_list(o->v.DictComp.generators,
2726 ast2obj_comprehension);
2727 if (!value) goto failed;
2728 if (PyObject_SetAttrString(result, "generators", value) == -1)
2729 goto failed;
2730 Py_DECREF(value);
2731 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 case GeneratorExp_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002733 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
2734 if (!result) goto failed;
2735 value = ast2obj_expr(o->v.GeneratorExp.elt);
2736 if (!value) goto failed;
2737 if (PyObject_SetAttrString(result, "elt", value) == -1)
2738 goto failed;
2739 Py_DECREF(value);
2740 value = ast2obj_list(o->v.GeneratorExp.generators,
2741 ast2obj_comprehension);
2742 if (!value) goto failed;
2743 if (PyObject_SetAttrString(result, "generators", value) == -1)
2744 goto failed;
2745 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 break;
2747 case Yield_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002748 result = PyType_GenericNew(Yield_type, NULL, NULL);
2749 if (!result) goto failed;
2750 value = ast2obj_expr(o->v.Yield.value);
2751 if (!value) goto failed;
2752 if (PyObject_SetAttrString(result, "value", value) == -1)
2753 goto failed;
2754 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755 break;
2756 case Compare_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002757 result = PyType_GenericNew(Compare_type, NULL, NULL);
2758 if (!result) goto failed;
2759 value = ast2obj_expr(o->v.Compare.left);
2760 if (!value) goto failed;
2761 if (PyObject_SetAttrString(result, "left", value) == -1)
2762 goto failed;
2763 Py_DECREF(value);
Martin v. Löwisce1d5d22006-02-26 20:51:25 +00002764 {
2765 int i, n = asdl_seq_LEN(o->v.Compare.ops);
2766 value = PyList_New(n);
2767 if (!value) goto failed;
2768 for(i = 0; i < n; i++)
2769 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
2770 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002771 if (!value) goto failed;
2772 if (PyObject_SetAttrString(result, "ops", value) == -1)
2773 goto failed;
2774 Py_DECREF(value);
2775 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
2776 if (!value) goto failed;
2777 if (PyObject_SetAttrString(result, "comparators", value) == -1)
2778 goto failed;
2779 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 break;
2781 case Call_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002782 result = PyType_GenericNew(Call_type, NULL, NULL);
2783 if (!result) goto failed;
2784 value = ast2obj_expr(o->v.Call.func);
2785 if (!value) goto failed;
2786 if (PyObject_SetAttrString(result, "func", value) == -1)
2787 goto failed;
2788 Py_DECREF(value);
2789 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
2790 if (!value) goto failed;
2791 if (PyObject_SetAttrString(result, "args", value) == -1)
2792 goto failed;
2793 Py_DECREF(value);
2794 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
2795 if (!value) goto failed;
2796 if (PyObject_SetAttrString(result, "keywords", value) == -1)
2797 goto failed;
2798 Py_DECREF(value);
2799 value = ast2obj_expr(o->v.Call.starargs);
2800 if (!value) goto failed;
2801 if (PyObject_SetAttrString(result, "starargs", value) == -1)
2802 goto failed;
2803 Py_DECREF(value);
2804 value = ast2obj_expr(o->v.Call.kwargs);
2805 if (!value) goto failed;
2806 if (PyObject_SetAttrString(result, "kwargs", value) == -1)
2807 goto failed;
2808 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 case Num_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002811 result = PyType_GenericNew(Num_type, NULL, NULL);
2812 if (!result) goto failed;
2813 value = ast2obj_object(o->v.Num.n);
2814 if (!value) goto failed;
2815 if (PyObject_SetAttrString(result, "n", value) == -1)
2816 goto failed;
2817 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 break;
2819 case Str_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002820 result = PyType_GenericNew(Str_type, NULL, NULL);
2821 if (!result) goto failed;
2822 value = ast2obj_string(o->v.Str.s);
2823 if (!value) goto failed;
2824 if (PyObject_SetAttrString(result, "s", value) == -1)
2825 goto failed;
2826 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00002828 case Bytes_kind:
2829 result = PyType_GenericNew(Bytes_type, NULL, NULL);
2830 if (!result) goto failed;
2831 value = ast2obj_string(o->v.Bytes.s);
2832 if (!value) goto failed;
2833 if (PyObject_SetAttrString(result, "s", value) == -1)
2834 goto failed;
2835 Py_DECREF(value);
2836 break;
Georg Brandl52318d62006-09-06 07:06:08 +00002837 case Ellipsis_kind:
2838 result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
2839 if (!result) goto failed;
2840 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 case Attribute_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002842 result = PyType_GenericNew(Attribute_type, NULL, NULL);
2843 if (!result) goto failed;
2844 value = ast2obj_expr(o->v.Attribute.value);
2845 if (!value) goto failed;
2846 if (PyObject_SetAttrString(result, "value", value) == -1)
2847 goto failed;
2848 Py_DECREF(value);
2849 value = ast2obj_identifier(o->v.Attribute.attr);
2850 if (!value) goto failed;
2851 if (PyObject_SetAttrString(result, "attr", value) == -1)
2852 goto failed;
2853 Py_DECREF(value);
2854 value = ast2obj_expr_context(o->v.Attribute.ctx);
2855 if (!value) goto failed;
2856 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2857 goto failed;
2858 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 break;
2860 case Subscript_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002861 result = PyType_GenericNew(Subscript_type, NULL, NULL);
2862 if (!result) goto failed;
2863 value = ast2obj_expr(o->v.Subscript.value);
2864 if (!value) goto failed;
2865 if (PyObject_SetAttrString(result, "value", value) == -1)
2866 goto failed;
2867 Py_DECREF(value);
2868 value = ast2obj_slice(o->v.Subscript.slice);
2869 if (!value) goto failed;
2870 if (PyObject_SetAttrString(result, "slice", value) == -1)
2871 goto failed;
2872 Py_DECREF(value);
2873 value = ast2obj_expr_context(o->v.Subscript.ctx);
2874 if (!value) goto failed;
2875 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2876 goto failed;
2877 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 break;
Guido van Rossum0368b722007-05-11 16:50:42 +00002879 case Starred_kind:
2880 result = PyType_GenericNew(Starred_type, NULL, NULL);
2881 if (!result) goto failed;
2882 value = ast2obj_expr(o->v.Starred.value);
2883 if (!value) goto failed;
2884 if (PyObject_SetAttrString(result, "value", value) == -1)
2885 goto failed;
2886 Py_DECREF(value);
2887 value = ast2obj_expr_context(o->v.Starred.ctx);
2888 if (!value) goto failed;
2889 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2890 goto failed;
2891 Py_DECREF(value);
2892 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 case Name_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002894 result = PyType_GenericNew(Name_type, NULL, NULL);
2895 if (!result) goto failed;
2896 value = ast2obj_identifier(o->v.Name.id);
2897 if (!value) goto failed;
2898 if (PyObject_SetAttrString(result, "id", value) == -1)
2899 goto failed;
2900 Py_DECREF(value);
2901 value = ast2obj_expr_context(o->v.Name.ctx);
2902 if (!value) goto failed;
2903 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2904 goto failed;
2905 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906 break;
2907 case List_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002908 result = PyType_GenericNew(List_type, NULL, NULL);
2909 if (!result) goto failed;
2910 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
2911 if (!value) goto failed;
2912 if (PyObject_SetAttrString(result, "elts", value) == -1)
2913 goto failed;
2914 Py_DECREF(value);
2915 value = ast2obj_expr_context(o->v.List.ctx);
2916 if (!value) goto failed;
2917 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2918 goto failed;
2919 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920 break;
2921 case Tuple_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002922 result = PyType_GenericNew(Tuple_type, NULL, NULL);
2923 if (!result) goto failed;
2924 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
2925 if (!value) goto failed;
2926 if (PyObject_SetAttrString(result, "elts", value) == -1)
2927 goto failed;
2928 Py_DECREF(value);
2929 value = ast2obj_expr_context(o->v.Tuple.ctx);
2930 if (!value) goto failed;
2931 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2932 goto failed;
2933 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934 break;
2935 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00002936 value = ast2obj_int(o->lineno);
2937 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002938 if (PyObject_SetAttrString(result, "lineno", value) < 0)
2939 goto failed;
2940 Py_DECREF(value);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002941 value = ast2obj_int(o->col_offset);
2942 if (!value) goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00002943 if (PyObject_SetAttrString(result, "col_offset", value) < 0)
2944 goto failed;
2945 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002946 return result;
2947failed:
2948 Py_XDECREF(value);
2949 Py_XDECREF(result);
2950 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951}
2952
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002953PyObject* ast2obj_expr_context(expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002955 switch(o) {
2956 case Load:
2957 Py_INCREF(Load_singleton);
2958 return Load_singleton;
2959 case Store:
2960 Py_INCREF(Store_singleton);
2961 return Store_singleton;
2962 case Del:
2963 Py_INCREF(Del_singleton);
2964 return Del_singleton;
2965 case AugLoad:
2966 Py_INCREF(AugLoad_singleton);
2967 return AugLoad_singleton;
2968 case AugStore:
2969 Py_INCREF(AugStore_singleton);
2970 return AugStore_singleton;
2971 case Param:
2972 Py_INCREF(Param_singleton);
2973 return Param_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00002974 default:
2975 /* should never happen, but just in case ... */
2976 PyErr_Format(PyExc_SystemError, "unknown expr_context found");
2977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979}
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002980PyObject*
2981ast2obj_slice(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002983 slice_ty o = (slice_ty)_o;
2984 PyObject *result = NULL, *value = NULL;
2985 if (!o) {
2986 Py_INCREF(Py_None);
2987 return Py_None;
2988 }
2989
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 switch (o->kind) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 case Slice_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00002992 result = PyType_GenericNew(Slice_type, NULL, NULL);
2993 if (!result) goto failed;
2994 value = ast2obj_expr(o->v.Slice.lower);
2995 if (!value) goto failed;
2996 if (PyObject_SetAttrString(result, "lower", value) == -1)
2997 goto failed;
2998 Py_DECREF(value);
2999 value = ast2obj_expr(o->v.Slice.upper);
3000 if (!value) goto failed;
3001 if (PyObject_SetAttrString(result, "upper", value) == -1)
3002 goto failed;
3003 Py_DECREF(value);
3004 value = ast2obj_expr(o->v.Slice.step);
3005 if (!value) goto failed;
3006 if (PyObject_SetAttrString(result, "step", value) == -1)
3007 goto failed;
3008 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009 break;
3010 case ExtSlice_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003011 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
3012 if (!result) goto failed;
3013 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
3014 if (!value) goto failed;
3015 if (PyObject_SetAttrString(result, "dims", value) == -1)
3016 goto failed;
3017 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018 break;
3019 case Index_kind:
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003020 result = PyType_GenericNew(Index_type, NULL, NULL);
3021 if (!result) goto failed;
3022 value = ast2obj_expr(o->v.Index.value);
3023 if (!value) goto failed;
3024 if (PyObject_SetAttrString(result, "value", value) == -1)
3025 goto failed;
3026 Py_DECREF(value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 break;
3028 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003029 return result;
3030failed:
3031 Py_XDECREF(value);
3032 Py_XDECREF(result);
3033 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034}
3035
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003036PyObject* ast2obj_boolop(boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003038 switch(o) {
3039 case And:
3040 Py_INCREF(And_singleton);
3041 return And_singleton;
3042 case Or:
3043 Py_INCREF(Or_singleton);
3044 return Or_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003045 default:
3046 /* should never happen, but just in case ... */
3047 PyErr_Format(PyExc_SystemError, "unknown boolop found");
3048 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003050}
3051PyObject* ast2obj_operator(operator_ty o)
3052{
3053 switch(o) {
3054 case Add:
3055 Py_INCREF(Add_singleton);
3056 return Add_singleton;
3057 case Sub:
3058 Py_INCREF(Sub_singleton);
3059 return Sub_singleton;
3060 case Mult:
3061 Py_INCREF(Mult_singleton);
3062 return Mult_singleton;
3063 case Div:
3064 Py_INCREF(Div_singleton);
3065 return Div_singleton;
3066 case Mod:
3067 Py_INCREF(Mod_singleton);
3068 return Mod_singleton;
3069 case Pow:
3070 Py_INCREF(Pow_singleton);
3071 return Pow_singleton;
3072 case LShift:
3073 Py_INCREF(LShift_singleton);
3074 return LShift_singleton;
3075 case RShift:
3076 Py_INCREF(RShift_singleton);
3077 return RShift_singleton;
3078 case BitOr:
3079 Py_INCREF(BitOr_singleton);
3080 return BitOr_singleton;
3081 case BitXor:
3082 Py_INCREF(BitXor_singleton);
3083 return BitXor_singleton;
3084 case BitAnd:
3085 Py_INCREF(BitAnd_singleton);
3086 return BitAnd_singleton;
3087 case FloorDiv:
3088 Py_INCREF(FloorDiv_singleton);
3089 return FloorDiv_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003090 default:
3091 /* should never happen, but just in case ... */
3092 PyErr_Format(PyExc_SystemError, "unknown operator found");
3093 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003094 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003095}
3096PyObject* ast2obj_unaryop(unaryop_ty o)
3097{
3098 switch(o) {
3099 case Invert:
3100 Py_INCREF(Invert_singleton);
3101 return Invert_singleton;
3102 case Not:
3103 Py_INCREF(Not_singleton);
3104 return Not_singleton;
3105 case UAdd:
3106 Py_INCREF(UAdd_singleton);
3107 return UAdd_singleton;
3108 case USub:
3109 Py_INCREF(USub_singleton);
3110 return USub_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003111 default:
3112 /* should never happen, but just in case ... */
3113 PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3114 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003115 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003116}
3117PyObject* ast2obj_cmpop(cmpop_ty o)
3118{
3119 switch(o) {
3120 case Eq:
3121 Py_INCREF(Eq_singleton);
3122 return Eq_singleton;
3123 case NotEq:
3124 Py_INCREF(NotEq_singleton);
3125 return NotEq_singleton;
3126 case Lt:
3127 Py_INCREF(Lt_singleton);
3128 return Lt_singleton;
3129 case LtE:
3130 Py_INCREF(LtE_singleton);
3131 return LtE_singleton;
3132 case Gt:
3133 Py_INCREF(Gt_singleton);
3134 return Gt_singleton;
3135 case GtE:
3136 Py_INCREF(GtE_singleton);
3137 return GtE_singleton;
3138 case Is:
3139 Py_INCREF(Is_singleton);
3140 return Is_singleton;
3141 case IsNot:
3142 Py_INCREF(IsNot_singleton);
3143 return IsNot_singleton;
3144 case In:
3145 Py_INCREF(In_singleton);
3146 return In_singleton;
3147 case NotIn:
3148 Py_INCREF(NotIn_singleton);
3149 return NotIn_singleton;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003150 default:
3151 /* should never happen, but just in case ... */
3152 PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3153 return NULL;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003154 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003155}
3156PyObject*
3157ast2obj_comprehension(void* _o)
3158{
3159 comprehension_ty o = (comprehension_ty)_o;
3160 PyObject *result = NULL, *value = NULL;
3161 if (!o) {
3162 Py_INCREF(Py_None);
3163 return Py_None;
3164 }
3165
3166 result = PyType_GenericNew(comprehension_type, NULL, NULL);
3167 if (!result) return NULL;
3168 value = ast2obj_expr(o->target);
3169 if (!value) goto failed;
3170 if (PyObject_SetAttrString(result, "target", value) == -1)
3171 goto failed;
3172 Py_DECREF(value);
3173 value = ast2obj_expr(o->iter);
3174 if (!value) goto failed;
3175 if (PyObject_SetAttrString(result, "iter", value) == -1)
3176 goto failed;
3177 Py_DECREF(value);
3178 value = ast2obj_list(o->ifs, ast2obj_expr);
3179 if (!value) goto failed;
3180 if (PyObject_SetAttrString(result, "ifs", value) == -1)
3181 goto failed;
3182 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003183 return result;
3184failed:
3185 Py_XDECREF(value);
3186 Py_XDECREF(result);
3187 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188}
3189
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003190PyObject*
3191ast2obj_excepthandler(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003193 excepthandler_ty o = (excepthandler_ty)_o;
3194 PyObject *result = NULL, *value = NULL;
3195 if (!o) {
3196 Py_INCREF(Py_None);
3197 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003199
Neal Norwitzad74aa82008-03-31 05:14:30 +00003200 switch (o->kind) {
3201 case ExceptHandler_kind:
3202 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3203 if (!result) goto failed;
3204 value = ast2obj_expr(o->v.ExceptHandler.type);
3205 if (!value) goto failed;
3206 if (PyObject_SetAttrString(result, "type", value) == -1)
3207 goto failed;
3208 Py_DECREF(value);
3209 value = ast2obj_identifier(o->v.ExceptHandler.name);
3210 if (!value) goto failed;
3211 if (PyObject_SetAttrString(result, "name", value) == -1)
3212 goto failed;
3213 Py_DECREF(value);
3214 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3215 if (!value) goto failed;
3216 if (PyObject_SetAttrString(result, "body", value) == -1)
3217 goto failed;
3218 Py_DECREF(value);
3219 break;
3220 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003221 value = ast2obj_int(o->lineno);
3222 if (!value) goto failed;
Neal Norwitzad74aa82008-03-31 05:14:30 +00003223 if (PyObject_SetAttrString(result, "lineno", value) < 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003224 goto failed;
3225 Py_DECREF(value);
3226 value = ast2obj_int(o->col_offset);
3227 if (!value) goto failed;
Neal Norwitzad74aa82008-03-31 05:14:30 +00003228 if (PyObject_SetAttrString(result, "col_offset", value) < 0)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003229 goto failed;
3230 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003231 return result;
3232failed:
3233 Py_XDECREF(value);
3234 Py_XDECREF(result);
3235 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003236}
3237
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003238PyObject*
3239ast2obj_arguments(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003241 arguments_ty o = (arguments_ty)_o;
3242 PyObject *result = NULL, *value = NULL;
3243 if (!o) {
3244 Py_INCREF(Py_None);
3245 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003247
3248 result = PyType_GenericNew(arguments_type, NULL, NULL);
3249 if (!result) return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00003250 value = ast2obj_list(o->args, ast2obj_arg);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003251 if (!value) goto failed;
3252 if (PyObject_SetAttrString(result, "args", value) == -1)
3253 goto failed;
3254 Py_DECREF(value);
3255 value = ast2obj_identifier(o->vararg);
3256 if (!value) goto failed;
3257 if (PyObject_SetAttrString(result, "vararg", value) == -1)
3258 goto failed;
3259 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00003260 value = ast2obj_expr(o->varargannotation);
3261 if (!value) goto failed;
3262 if (PyObject_SetAttrString(result, "varargannotation", value) == -1)
3263 goto failed;
3264 Py_DECREF(value);
3265 value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003266 if (!value) goto failed;
3267 if (PyObject_SetAttrString(result, "kwonlyargs", value) == -1)
3268 goto failed;
3269 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003270 value = ast2obj_identifier(o->kwarg);
3271 if (!value) goto failed;
3272 if (PyObject_SetAttrString(result, "kwarg", value) == -1)
3273 goto failed;
3274 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00003275 value = ast2obj_expr(o->kwargannotation);
3276 if (!value) goto failed;
3277 if (PyObject_SetAttrString(result, "kwargannotation", value) == -1)
3278 goto failed;
3279 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003280 value = ast2obj_list(o->defaults, ast2obj_expr);
3281 if (!value) goto failed;
3282 if (PyObject_SetAttrString(result, "defaults", value) == -1)
3283 goto failed;
3284 Py_DECREF(value);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003285 value = ast2obj_list(o->kw_defaults, ast2obj_expr);
3286 if (!value) goto failed;
3287 if (PyObject_SetAttrString(result, "kw_defaults", value) == -1)
3288 goto failed;
3289 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003290 return result;
3291failed:
3292 Py_XDECREF(value);
3293 Py_XDECREF(result);
3294 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295}
3296
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003297PyObject*
Neal Norwitzc1505362006-12-28 06:47:50 +00003298ast2obj_arg(void* _o)
3299{
3300 arg_ty o = (arg_ty)_o;
3301 PyObject *result = NULL, *value = NULL;
3302 if (!o) {
3303 Py_INCREF(Py_None);
3304 return Py_None;
3305 }
3306
Guido van Rossum1bc535d2007-05-15 18:46:22 +00003307 result = PyType_GenericNew(arg_type, NULL, NULL);
3308 if (!result) return NULL;
3309 value = ast2obj_identifier(o->arg);
3310 if (!value) goto failed;
3311 if (PyObject_SetAttrString(result, "arg", value) == -1)
3312 goto failed;
3313 Py_DECREF(value);
3314 value = ast2obj_expr(o->annotation);
3315 if (!value) goto failed;
3316 if (PyObject_SetAttrString(result, "annotation", value) == -1)
3317 goto failed;
3318 Py_DECREF(value);
Neal Norwitzc1505362006-12-28 06:47:50 +00003319 return result;
3320failed:
3321 Py_XDECREF(value);
3322 Py_XDECREF(result);
3323 return NULL;
3324}
3325
3326PyObject*
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003327ast2obj_keyword(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003329 keyword_ty o = (keyword_ty)_o;
3330 PyObject *result = NULL, *value = NULL;
3331 if (!o) {
3332 Py_INCREF(Py_None);
3333 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003334 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003335
3336 result = PyType_GenericNew(keyword_type, NULL, NULL);
3337 if (!result) return NULL;
3338 value = ast2obj_identifier(o->arg);
3339 if (!value) goto failed;
3340 if (PyObject_SetAttrString(result, "arg", value) == -1)
3341 goto failed;
3342 Py_DECREF(value);
3343 value = ast2obj_expr(o->value);
3344 if (!value) goto failed;
3345 if (PyObject_SetAttrString(result, "value", value) == -1)
3346 goto failed;
3347 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003348 return result;
3349failed:
3350 Py_XDECREF(value);
3351 Py_XDECREF(result);
3352 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353}
3354
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003355PyObject*
3356ast2obj_alias(void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003358 alias_ty o = (alias_ty)_o;
3359 PyObject *result = NULL, *value = NULL;
3360 if (!o) {
3361 Py_INCREF(Py_None);
3362 return Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363 }
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003364
3365 result = PyType_GenericNew(alias_type, NULL, NULL);
3366 if (!result) return NULL;
3367 value = ast2obj_identifier(o->name);
3368 if (!value) goto failed;
3369 if (PyObject_SetAttrString(result, "name", value) == -1)
3370 goto failed;
3371 Py_DECREF(value);
3372 value = ast2obj_identifier(o->asname);
3373 if (!value) goto failed;
3374 if (PyObject_SetAttrString(result, "asname", value) == -1)
3375 goto failed;
3376 Py_DECREF(value);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003377 return result;
3378failed:
3379 Py_XDECREF(value);
3380 Py_XDECREF(result);
3381 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003382}
3383
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003385int
3386obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3387{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003388 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003389
Benjamin Petersond8f65972010-11-20 04:31:07 +00003390 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003391
3392 if (obj == Py_None) {
3393 *out = NULL;
3394 return 0;
3395 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003396 isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3397 if (isinstance == -1) {
3398 return 1;
3399 }
3400 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003401 asdl_seq* body;
3402
3403 if (PyObject_HasAttrString(obj, "body")) {
3404 int res;
3405 Py_ssize_t len;
3406 Py_ssize_t i;
3407 tmp = PyObject_GetAttrString(obj, "body");
3408 if (tmp == NULL) goto failed;
3409 if (!PyList_Check(tmp)) {
3410 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3411 goto failed;
3412 }
3413 len = PyList_GET_SIZE(tmp);
3414 body = asdl_seq_new(len, arena);
3415 if (body == NULL) goto failed;
3416 for (i = 0; i < len; i++) {
3417 stmt_ty value;
3418 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3419 if (res != 0) goto failed;
3420 asdl_seq_SET(body, i, value);
3421 }
3422 Py_XDECREF(tmp);
3423 tmp = NULL;
3424 } else {
3425 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
3426 return 1;
3427 }
3428 *out = Module(body, arena);
3429 if (*out == NULL) goto failed;
3430 return 0;
3431 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003432 isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
3433 if (isinstance == -1) {
3434 return 1;
3435 }
3436 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003437 asdl_seq* body;
3438
3439 if (PyObject_HasAttrString(obj, "body")) {
3440 int res;
3441 Py_ssize_t len;
3442 Py_ssize_t i;
3443 tmp = PyObject_GetAttrString(obj, "body");
3444 if (tmp == NULL) goto failed;
3445 if (!PyList_Check(tmp)) {
3446 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3447 goto failed;
3448 }
3449 len = PyList_GET_SIZE(tmp);
3450 body = asdl_seq_new(len, arena);
3451 if (body == NULL) goto failed;
3452 for (i = 0; i < len; i++) {
3453 stmt_ty value;
3454 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3455 if (res != 0) goto failed;
3456 asdl_seq_SET(body, i, value);
3457 }
3458 Py_XDECREF(tmp);
3459 tmp = NULL;
3460 } else {
3461 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
3462 return 1;
3463 }
3464 *out = Interactive(body, arena);
3465 if (*out == NULL) goto failed;
3466 return 0;
3467 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003468 isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
3469 if (isinstance == -1) {
3470 return 1;
3471 }
3472 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003473 expr_ty body;
3474
3475 if (PyObject_HasAttrString(obj, "body")) {
3476 int res;
3477 tmp = PyObject_GetAttrString(obj, "body");
3478 if (tmp == NULL) goto failed;
3479 res = obj2ast_expr(tmp, &body, arena);
3480 if (res != 0) goto failed;
3481 Py_XDECREF(tmp);
3482 tmp = NULL;
3483 } else {
3484 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
3485 return 1;
3486 }
3487 *out = Expression(body, arena);
3488 if (*out == NULL) goto failed;
3489 return 0;
3490 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003491 isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
3492 if (isinstance == -1) {
3493 return 1;
3494 }
3495 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003496 asdl_seq* body;
3497
3498 if (PyObject_HasAttrString(obj, "body")) {
3499 int res;
3500 Py_ssize_t len;
3501 Py_ssize_t i;
3502 tmp = PyObject_GetAttrString(obj, "body");
3503 if (tmp == NULL) goto failed;
3504 if (!PyList_Check(tmp)) {
3505 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3506 goto failed;
3507 }
3508 len = PyList_GET_SIZE(tmp);
3509 body = asdl_seq_new(len, arena);
3510 if (body == NULL) goto failed;
3511 for (i = 0; i < len; i++) {
3512 stmt_ty value;
3513 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3514 if (res != 0) goto failed;
3515 asdl_seq_SET(body, i, value);
3516 }
3517 Py_XDECREF(tmp);
3518 tmp = NULL;
3519 } else {
3520 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
3521 return 1;
3522 }
3523 *out = Suite(body, arena);
3524 if (*out == NULL) goto failed;
3525 return 0;
3526 }
3527
Benjamin Peterson5b066812010-11-20 01:38:49 +00003528 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
3529 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00003530 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003531 return 1;
3532}
3533
3534int
3535obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
3536{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003537 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003538
Benjamin Petersond8f65972010-11-20 04:31:07 +00003539 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003540 int lineno;
3541 int col_offset;
3542
3543 if (obj == Py_None) {
3544 *out = NULL;
3545 return 0;
3546 }
3547 if (PyObject_HasAttrString(obj, "lineno")) {
3548 int res;
3549 tmp = PyObject_GetAttrString(obj, "lineno");
3550 if (tmp == NULL) goto failed;
3551 res = obj2ast_int(tmp, &lineno, arena);
3552 if (res != 0) goto failed;
3553 Py_XDECREF(tmp);
3554 tmp = NULL;
3555 } else {
3556 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
3557 return 1;
3558 }
3559 if (PyObject_HasAttrString(obj, "col_offset")) {
3560 int res;
3561 tmp = PyObject_GetAttrString(obj, "col_offset");
3562 if (tmp == NULL) goto failed;
3563 res = obj2ast_int(tmp, &col_offset, arena);
3564 if (res != 0) goto failed;
3565 Py_XDECREF(tmp);
3566 tmp = NULL;
3567 } else {
3568 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
3569 return 1;
3570 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003571 isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
3572 if (isinstance == -1) {
3573 return 1;
3574 }
3575 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003576 identifier name;
3577 arguments_ty args;
3578 asdl_seq* body;
3579 asdl_seq* decorator_list;
3580 expr_ty returns;
3581
3582 if (PyObject_HasAttrString(obj, "name")) {
3583 int res;
3584 tmp = PyObject_GetAttrString(obj, "name");
3585 if (tmp == NULL) goto failed;
3586 res = obj2ast_identifier(tmp, &name, arena);
3587 if (res != 0) goto failed;
3588 Py_XDECREF(tmp);
3589 tmp = NULL;
3590 } else {
3591 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
3592 return 1;
3593 }
3594 if (PyObject_HasAttrString(obj, "args")) {
3595 int res;
3596 tmp = PyObject_GetAttrString(obj, "args");
3597 if (tmp == NULL) goto failed;
3598 res = obj2ast_arguments(tmp, &args, arena);
3599 if (res != 0) goto failed;
3600 Py_XDECREF(tmp);
3601 tmp = NULL;
3602 } else {
3603 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
3604 return 1;
3605 }
3606 if (PyObject_HasAttrString(obj, "body")) {
3607 int res;
3608 Py_ssize_t len;
3609 Py_ssize_t i;
3610 tmp = PyObject_GetAttrString(obj, "body");
3611 if (tmp == NULL) goto failed;
3612 if (!PyList_Check(tmp)) {
3613 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3614 goto failed;
3615 }
3616 len = PyList_GET_SIZE(tmp);
3617 body = asdl_seq_new(len, arena);
3618 if (body == NULL) goto failed;
3619 for (i = 0; i < len; i++) {
3620 stmt_ty value;
3621 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3622 if (res != 0) goto failed;
3623 asdl_seq_SET(body, i, value);
3624 }
3625 Py_XDECREF(tmp);
3626 tmp = NULL;
3627 } else {
3628 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
3629 return 1;
3630 }
3631 if (PyObject_HasAttrString(obj, "decorator_list")) {
3632 int res;
3633 Py_ssize_t len;
3634 Py_ssize_t i;
3635 tmp = PyObject_GetAttrString(obj, "decorator_list");
3636 if (tmp == NULL) goto failed;
3637 if (!PyList_Check(tmp)) {
3638 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3639 goto failed;
3640 }
3641 len = PyList_GET_SIZE(tmp);
3642 decorator_list = asdl_seq_new(len, arena);
3643 if (decorator_list == NULL) goto failed;
3644 for (i = 0; i < len; i++) {
3645 expr_ty value;
3646 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3647 if (res != 0) goto failed;
3648 asdl_seq_SET(decorator_list, i, value);
3649 }
3650 Py_XDECREF(tmp);
3651 tmp = NULL;
3652 } else {
3653 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
3654 return 1;
3655 }
3656 if (PyObject_HasAttrString(obj, "returns")) {
3657 int res;
3658 tmp = PyObject_GetAttrString(obj, "returns");
3659 if (tmp == NULL) goto failed;
3660 res = obj2ast_expr(tmp, &returns, arena);
3661 if (res != 0) goto failed;
3662 Py_XDECREF(tmp);
3663 tmp = NULL;
3664 } else {
3665 returns = NULL;
3666 }
3667 *out = FunctionDef(name, args, body, decorator_list, returns,
3668 lineno, col_offset, arena);
3669 if (*out == NULL) goto failed;
3670 return 0;
3671 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003672 isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
3673 if (isinstance == -1) {
3674 return 1;
3675 }
3676 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003677 identifier name;
3678 asdl_seq* bases;
3679 asdl_seq* keywords;
3680 expr_ty starargs;
3681 expr_ty kwargs;
3682 asdl_seq* body;
3683 asdl_seq* decorator_list;
3684
3685 if (PyObject_HasAttrString(obj, "name")) {
3686 int res;
3687 tmp = PyObject_GetAttrString(obj, "name");
3688 if (tmp == NULL) goto failed;
3689 res = obj2ast_identifier(tmp, &name, arena);
3690 if (res != 0) goto failed;
3691 Py_XDECREF(tmp);
3692 tmp = NULL;
3693 } else {
3694 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
3695 return 1;
3696 }
3697 if (PyObject_HasAttrString(obj, "bases")) {
3698 int res;
3699 Py_ssize_t len;
3700 Py_ssize_t i;
3701 tmp = PyObject_GetAttrString(obj, "bases");
3702 if (tmp == NULL) goto failed;
3703 if (!PyList_Check(tmp)) {
3704 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3705 goto failed;
3706 }
3707 len = PyList_GET_SIZE(tmp);
3708 bases = asdl_seq_new(len, arena);
3709 if (bases == NULL) goto failed;
3710 for (i = 0; i < len; i++) {
3711 expr_ty value;
3712 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3713 if (res != 0) goto failed;
3714 asdl_seq_SET(bases, i, value);
3715 }
3716 Py_XDECREF(tmp);
3717 tmp = NULL;
3718 } else {
3719 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
3720 return 1;
3721 }
3722 if (PyObject_HasAttrString(obj, "keywords")) {
3723 int res;
3724 Py_ssize_t len;
3725 Py_ssize_t i;
3726 tmp = PyObject_GetAttrString(obj, "keywords");
3727 if (tmp == NULL) goto failed;
3728 if (!PyList_Check(tmp)) {
3729 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3730 goto failed;
3731 }
3732 len = PyList_GET_SIZE(tmp);
3733 keywords = asdl_seq_new(len, arena);
3734 if (keywords == NULL) goto failed;
3735 for (i = 0; i < len; i++) {
3736 keyword_ty value;
3737 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &value, arena);
3738 if (res != 0) goto failed;
3739 asdl_seq_SET(keywords, i, value);
3740 }
3741 Py_XDECREF(tmp);
3742 tmp = NULL;
3743 } else {
3744 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
3745 return 1;
3746 }
3747 if (PyObject_HasAttrString(obj, "starargs")) {
3748 int res;
3749 tmp = PyObject_GetAttrString(obj, "starargs");
3750 if (tmp == NULL) goto failed;
3751 res = obj2ast_expr(tmp, &starargs, arena);
3752 if (res != 0) goto failed;
3753 Py_XDECREF(tmp);
3754 tmp = NULL;
3755 } else {
3756 starargs = NULL;
3757 }
3758 if (PyObject_HasAttrString(obj, "kwargs")) {
3759 int res;
3760 tmp = PyObject_GetAttrString(obj, "kwargs");
3761 if (tmp == NULL) goto failed;
3762 res = obj2ast_expr(tmp, &kwargs, arena);
3763 if (res != 0) goto failed;
3764 Py_XDECREF(tmp);
3765 tmp = NULL;
3766 } else {
3767 kwargs = NULL;
3768 }
3769 if (PyObject_HasAttrString(obj, "body")) {
3770 int res;
3771 Py_ssize_t len;
3772 Py_ssize_t i;
3773 tmp = PyObject_GetAttrString(obj, "body");
3774 if (tmp == NULL) goto failed;
3775 if (!PyList_Check(tmp)) {
3776 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3777 goto failed;
3778 }
3779 len = PyList_GET_SIZE(tmp);
3780 body = asdl_seq_new(len, arena);
3781 if (body == NULL) goto failed;
3782 for (i = 0; i < len; i++) {
3783 stmt_ty value;
3784 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3785 if (res != 0) goto failed;
3786 asdl_seq_SET(body, i, value);
3787 }
3788 Py_XDECREF(tmp);
3789 tmp = NULL;
3790 } else {
3791 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
3792 return 1;
3793 }
3794 if (PyObject_HasAttrString(obj, "decorator_list")) {
3795 int res;
3796 Py_ssize_t len;
3797 Py_ssize_t i;
3798 tmp = PyObject_GetAttrString(obj, "decorator_list");
3799 if (tmp == NULL) goto failed;
3800 if (!PyList_Check(tmp)) {
3801 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3802 goto failed;
3803 }
3804 len = PyList_GET_SIZE(tmp);
3805 decorator_list = asdl_seq_new(len, arena);
3806 if (decorator_list == NULL) goto failed;
3807 for (i = 0; i < len; i++) {
3808 expr_ty value;
3809 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3810 if (res != 0) goto failed;
3811 asdl_seq_SET(decorator_list, i, value);
3812 }
3813 Py_XDECREF(tmp);
3814 tmp = NULL;
3815 } else {
3816 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
3817 return 1;
3818 }
3819 *out = ClassDef(name, bases, keywords, starargs, kwargs, body,
3820 decorator_list, lineno, col_offset, arena);
3821 if (*out == NULL) goto failed;
3822 return 0;
3823 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003824 isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
3825 if (isinstance == -1) {
3826 return 1;
3827 }
3828 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003829 expr_ty value;
3830
3831 if (PyObject_HasAttrString(obj, "value")) {
3832 int res;
3833 tmp = PyObject_GetAttrString(obj, "value");
3834 if (tmp == NULL) goto failed;
3835 res = obj2ast_expr(tmp, &value, arena);
3836 if (res != 0) goto failed;
3837 Py_XDECREF(tmp);
3838 tmp = NULL;
3839 } else {
3840 value = NULL;
3841 }
3842 *out = Return(value, lineno, col_offset, arena);
3843 if (*out == NULL) goto failed;
3844 return 0;
3845 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003846 isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
3847 if (isinstance == -1) {
3848 return 1;
3849 }
3850 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003851 asdl_seq* targets;
3852
3853 if (PyObject_HasAttrString(obj, "targets")) {
3854 int res;
3855 Py_ssize_t len;
3856 Py_ssize_t i;
3857 tmp = PyObject_GetAttrString(obj, "targets");
3858 if (tmp == NULL) goto failed;
3859 if (!PyList_Check(tmp)) {
3860 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3861 goto failed;
3862 }
3863 len = PyList_GET_SIZE(tmp);
3864 targets = asdl_seq_new(len, arena);
3865 if (targets == NULL) goto failed;
3866 for (i = 0; i < len; i++) {
3867 expr_ty value;
3868 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3869 if (res != 0) goto failed;
3870 asdl_seq_SET(targets, i, value);
3871 }
3872 Py_XDECREF(tmp);
3873 tmp = NULL;
3874 } else {
3875 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
3876 return 1;
3877 }
3878 *out = Delete(targets, lineno, col_offset, arena);
3879 if (*out == NULL) goto failed;
3880 return 0;
3881 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003882 isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
3883 if (isinstance == -1) {
3884 return 1;
3885 }
3886 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003887 asdl_seq* targets;
3888 expr_ty value;
3889
3890 if (PyObject_HasAttrString(obj, "targets")) {
3891 int res;
3892 Py_ssize_t len;
3893 Py_ssize_t i;
3894 tmp = PyObject_GetAttrString(obj, "targets");
3895 if (tmp == NULL) goto failed;
3896 if (!PyList_Check(tmp)) {
3897 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3898 goto failed;
3899 }
3900 len = PyList_GET_SIZE(tmp);
3901 targets = asdl_seq_new(len, arena);
3902 if (targets == NULL) goto failed;
3903 for (i = 0; i < len; i++) {
3904 expr_ty value;
3905 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3906 if (res != 0) goto failed;
3907 asdl_seq_SET(targets, i, value);
3908 }
3909 Py_XDECREF(tmp);
3910 tmp = NULL;
3911 } else {
3912 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
3913 return 1;
3914 }
3915 if (PyObject_HasAttrString(obj, "value")) {
3916 int res;
3917 tmp = PyObject_GetAttrString(obj, "value");
3918 if (tmp == NULL) goto failed;
3919 res = obj2ast_expr(tmp, &value, arena);
3920 if (res != 0) goto failed;
3921 Py_XDECREF(tmp);
3922 tmp = NULL;
3923 } else {
3924 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
3925 return 1;
3926 }
3927 *out = Assign(targets, value, lineno, col_offset, arena);
3928 if (*out == NULL) goto failed;
3929 return 0;
3930 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003931 isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
3932 if (isinstance == -1) {
3933 return 1;
3934 }
3935 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003936 expr_ty target;
3937 operator_ty op;
3938 expr_ty value;
3939
3940 if (PyObject_HasAttrString(obj, "target")) {
3941 int res;
3942 tmp = PyObject_GetAttrString(obj, "target");
3943 if (tmp == NULL) goto failed;
3944 res = obj2ast_expr(tmp, &target, arena);
3945 if (res != 0) goto failed;
3946 Py_XDECREF(tmp);
3947 tmp = NULL;
3948 } else {
3949 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
3950 return 1;
3951 }
3952 if (PyObject_HasAttrString(obj, "op")) {
3953 int res;
3954 tmp = PyObject_GetAttrString(obj, "op");
3955 if (tmp == NULL) goto failed;
3956 res = obj2ast_operator(tmp, &op, arena);
3957 if (res != 0) goto failed;
3958 Py_XDECREF(tmp);
3959 tmp = NULL;
3960 } else {
3961 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
3962 return 1;
3963 }
3964 if (PyObject_HasAttrString(obj, "value")) {
3965 int res;
3966 tmp = PyObject_GetAttrString(obj, "value");
3967 if (tmp == NULL) goto failed;
3968 res = obj2ast_expr(tmp, &value, arena);
3969 if (res != 0) goto failed;
3970 Py_XDECREF(tmp);
3971 tmp = NULL;
3972 } else {
3973 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
3974 return 1;
3975 }
3976 *out = AugAssign(target, op, value, lineno, col_offset, arena);
3977 if (*out == NULL) goto failed;
3978 return 0;
3979 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00003980 isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
3981 if (isinstance == -1) {
3982 return 1;
3983 }
3984 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003985 expr_ty target;
3986 expr_ty iter;
3987 asdl_seq* body;
3988 asdl_seq* orelse;
3989
3990 if (PyObject_HasAttrString(obj, "target")) {
3991 int res;
3992 tmp = PyObject_GetAttrString(obj, "target");
3993 if (tmp == NULL) goto failed;
3994 res = obj2ast_expr(tmp, &target, arena);
3995 if (res != 0) goto failed;
3996 Py_XDECREF(tmp);
3997 tmp = NULL;
3998 } else {
3999 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
4000 return 1;
4001 }
4002 if (PyObject_HasAttrString(obj, "iter")) {
4003 int res;
4004 tmp = PyObject_GetAttrString(obj, "iter");
4005 if (tmp == NULL) goto failed;
4006 res = obj2ast_expr(tmp, &iter, arena);
4007 if (res != 0) goto failed;
4008 Py_XDECREF(tmp);
4009 tmp = NULL;
4010 } else {
4011 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
4012 return 1;
4013 }
4014 if (PyObject_HasAttrString(obj, "body")) {
4015 int res;
4016 Py_ssize_t len;
4017 Py_ssize_t i;
4018 tmp = PyObject_GetAttrString(obj, "body");
4019 if (tmp == NULL) goto failed;
4020 if (!PyList_Check(tmp)) {
4021 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4022 goto failed;
4023 }
4024 len = PyList_GET_SIZE(tmp);
4025 body = asdl_seq_new(len, arena);
4026 if (body == NULL) goto failed;
4027 for (i = 0; i < len; i++) {
4028 stmt_ty value;
4029 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4030 if (res != 0) goto failed;
4031 asdl_seq_SET(body, i, value);
4032 }
4033 Py_XDECREF(tmp);
4034 tmp = NULL;
4035 } else {
4036 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
4037 return 1;
4038 }
4039 if (PyObject_HasAttrString(obj, "orelse")) {
4040 int res;
4041 Py_ssize_t len;
4042 Py_ssize_t i;
4043 tmp = PyObject_GetAttrString(obj, "orelse");
4044 if (tmp == NULL) goto failed;
4045 if (!PyList_Check(tmp)) {
4046 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4047 goto failed;
4048 }
4049 len = PyList_GET_SIZE(tmp);
4050 orelse = asdl_seq_new(len, arena);
4051 if (orelse == NULL) goto failed;
4052 for (i = 0; i < len; i++) {
4053 stmt_ty value;
4054 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4055 if (res != 0) goto failed;
4056 asdl_seq_SET(orelse, i, value);
4057 }
4058 Py_XDECREF(tmp);
4059 tmp = NULL;
4060 } else {
4061 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
4062 return 1;
4063 }
4064 *out = For(target, iter, body, orelse, lineno, col_offset,
4065 arena);
4066 if (*out == NULL) goto failed;
4067 return 0;
4068 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004069 isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
4070 if (isinstance == -1) {
4071 return 1;
4072 }
4073 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004074 expr_ty test;
4075 asdl_seq* body;
4076 asdl_seq* orelse;
4077
4078 if (PyObject_HasAttrString(obj, "test")) {
4079 int res;
4080 tmp = PyObject_GetAttrString(obj, "test");
4081 if (tmp == NULL) goto failed;
4082 res = obj2ast_expr(tmp, &test, arena);
4083 if (res != 0) goto failed;
4084 Py_XDECREF(tmp);
4085 tmp = NULL;
4086 } else {
4087 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
4088 return 1;
4089 }
4090 if (PyObject_HasAttrString(obj, "body")) {
4091 int res;
4092 Py_ssize_t len;
4093 Py_ssize_t i;
4094 tmp = PyObject_GetAttrString(obj, "body");
4095 if (tmp == NULL) goto failed;
4096 if (!PyList_Check(tmp)) {
4097 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4098 goto failed;
4099 }
4100 len = PyList_GET_SIZE(tmp);
4101 body = asdl_seq_new(len, arena);
4102 if (body == NULL) goto failed;
4103 for (i = 0; i < len; i++) {
4104 stmt_ty value;
4105 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4106 if (res != 0) goto failed;
4107 asdl_seq_SET(body, i, value);
4108 }
4109 Py_XDECREF(tmp);
4110 tmp = NULL;
4111 } else {
4112 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
4113 return 1;
4114 }
4115 if (PyObject_HasAttrString(obj, "orelse")) {
4116 int res;
4117 Py_ssize_t len;
4118 Py_ssize_t i;
4119 tmp = PyObject_GetAttrString(obj, "orelse");
4120 if (tmp == NULL) goto failed;
4121 if (!PyList_Check(tmp)) {
4122 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4123 goto failed;
4124 }
4125 len = PyList_GET_SIZE(tmp);
4126 orelse = asdl_seq_new(len, arena);
4127 if (orelse == NULL) goto failed;
4128 for (i = 0; i < len; i++) {
4129 stmt_ty value;
4130 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4131 if (res != 0) goto failed;
4132 asdl_seq_SET(orelse, i, value);
4133 }
4134 Py_XDECREF(tmp);
4135 tmp = NULL;
4136 } else {
4137 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
4138 return 1;
4139 }
4140 *out = While(test, body, orelse, lineno, col_offset, arena);
4141 if (*out == NULL) goto failed;
4142 return 0;
4143 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004144 isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
4145 if (isinstance == -1) {
4146 return 1;
4147 }
4148 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004149 expr_ty test;
4150 asdl_seq* body;
4151 asdl_seq* orelse;
4152
4153 if (PyObject_HasAttrString(obj, "test")) {
4154 int res;
4155 tmp = PyObject_GetAttrString(obj, "test");
4156 if (tmp == NULL) goto failed;
4157 res = obj2ast_expr(tmp, &test, arena);
4158 if (res != 0) goto failed;
4159 Py_XDECREF(tmp);
4160 tmp = NULL;
4161 } else {
4162 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
4163 return 1;
4164 }
4165 if (PyObject_HasAttrString(obj, "body")) {
4166 int res;
4167 Py_ssize_t len;
4168 Py_ssize_t i;
4169 tmp = PyObject_GetAttrString(obj, "body");
4170 if (tmp == NULL) goto failed;
4171 if (!PyList_Check(tmp)) {
4172 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4173 goto failed;
4174 }
4175 len = PyList_GET_SIZE(tmp);
4176 body = asdl_seq_new(len, arena);
4177 if (body == NULL) goto failed;
4178 for (i = 0; i < len; i++) {
4179 stmt_ty value;
4180 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4181 if (res != 0) goto failed;
4182 asdl_seq_SET(body, i, value);
4183 }
4184 Py_XDECREF(tmp);
4185 tmp = NULL;
4186 } else {
4187 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
4188 return 1;
4189 }
4190 if (PyObject_HasAttrString(obj, "orelse")) {
4191 int res;
4192 Py_ssize_t len;
4193 Py_ssize_t i;
4194 tmp = PyObject_GetAttrString(obj, "orelse");
4195 if (tmp == NULL) goto failed;
4196 if (!PyList_Check(tmp)) {
4197 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4198 goto failed;
4199 }
4200 len = PyList_GET_SIZE(tmp);
4201 orelse = asdl_seq_new(len, arena);
4202 if (orelse == NULL) goto failed;
4203 for (i = 0; i < len; i++) {
4204 stmt_ty value;
4205 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4206 if (res != 0) goto failed;
4207 asdl_seq_SET(orelse, i, value);
4208 }
4209 Py_XDECREF(tmp);
4210 tmp = NULL;
4211 } else {
4212 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
4213 return 1;
4214 }
4215 *out = If(test, body, orelse, lineno, col_offset, arena);
4216 if (*out == NULL) goto failed;
4217 return 0;
4218 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004219 isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
4220 if (isinstance == -1) {
4221 return 1;
4222 }
4223 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004224 expr_ty context_expr;
4225 expr_ty optional_vars;
4226 asdl_seq* body;
4227
4228 if (PyObject_HasAttrString(obj, "context_expr")) {
4229 int res;
4230 tmp = PyObject_GetAttrString(obj, "context_expr");
4231 if (tmp == NULL) goto failed;
4232 res = obj2ast_expr(tmp, &context_expr, arena);
4233 if (res != 0) goto failed;
4234 Py_XDECREF(tmp);
4235 tmp = NULL;
4236 } else {
4237 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from With");
4238 return 1;
4239 }
4240 if (PyObject_HasAttrString(obj, "optional_vars")) {
4241 int res;
4242 tmp = PyObject_GetAttrString(obj, "optional_vars");
4243 if (tmp == NULL) goto failed;
4244 res = obj2ast_expr(tmp, &optional_vars, arena);
4245 if (res != 0) goto failed;
4246 Py_XDECREF(tmp);
4247 tmp = NULL;
4248 } else {
4249 optional_vars = NULL;
4250 }
4251 if (PyObject_HasAttrString(obj, "body")) {
4252 int res;
4253 Py_ssize_t len;
4254 Py_ssize_t i;
4255 tmp = PyObject_GetAttrString(obj, "body");
4256 if (tmp == NULL) goto failed;
4257 if (!PyList_Check(tmp)) {
4258 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4259 goto failed;
4260 }
4261 len = PyList_GET_SIZE(tmp);
4262 body = asdl_seq_new(len, arena);
4263 if (body == NULL) goto failed;
4264 for (i = 0; i < len; i++) {
4265 stmt_ty value;
4266 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4267 if (res != 0) goto failed;
4268 asdl_seq_SET(body, i, value);
4269 }
4270 Py_XDECREF(tmp);
4271 tmp = NULL;
4272 } else {
4273 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
4274 return 1;
4275 }
4276 *out = With(context_expr, optional_vars, body, lineno,
4277 col_offset, arena);
4278 if (*out == NULL) goto failed;
4279 return 0;
4280 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004281 isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
4282 if (isinstance == -1) {
4283 return 1;
4284 }
4285 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004286 expr_ty exc;
4287 expr_ty cause;
4288
4289 if (PyObject_HasAttrString(obj, "exc")) {
4290 int res;
4291 tmp = PyObject_GetAttrString(obj, "exc");
4292 if (tmp == NULL) goto failed;
4293 res = obj2ast_expr(tmp, &exc, arena);
4294 if (res != 0) goto failed;
4295 Py_XDECREF(tmp);
4296 tmp = NULL;
4297 } else {
4298 exc = NULL;
4299 }
4300 if (PyObject_HasAttrString(obj, "cause")) {
4301 int res;
4302 tmp = PyObject_GetAttrString(obj, "cause");
4303 if (tmp == NULL) goto failed;
4304 res = obj2ast_expr(tmp, &cause, arena);
4305 if (res != 0) goto failed;
4306 Py_XDECREF(tmp);
4307 tmp = NULL;
4308 } else {
4309 cause = NULL;
4310 }
4311 *out = Raise(exc, cause, lineno, col_offset, arena);
4312 if (*out == NULL) goto failed;
4313 return 0;
4314 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004315 isinstance = PyObject_IsInstance(obj, (PyObject*)TryExcept_type);
4316 if (isinstance == -1) {
4317 return 1;
4318 }
4319 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004320 asdl_seq* body;
4321 asdl_seq* handlers;
4322 asdl_seq* orelse;
4323
4324 if (PyObject_HasAttrString(obj, "body")) {
4325 int res;
4326 Py_ssize_t len;
4327 Py_ssize_t i;
4328 tmp = PyObject_GetAttrString(obj, "body");
4329 if (tmp == NULL) goto failed;
4330 if (!PyList_Check(tmp)) {
4331 PyErr_Format(PyExc_TypeError, "TryExcept field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4332 goto failed;
4333 }
4334 len = PyList_GET_SIZE(tmp);
4335 body = asdl_seq_new(len, arena);
4336 if (body == NULL) goto failed;
4337 for (i = 0; i < len; i++) {
4338 stmt_ty value;
4339 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4340 if (res != 0) goto failed;
4341 asdl_seq_SET(body, i, value);
4342 }
4343 Py_XDECREF(tmp);
4344 tmp = NULL;
4345 } else {
4346 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryExcept");
4347 return 1;
4348 }
4349 if (PyObject_HasAttrString(obj, "handlers")) {
4350 int res;
4351 Py_ssize_t len;
4352 Py_ssize_t i;
4353 tmp = PyObject_GetAttrString(obj, "handlers");
4354 if (tmp == NULL) goto failed;
4355 if (!PyList_Check(tmp)) {
4356 PyErr_Format(PyExc_TypeError, "TryExcept field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4357 goto failed;
4358 }
4359 len = PyList_GET_SIZE(tmp);
4360 handlers = asdl_seq_new(len, arena);
4361 if (handlers == NULL) goto failed;
4362 for (i = 0; i < len; i++) {
4363 excepthandler_ty value;
4364 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &value, arena);
4365 if (res != 0) goto failed;
4366 asdl_seq_SET(handlers, i, value);
4367 }
4368 Py_XDECREF(tmp);
4369 tmp = NULL;
4370 } else {
4371 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from TryExcept");
4372 return 1;
4373 }
4374 if (PyObject_HasAttrString(obj, "orelse")) {
4375 int res;
4376 Py_ssize_t len;
4377 Py_ssize_t i;
4378 tmp = PyObject_GetAttrString(obj, "orelse");
4379 if (tmp == NULL) goto failed;
4380 if (!PyList_Check(tmp)) {
4381 PyErr_Format(PyExc_TypeError, "TryExcept field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4382 goto failed;
4383 }
4384 len = PyList_GET_SIZE(tmp);
4385 orelse = asdl_seq_new(len, arena);
4386 if (orelse == NULL) goto failed;
4387 for (i = 0; i < len; i++) {
4388 stmt_ty value;
4389 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4390 if (res != 0) goto failed;
4391 asdl_seq_SET(orelse, i, value);
4392 }
4393 Py_XDECREF(tmp);
4394 tmp = NULL;
4395 } else {
4396 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from TryExcept");
4397 return 1;
4398 }
4399 *out = TryExcept(body, handlers, orelse, lineno, col_offset,
4400 arena);
4401 if (*out == NULL) goto failed;
4402 return 0;
4403 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004404 isinstance = PyObject_IsInstance(obj, (PyObject*)TryFinally_type);
4405 if (isinstance == -1) {
4406 return 1;
4407 }
4408 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004409 asdl_seq* body;
4410 asdl_seq* finalbody;
4411
4412 if (PyObject_HasAttrString(obj, "body")) {
4413 int res;
4414 Py_ssize_t len;
4415 Py_ssize_t i;
4416 tmp = PyObject_GetAttrString(obj, "body");
4417 if (tmp == NULL) goto failed;
4418 if (!PyList_Check(tmp)) {
4419 PyErr_Format(PyExc_TypeError, "TryFinally field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4420 goto failed;
4421 }
4422 len = PyList_GET_SIZE(tmp);
4423 body = asdl_seq_new(len, arena);
4424 if (body == NULL) goto failed;
4425 for (i = 0; i < len; i++) {
4426 stmt_ty value;
4427 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4428 if (res != 0) goto failed;
4429 asdl_seq_SET(body, i, value);
4430 }
4431 Py_XDECREF(tmp);
4432 tmp = NULL;
4433 } else {
4434 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryFinally");
4435 return 1;
4436 }
4437 if (PyObject_HasAttrString(obj, "finalbody")) {
4438 int res;
4439 Py_ssize_t len;
4440 Py_ssize_t i;
4441 tmp = PyObject_GetAttrString(obj, "finalbody");
4442 if (tmp == NULL) goto failed;
4443 if (!PyList_Check(tmp)) {
4444 PyErr_Format(PyExc_TypeError, "TryFinally field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4445 goto failed;
4446 }
4447 len = PyList_GET_SIZE(tmp);
4448 finalbody = asdl_seq_new(len, arena);
4449 if (finalbody == NULL) goto failed;
4450 for (i = 0; i < len; i++) {
4451 stmt_ty value;
4452 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4453 if (res != 0) goto failed;
4454 asdl_seq_SET(finalbody, i, value);
4455 }
4456 Py_XDECREF(tmp);
4457 tmp = NULL;
4458 } else {
4459 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from TryFinally");
4460 return 1;
4461 }
4462 *out = TryFinally(body, finalbody, lineno, col_offset, arena);
4463 if (*out == NULL) goto failed;
4464 return 0;
4465 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004466 isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
4467 if (isinstance == -1) {
4468 return 1;
4469 }
4470 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004471 expr_ty test;
4472 expr_ty msg;
4473
4474 if (PyObject_HasAttrString(obj, "test")) {
4475 int res;
4476 tmp = PyObject_GetAttrString(obj, "test");
4477 if (tmp == NULL) goto failed;
4478 res = obj2ast_expr(tmp, &test, arena);
4479 if (res != 0) goto failed;
4480 Py_XDECREF(tmp);
4481 tmp = NULL;
4482 } else {
4483 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
4484 return 1;
4485 }
4486 if (PyObject_HasAttrString(obj, "msg")) {
4487 int res;
4488 tmp = PyObject_GetAttrString(obj, "msg");
4489 if (tmp == NULL) goto failed;
4490 res = obj2ast_expr(tmp, &msg, arena);
4491 if (res != 0) goto failed;
4492 Py_XDECREF(tmp);
4493 tmp = NULL;
4494 } else {
4495 msg = NULL;
4496 }
4497 *out = Assert(test, msg, lineno, col_offset, arena);
4498 if (*out == NULL) goto failed;
4499 return 0;
4500 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004501 isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
4502 if (isinstance == -1) {
4503 return 1;
4504 }
4505 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004506 asdl_seq* names;
4507
4508 if (PyObject_HasAttrString(obj, "names")) {
4509 int res;
4510 Py_ssize_t len;
4511 Py_ssize_t i;
4512 tmp = PyObject_GetAttrString(obj, "names");
4513 if (tmp == NULL) goto failed;
4514 if (!PyList_Check(tmp)) {
4515 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4516 goto failed;
4517 }
4518 len = PyList_GET_SIZE(tmp);
4519 names = asdl_seq_new(len, arena);
4520 if (names == NULL) goto failed;
4521 for (i = 0; i < len; i++) {
4522 alias_ty value;
4523 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
4524 if (res != 0) goto failed;
4525 asdl_seq_SET(names, i, value);
4526 }
4527 Py_XDECREF(tmp);
4528 tmp = NULL;
4529 } else {
4530 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
4531 return 1;
4532 }
4533 *out = Import(names, lineno, col_offset, arena);
4534 if (*out == NULL) goto failed;
4535 return 0;
4536 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004537 isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
4538 if (isinstance == -1) {
4539 return 1;
4540 }
4541 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004542 identifier module;
4543 asdl_seq* names;
4544 int level;
4545
4546 if (PyObject_HasAttrString(obj, "module")) {
4547 int res;
4548 tmp = PyObject_GetAttrString(obj, "module");
4549 if (tmp == NULL) goto failed;
4550 res = obj2ast_identifier(tmp, &module, arena);
4551 if (res != 0) goto failed;
4552 Py_XDECREF(tmp);
4553 tmp = NULL;
4554 } else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00004555 module = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004556 }
4557 if (PyObject_HasAttrString(obj, "names")) {
4558 int res;
4559 Py_ssize_t len;
4560 Py_ssize_t i;
4561 tmp = PyObject_GetAttrString(obj, "names");
4562 if (tmp == NULL) goto failed;
4563 if (!PyList_Check(tmp)) {
4564 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4565 goto failed;
4566 }
4567 len = PyList_GET_SIZE(tmp);
4568 names = asdl_seq_new(len, arena);
4569 if (names == NULL) goto failed;
4570 for (i = 0; i < len; i++) {
4571 alias_ty value;
4572 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
4573 if (res != 0) goto failed;
4574 asdl_seq_SET(names, i, value);
4575 }
4576 Py_XDECREF(tmp);
4577 tmp = NULL;
4578 } else {
4579 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
4580 return 1;
4581 }
4582 if (PyObject_HasAttrString(obj, "level")) {
4583 int res;
4584 tmp = PyObject_GetAttrString(obj, "level");
4585 if (tmp == NULL) goto failed;
4586 res = obj2ast_int(tmp, &level, arena);
4587 if (res != 0) goto failed;
4588 Py_XDECREF(tmp);
4589 tmp = NULL;
4590 } else {
4591 level = 0;
4592 }
4593 *out = ImportFrom(module, names, level, lineno, col_offset,
4594 arena);
4595 if (*out == NULL) goto failed;
4596 return 0;
4597 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004598 isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
4599 if (isinstance == -1) {
4600 return 1;
4601 }
4602 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004603 asdl_seq* names;
4604
4605 if (PyObject_HasAttrString(obj, "names")) {
4606 int res;
4607 Py_ssize_t len;
4608 Py_ssize_t i;
4609 tmp = PyObject_GetAttrString(obj, "names");
4610 if (tmp == NULL) goto failed;
4611 if (!PyList_Check(tmp)) {
4612 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4613 goto failed;
4614 }
4615 len = PyList_GET_SIZE(tmp);
4616 names = asdl_seq_new(len, arena);
4617 if (names == NULL) goto failed;
4618 for (i = 0; i < len; i++) {
4619 identifier value;
4620 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &value, arena);
4621 if (res != 0) goto failed;
4622 asdl_seq_SET(names, i, value);
4623 }
4624 Py_XDECREF(tmp);
4625 tmp = NULL;
4626 } else {
4627 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
4628 return 1;
4629 }
4630 *out = Global(names, lineno, col_offset, arena);
4631 if (*out == NULL) goto failed;
4632 return 0;
4633 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004634 isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type);
4635 if (isinstance == -1) {
4636 return 1;
4637 }
4638 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004639 asdl_seq* names;
4640
4641 if (PyObject_HasAttrString(obj, "names")) {
4642 int res;
4643 Py_ssize_t len;
4644 Py_ssize_t i;
4645 tmp = PyObject_GetAttrString(obj, "names");
4646 if (tmp == NULL) goto failed;
4647 if (!PyList_Check(tmp)) {
4648 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4649 goto failed;
4650 }
4651 len = PyList_GET_SIZE(tmp);
4652 names = asdl_seq_new(len, arena);
4653 if (names == NULL) goto failed;
4654 for (i = 0; i < len; i++) {
4655 identifier value;
4656 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &value, arena);
4657 if (res != 0) goto failed;
4658 asdl_seq_SET(names, i, value);
4659 }
4660 Py_XDECREF(tmp);
4661 tmp = NULL;
4662 } else {
4663 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
4664 return 1;
4665 }
4666 *out = Nonlocal(names, lineno, col_offset, arena);
4667 if (*out == NULL) goto failed;
4668 return 0;
4669 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004670 isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
4671 if (isinstance == -1) {
4672 return 1;
4673 }
4674 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004675 expr_ty value;
4676
4677 if (PyObject_HasAttrString(obj, "value")) {
4678 int res;
4679 tmp = PyObject_GetAttrString(obj, "value");
4680 if (tmp == NULL) goto failed;
4681 res = obj2ast_expr(tmp, &value, arena);
4682 if (res != 0) goto failed;
4683 Py_XDECREF(tmp);
4684 tmp = NULL;
4685 } else {
4686 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
4687 return 1;
4688 }
4689 *out = Expr(value, lineno, col_offset, arena);
4690 if (*out == NULL) goto failed;
4691 return 0;
4692 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004693 isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
4694 if (isinstance == -1) {
4695 return 1;
4696 }
4697 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004698
4699 *out = Pass(lineno, col_offset, arena);
4700 if (*out == NULL) goto failed;
4701 return 0;
4702 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004703 isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
4704 if (isinstance == -1) {
4705 return 1;
4706 }
4707 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004708
4709 *out = Break(lineno, col_offset, arena);
4710 if (*out == NULL) goto failed;
4711 return 0;
4712 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004713 isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
4714 if (isinstance == -1) {
4715 return 1;
4716 }
4717 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004718
4719 *out = Continue(lineno, col_offset, arena);
4720 if (*out == NULL) goto failed;
4721 return 0;
4722 }
4723
Benjamin Peterson5b066812010-11-20 01:38:49 +00004724 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
4725 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00004726 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004727 return 1;
4728}
4729
4730int
4731obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
4732{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004733 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004734
Benjamin Petersond8f65972010-11-20 04:31:07 +00004735 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004736 int lineno;
4737 int col_offset;
4738
4739 if (obj == Py_None) {
4740 *out = NULL;
4741 return 0;
4742 }
4743 if (PyObject_HasAttrString(obj, "lineno")) {
4744 int res;
4745 tmp = PyObject_GetAttrString(obj, "lineno");
4746 if (tmp == NULL) goto failed;
4747 res = obj2ast_int(tmp, &lineno, arena);
4748 if (res != 0) goto failed;
4749 Py_XDECREF(tmp);
4750 tmp = NULL;
4751 } else {
4752 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
4753 return 1;
4754 }
4755 if (PyObject_HasAttrString(obj, "col_offset")) {
4756 int res;
4757 tmp = PyObject_GetAttrString(obj, "col_offset");
4758 if (tmp == NULL) goto failed;
4759 res = obj2ast_int(tmp, &col_offset, arena);
4760 if (res != 0) goto failed;
4761 Py_XDECREF(tmp);
4762 tmp = NULL;
4763 } else {
4764 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
4765 return 1;
4766 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004767 isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
4768 if (isinstance == -1) {
4769 return 1;
4770 }
4771 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004772 boolop_ty op;
4773 asdl_seq* values;
4774
4775 if (PyObject_HasAttrString(obj, "op")) {
4776 int res;
4777 tmp = PyObject_GetAttrString(obj, "op");
4778 if (tmp == NULL) goto failed;
4779 res = obj2ast_boolop(tmp, &op, arena);
4780 if (res != 0) goto failed;
4781 Py_XDECREF(tmp);
4782 tmp = NULL;
4783 } else {
4784 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
4785 return 1;
4786 }
4787 if (PyObject_HasAttrString(obj, "values")) {
4788 int res;
4789 Py_ssize_t len;
4790 Py_ssize_t i;
4791 tmp = PyObject_GetAttrString(obj, "values");
4792 if (tmp == NULL) goto failed;
4793 if (!PyList_Check(tmp)) {
4794 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4795 goto failed;
4796 }
4797 len = PyList_GET_SIZE(tmp);
4798 values = asdl_seq_new(len, arena);
4799 if (values == NULL) goto failed;
4800 for (i = 0; i < len; i++) {
4801 expr_ty value;
4802 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
4803 if (res != 0) goto failed;
4804 asdl_seq_SET(values, i, value);
4805 }
4806 Py_XDECREF(tmp);
4807 tmp = NULL;
4808 } else {
4809 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
4810 return 1;
4811 }
4812 *out = BoolOp(op, values, lineno, col_offset, arena);
4813 if (*out == NULL) goto failed;
4814 return 0;
4815 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004816 isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
4817 if (isinstance == -1) {
4818 return 1;
4819 }
4820 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004821 expr_ty left;
4822 operator_ty op;
4823 expr_ty right;
4824
4825 if (PyObject_HasAttrString(obj, "left")) {
4826 int res;
4827 tmp = PyObject_GetAttrString(obj, "left");
4828 if (tmp == NULL) goto failed;
4829 res = obj2ast_expr(tmp, &left, arena);
4830 if (res != 0) goto failed;
4831 Py_XDECREF(tmp);
4832 tmp = NULL;
4833 } else {
4834 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
4835 return 1;
4836 }
4837 if (PyObject_HasAttrString(obj, "op")) {
4838 int res;
4839 tmp = PyObject_GetAttrString(obj, "op");
4840 if (tmp == NULL) goto failed;
4841 res = obj2ast_operator(tmp, &op, arena);
4842 if (res != 0) goto failed;
4843 Py_XDECREF(tmp);
4844 tmp = NULL;
4845 } else {
4846 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
4847 return 1;
4848 }
4849 if (PyObject_HasAttrString(obj, "right")) {
4850 int res;
4851 tmp = PyObject_GetAttrString(obj, "right");
4852 if (tmp == NULL) goto failed;
4853 res = obj2ast_expr(tmp, &right, arena);
4854 if (res != 0) goto failed;
4855 Py_XDECREF(tmp);
4856 tmp = NULL;
4857 } else {
4858 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
4859 return 1;
4860 }
4861 *out = BinOp(left, op, right, lineno, col_offset, arena);
4862 if (*out == NULL) goto failed;
4863 return 0;
4864 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004865 isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
4866 if (isinstance == -1) {
4867 return 1;
4868 }
4869 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004870 unaryop_ty op;
4871 expr_ty operand;
4872
4873 if (PyObject_HasAttrString(obj, "op")) {
4874 int res;
4875 tmp = PyObject_GetAttrString(obj, "op");
4876 if (tmp == NULL) goto failed;
4877 res = obj2ast_unaryop(tmp, &op, arena);
4878 if (res != 0) goto failed;
4879 Py_XDECREF(tmp);
4880 tmp = NULL;
4881 } else {
4882 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
4883 return 1;
4884 }
4885 if (PyObject_HasAttrString(obj, "operand")) {
4886 int res;
4887 tmp = PyObject_GetAttrString(obj, "operand");
4888 if (tmp == NULL) goto failed;
4889 res = obj2ast_expr(tmp, &operand, arena);
4890 if (res != 0) goto failed;
4891 Py_XDECREF(tmp);
4892 tmp = NULL;
4893 } else {
4894 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
4895 return 1;
4896 }
4897 *out = UnaryOp(op, operand, lineno, col_offset, arena);
4898 if (*out == NULL) goto failed;
4899 return 0;
4900 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004901 isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
4902 if (isinstance == -1) {
4903 return 1;
4904 }
4905 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004906 arguments_ty args;
4907 expr_ty body;
4908
4909 if (PyObject_HasAttrString(obj, "args")) {
4910 int res;
4911 tmp = PyObject_GetAttrString(obj, "args");
4912 if (tmp == NULL) goto failed;
4913 res = obj2ast_arguments(tmp, &args, arena);
4914 if (res != 0) goto failed;
4915 Py_XDECREF(tmp);
4916 tmp = NULL;
4917 } else {
4918 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
4919 return 1;
4920 }
4921 if (PyObject_HasAttrString(obj, "body")) {
4922 int res;
4923 tmp = PyObject_GetAttrString(obj, "body");
4924 if (tmp == NULL) goto failed;
4925 res = obj2ast_expr(tmp, &body, arena);
4926 if (res != 0) goto failed;
4927 Py_XDECREF(tmp);
4928 tmp = NULL;
4929 } else {
4930 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
4931 return 1;
4932 }
4933 *out = Lambda(args, body, lineno, col_offset, arena);
4934 if (*out == NULL) goto failed;
4935 return 0;
4936 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004937 isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
4938 if (isinstance == -1) {
4939 return 1;
4940 }
4941 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004942 expr_ty test;
4943 expr_ty body;
4944 expr_ty orelse;
4945
4946 if (PyObject_HasAttrString(obj, "test")) {
4947 int res;
4948 tmp = PyObject_GetAttrString(obj, "test");
4949 if (tmp == NULL) goto failed;
4950 res = obj2ast_expr(tmp, &test, arena);
4951 if (res != 0) goto failed;
4952 Py_XDECREF(tmp);
4953 tmp = NULL;
4954 } else {
4955 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
4956 return 1;
4957 }
4958 if (PyObject_HasAttrString(obj, "body")) {
4959 int res;
4960 tmp = PyObject_GetAttrString(obj, "body");
4961 if (tmp == NULL) goto failed;
4962 res = obj2ast_expr(tmp, &body, arena);
4963 if (res != 0) goto failed;
4964 Py_XDECREF(tmp);
4965 tmp = NULL;
4966 } else {
4967 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
4968 return 1;
4969 }
4970 if (PyObject_HasAttrString(obj, "orelse")) {
4971 int res;
4972 tmp = PyObject_GetAttrString(obj, "orelse");
4973 if (tmp == NULL) goto failed;
4974 res = obj2ast_expr(tmp, &orelse, arena);
4975 if (res != 0) goto failed;
4976 Py_XDECREF(tmp);
4977 tmp = NULL;
4978 } else {
4979 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
4980 return 1;
4981 }
4982 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
4983 if (*out == NULL) goto failed;
4984 return 0;
4985 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00004986 isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
4987 if (isinstance == -1) {
4988 return 1;
4989 }
4990 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004991 asdl_seq* keys;
4992 asdl_seq* values;
4993
4994 if (PyObject_HasAttrString(obj, "keys")) {
4995 int res;
4996 Py_ssize_t len;
4997 Py_ssize_t i;
4998 tmp = PyObject_GetAttrString(obj, "keys");
4999 if (tmp == NULL) goto failed;
5000 if (!PyList_Check(tmp)) {
5001 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5002 goto failed;
5003 }
5004 len = PyList_GET_SIZE(tmp);
5005 keys = asdl_seq_new(len, arena);
5006 if (keys == NULL) goto failed;
5007 for (i = 0; i < len; i++) {
5008 expr_ty value;
5009 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5010 if (res != 0) goto failed;
5011 asdl_seq_SET(keys, i, value);
5012 }
5013 Py_XDECREF(tmp);
5014 tmp = NULL;
5015 } else {
5016 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
5017 return 1;
5018 }
5019 if (PyObject_HasAttrString(obj, "values")) {
5020 int res;
5021 Py_ssize_t len;
5022 Py_ssize_t i;
5023 tmp = PyObject_GetAttrString(obj, "values");
5024 if (tmp == NULL) goto failed;
5025 if (!PyList_Check(tmp)) {
5026 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5027 goto failed;
5028 }
5029 len = PyList_GET_SIZE(tmp);
5030 values = asdl_seq_new(len, arena);
5031 if (values == NULL) goto failed;
5032 for (i = 0; i < len; i++) {
5033 expr_ty value;
5034 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5035 if (res != 0) goto failed;
5036 asdl_seq_SET(values, i, value);
5037 }
5038 Py_XDECREF(tmp);
5039 tmp = NULL;
5040 } else {
5041 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
5042 return 1;
5043 }
5044 *out = Dict(keys, values, lineno, col_offset, arena);
5045 if (*out == NULL) goto failed;
5046 return 0;
5047 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005048 isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
5049 if (isinstance == -1) {
5050 return 1;
5051 }
5052 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005053 asdl_seq* elts;
5054
5055 if (PyObject_HasAttrString(obj, "elts")) {
5056 int res;
5057 Py_ssize_t len;
5058 Py_ssize_t i;
5059 tmp = PyObject_GetAttrString(obj, "elts");
5060 if (tmp == NULL) goto failed;
5061 if (!PyList_Check(tmp)) {
5062 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5063 goto failed;
5064 }
5065 len = PyList_GET_SIZE(tmp);
5066 elts = asdl_seq_new(len, arena);
5067 if (elts == NULL) goto failed;
5068 for (i = 0; i < len; i++) {
5069 expr_ty value;
5070 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5071 if (res != 0) goto failed;
5072 asdl_seq_SET(elts, i, value);
5073 }
5074 Py_XDECREF(tmp);
5075 tmp = NULL;
5076 } else {
5077 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
5078 return 1;
5079 }
5080 *out = Set(elts, lineno, col_offset, arena);
5081 if (*out == NULL) goto failed;
5082 return 0;
5083 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005084 isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
5085 if (isinstance == -1) {
5086 return 1;
5087 }
5088 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005089 expr_ty elt;
5090 asdl_seq* generators;
5091
5092 if (PyObject_HasAttrString(obj, "elt")) {
5093 int res;
5094 tmp = PyObject_GetAttrString(obj, "elt");
5095 if (tmp == NULL) goto failed;
5096 res = obj2ast_expr(tmp, &elt, arena);
5097 if (res != 0) goto failed;
5098 Py_XDECREF(tmp);
5099 tmp = NULL;
5100 } else {
5101 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
5102 return 1;
5103 }
5104 if (PyObject_HasAttrString(obj, "generators")) {
5105 int res;
5106 Py_ssize_t len;
5107 Py_ssize_t i;
5108 tmp = PyObject_GetAttrString(obj, "generators");
5109 if (tmp == NULL) goto failed;
5110 if (!PyList_Check(tmp)) {
5111 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5112 goto failed;
5113 }
5114 len = PyList_GET_SIZE(tmp);
5115 generators = asdl_seq_new(len, arena);
5116 if (generators == NULL) goto failed;
5117 for (i = 0; i < len; i++) {
5118 comprehension_ty value;
5119 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5120 if (res != 0) goto failed;
5121 asdl_seq_SET(generators, i, value);
5122 }
5123 Py_XDECREF(tmp);
5124 tmp = NULL;
5125 } else {
5126 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
5127 return 1;
5128 }
5129 *out = ListComp(elt, generators, lineno, col_offset, arena);
5130 if (*out == NULL) goto failed;
5131 return 0;
5132 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005133 isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
5134 if (isinstance == -1) {
5135 return 1;
5136 }
5137 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005138 expr_ty elt;
5139 asdl_seq* generators;
5140
5141 if (PyObject_HasAttrString(obj, "elt")) {
5142 int res;
5143 tmp = PyObject_GetAttrString(obj, "elt");
5144 if (tmp == NULL) goto failed;
5145 res = obj2ast_expr(tmp, &elt, arena);
5146 if (res != 0) goto failed;
5147 Py_XDECREF(tmp);
5148 tmp = NULL;
5149 } else {
5150 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
5151 return 1;
5152 }
5153 if (PyObject_HasAttrString(obj, "generators")) {
5154 int res;
5155 Py_ssize_t len;
5156 Py_ssize_t i;
5157 tmp = PyObject_GetAttrString(obj, "generators");
5158 if (tmp == NULL) goto failed;
5159 if (!PyList_Check(tmp)) {
5160 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5161 goto failed;
5162 }
5163 len = PyList_GET_SIZE(tmp);
5164 generators = asdl_seq_new(len, arena);
5165 if (generators == NULL) goto failed;
5166 for (i = 0; i < len; i++) {
5167 comprehension_ty value;
5168 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5169 if (res != 0) goto failed;
5170 asdl_seq_SET(generators, i, value);
5171 }
5172 Py_XDECREF(tmp);
5173 tmp = NULL;
5174 } else {
5175 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
5176 return 1;
5177 }
5178 *out = SetComp(elt, generators, lineno, col_offset, arena);
5179 if (*out == NULL) goto failed;
5180 return 0;
5181 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005182 isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
5183 if (isinstance == -1) {
5184 return 1;
5185 }
5186 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005187 expr_ty key;
5188 expr_ty value;
5189 asdl_seq* generators;
5190
5191 if (PyObject_HasAttrString(obj, "key")) {
5192 int res;
5193 tmp = PyObject_GetAttrString(obj, "key");
5194 if (tmp == NULL) goto failed;
5195 res = obj2ast_expr(tmp, &key, arena);
5196 if (res != 0) goto failed;
5197 Py_XDECREF(tmp);
5198 tmp = NULL;
5199 } else {
5200 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
5201 return 1;
5202 }
5203 if (PyObject_HasAttrString(obj, "value")) {
5204 int res;
5205 tmp = PyObject_GetAttrString(obj, "value");
5206 if (tmp == NULL) goto failed;
5207 res = obj2ast_expr(tmp, &value, arena);
5208 if (res != 0) goto failed;
5209 Py_XDECREF(tmp);
5210 tmp = NULL;
5211 } else {
5212 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
5213 return 1;
5214 }
5215 if (PyObject_HasAttrString(obj, "generators")) {
5216 int res;
5217 Py_ssize_t len;
5218 Py_ssize_t i;
5219 tmp = PyObject_GetAttrString(obj, "generators");
5220 if (tmp == NULL) goto failed;
5221 if (!PyList_Check(tmp)) {
5222 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5223 goto failed;
5224 }
5225 len = PyList_GET_SIZE(tmp);
5226 generators = asdl_seq_new(len, arena);
5227 if (generators == NULL) goto failed;
5228 for (i = 0; i < len; i++) {
5229 comprehension_ty value;
5230 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5231 if (res != 0) goto failed;
5232 asdl_seq_SET(generators, i, value);
5233 }
5234 Py_XDECREF(tmp);
5235 tmp = NULL;
5236 } else {
5237 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
5238 return 1;
5239 }
5240 *out = DictComp(key, value, generators, lineno, col_offset,
5241 arena);
5242 if (*out == NULL) goto failed;
5243 return 0;
5244 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005245 isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
5246 if (isinstance == -1) {
5247 return 1;
5248 }
5249 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005250 expr_ty elt;
5251 asdl_seq* generators;
5252
5253 if (PyObject_HasAttrString(obj, "elt")) {
5254 int res;
5255 tmp = PyObject_GetAttrString(obj, "elt");
5256 if (tmp == NULL) goto failed;
5257 res = obj2ast_expr(tmp, &elt, arena);
5258 if (res != 0) goto failed;
5259 Py_XDECREF(tmp);
5260 tmp = NULL;
5261 } else {
5262 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
5263 return 1;
5264 }
5265 if (PyObject_HasAttrString(obj, "generators")) {
5266 int res;
5267 Py_ssize_t len;
5268 Py_ssize_t i;
5269 tmp = PyObject_GetAttrString(obj, "generators");
5270 if (tmp == NULL) goto failed;
5271 if (!PyList_Check(tmp)) {
5272 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5273 goto failed;
5274 }
5275 len = PyList_GET_SIZE(tmp);
5276 generators = asdl_seq_new(len, arena);
5277 if (generators == NULL) goto failed;
5278 for (i = 0; i < len; i++) {
5279 comprehension_ty value;
5280 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5281 if (res != 0) goto failed;
5282 asdl_seq_SET(generators, i, value);
5283 }
5284 Py_XDECREF(tmp);
5285 tmp = NULL;
5286 } else {
5287 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
5288 return 1;
5289 }
5290 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
5291 if (*out == NULL) goto failed;
5292 return 0;
5293 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005294 isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
5295 if (isinstance == -1) {
5296 return 1;
5297 }
5298 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005299 expr_ty value;
5300
5301 if (PyObject_HasAttrString(obj, "value")) {
5302 int res;
5303 tmp = PyObject_GetAttrString(obj, "value");
5304 if (tmp == NULL) goto failed;
5305 res = obj2ast_expr(tmp, &value, arena);
5306 if (res != 0) goto failed;
5307 Py_XDECREF(tmp);
5308 tmp = NULL;
5309 } else {
5310 value = NULL;
5311 }
5312 *out = Yield(value, lineno, col_offset, arena);
5313 if (*out == NULL) goto failed;
5314 return 0;
5315 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005316 isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
5317 if (isinstance == -1) {
5318 return 1;
5319 }
5320 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005321 expr_ty left;
5322 asdl_int_seq* ops;
5323 asdl_seq* comparators;
5324
5325 if (PyObject_HasAttrString(obj, "left")) {
5326 int res;
5327 tmp = PyObject_GetAttrString(obj, "left");
5328 if (tmp == NULL) goto failed;
5329 res = obj2ast_expr(tmp, &left, arena);
5330 if (res != 0) goto failed;
5331 Py_XDECREF(tmp);
5332 tmp = NULL;
5333 } else {
5334 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
5335 return 1;
5336 }
5337 if (PyObject_HasAttrString(obj, "ops")) {
5338 int res;
5339 Py_ssize_t len;
5340 Py_ssize_t i;
5341 tmp = PyObject_GetAttrString(obj, "ops");
5342 if (tmp == NULL) goto failed;
5343 if (!PyList_Check(tmp)) {
5344 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5345 goto failed;
5346 }
5347 len = PyList_GET_SIZE(tmp);
5348 ops = asdl_int_seq_new(len, arena);
5349 if (ops == NULL) goto failed;
5350 for (i = 0; i < len; i++) {
5351 cmpop_ty value;
5352 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &value, arena);
5353 if (res != 0) goto failed;
5354 asdl_seq_SET(ops, i, value);
5355 }
5356 Py_XDECREF(tmp);
5357 tmp = NULL;
5358 } else {
5359 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
5360 return 1;
5361 }
5362 if (PyObject_HasAttrString(obj, "comparators")) {
5363 int res;
5364 Py_ssize_t len;
5365 Py_ssize_t i;
5366 tmp = PyObject_GetAttrString(obj, "comparators");
5367 if (tmp == NULL) goto failed;
5368 if (!PyList_Check(tmp)) {
5369 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5370 goto failed;
5371 }
5372 len = PyList_GET_SIZE(tmp);
5373 comparators = asdl_seq_new(len, arena);
5374 if (comparators == NULL) goto failed;
5375 for (i = 0; i < len; i++) {
5376 expr_ty value;
5377 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5378 if (res != 0) goto failed;
5379 asdl_seq_SET(comparators, i, value);
5380 }
5381 Py_XDECREF(tmp);
5382 tmp = NULL;
5383 } else {
5384 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
5385 return 1;
5386 }
5387 *out = Compare(left, ops, comparators, lineno, col_offset,
5388 arena);
5389 if (*out == NULL) goto failed;
5390 return 0;
5391 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005392 isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
5393 if (isinstance == -1) {
5394 return 1;
5395 }
5396 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005397 expr_ty func;
5398 asdl_seq* args;
5399 asdl_seq* keywords;
5400 expr_ty starargs;
5401 expr_ty kwargs;
5402
5403 if (PyObject_HasAttrString(obj, "func")) {
5404 int res;
5405 tmp = PyObject_GetAttrString(obj, "func");
5406 if (tmp == NULL) goto failed;
5407 res = obj2ast_expr(tmp, &func, arena);
5408 if (res != 0) goto failed;
5409 Py_XDECREF(tmp);
5410 tmp = NULL;
5411 } else {
5412 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
5413 return 1;
5414 }
5415 if (PyObject_HasAttrString(obj, "args")) {
5416 int res;
5417 Py_ssize_t len;
5418 Py_ssize_t i;
5419 tmp = PyObject_GetAttrString(obj, "args");
5420 if (tmp == NULL) goto failed;
5421 if (!PyList_Check(tmp)) {
5422 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5423 goto failed;
5424 }
5425 len = PyList_GET_SIZE(tmp);
5426 args = asdl_seq_new(len, arena);
5427 if (args == NULL) goto failed;
5428 for (i = 0; i < len; i++) {
5429 expr_ty value;
5430 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5431 if (res != 0) goto failed;
5432 asdl_seq_SET(args, i, value);
5433 }
5434 Py_XDECREF(tmp);
5435 tmp = NULL;
5436 } else {
5437 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
5438 return 1;
5439 }
5440 if (PyObject_HasAttrString(obj, "keywords")) {
5441 int res;
5442 Py_ssize_t len;
5443 Py_ssize_t i;
5444 tmp = PyObject_GetAttrString(obj, "keywords");
5445 if (tmp == NULL) goto failed;
5446 if (!PyList_Check(tmp)) {
5447 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5448 goto failed;
5449 }
5450 len = PyList_GET_SIZE(tmp);
5451 keywords = asdl_seq_new(len, arena);
5452 if (keywords == NULL) goto failed;
5453 for (i = 0; i < len; i++) {
5454 keyword_ty value;
5455 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &value, arena);
5456 if (res != 0) goto failed;
5457 asdl_seq_SET(keywords, i, value);
5458 }
5459 Py_XDECREF(tmp);
5460 tmp = NULL;
5461 } else {
5462 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
5463 return 1;
5464 }
5465 if (PyObject_HasAttrString(obj, "starargs")) {
5466 int res;
5467 tmp = PyObject_GetAttrString(obj, "starargs");
5468 if (tmp == NULL) goto failed;
5469 res = obj2ast_expr(tmp, &starargs, arena);
5470 if (res != 0) goto failed;
5471 Py_XDECREF(tmp);
5472 tmp = NULL;
5473 } else {
5474 starargs = NULL;
5475 }
5476 if (PyObject_HasAttrString(obj, "kwargs")) {
5477 int res;
5478 tmp = PyObject_GetAttrString(obj, "kwargs");
5479 if (tmp == NULL) goto failed;
5480 res = obj2ast_expr(tmp, &kwargs, arena);
5481 if (res != 0) goto failed;
5482 Py_XDECREF(tmp);
5483 tmp = NULL;
5484 } else {
5485 kwargs = NULL;
5486 }
5487 *out = Call(func, args, keywords, starargs, kwargs, lineno,
5488 col_offset, arena);
5489 if (*out == NULL) goto failed;
5490 return 0;
5491 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005492 isinstance = PyObject_IsInstance(obj, (PyObject*)Num_type);
5493 if (isinstance == -1) {
5494 return 1;
5495 }
5496 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005497 object n;
5498
5499 if (PyObject_HasAttrString(obj, "n")) {
5500 int res;
5501 tmp = PyObject_GetAttrString(obj, "n");
5502 if (tmp == NULL) goto failed;
5503 res = obj2ast_object(tmp, &n, arena);
5504 if (res != 0) goto failed;
5505 Py_XDECREF(tmp);
5506 tmp = NULL;
5507 } else {
5508 PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
5509 return 1;
5510 }
5511 *out = Num(n, lineno, col_offset, arena);
5512 if (*out == NULL) goto failed;
5513 return 0;
5514 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005515 isinstance = PyObject_IsInstance(obj, (PyObject*)Str_type);
5516 if (isinstance == -1) {
5517 return 1;
5518 }
5519 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005520 string s;
5521
5522 if (PyObject_HasAttrString(obj, "s")) {
5523 int res;
5524 tmp = PyObject_GetAttrString(obj, "s");
5525 if (tmp == NULL) goto failed;
5526 res = obj2ast_string(tmp, &s, arena);
5527 if (res != 0) goto failed;
5528 Py_XDECREF(tmp);
5529 tmp = NULL;
5530 } else {
5531 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
5532 return 1;
5533 }
5534 *out = Str(s, lineno, col_offset, arena);
5535 if (*out == NULL) goto failed;
5536 return 0;
5537 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005538 isinstance = PyObject_IsInstance(obj, (PyObject*)Bytes_type);
5539 if (isinstance == -1) {
5540 return 1;
5541 }
5542 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005543 string s;
5544
5545 if (PyObject_HasAttrString(obj, "s")) {
5546 int res;
5547 tmp = PyObject_GetAttrString(obj, "s");
5548 if (tmp == NULL) goto failed;
5549 res = obj2ast_string(tmp, &s, arena);
5550 if (res != 0) goto failed;
5551 Py_XDECREF(tmp);
5552 tmp = NULL;
5553 } else {
5554 PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Bytes");
5555 return 1;
5556 }
5557 *out = Bytes(s, lineno, col_offset, arena);
5558 if (*out == NULL) goto failed;
5559 return 0;
5560 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005561 isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type);
5562 if (isinstance == -1) {
5563 return 1;
5564 }
5565 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005566
5567 *out = Ellipsis(lineno, col_offset, arena);
5568 if (*out == NULL) goto failed;
5569 return 0;
5570 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005571 isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
5572 if (isinstance == -1) {
5573 return 1;
5574 }
5575 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005576 expr_ty value;
5577 identifier attr;
5578 expr_context_ty ctx;
5579
5580 if (PyObject_HasAttrString(obj, "value")) {
5581 int res;
5582 tmp = PyObject_GetAttrString(obj, "value");
5583 if (tmp == NULL) goto failed;
5584 res = obj2ast_expr(tmp, &value, arena);
5585 if (res != 0) goto failed;
5586 Py_XDECREF(tmp);
5587 tmp = NULL;
5588 } else {
5589 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
5590 return 1;
5591 }
5592 if (PyObject_HasAttrString(obj, "attr")) {
5593 int res;
5594 tmp = PyObject_GetAttrString(obj, "attr");
5595 if (tmp == NULL) goto failed;
5596 res = obj2ast_identifier(tmp, &attr, arena);
5597 if (res != 0) goto failed;
5598 Py_XDECREF(tmp);
5599 tmp = NULL;
5600 } else {
5601 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
5602 return 1;
5603 }
5604 if (PyObject_HasAttrString(obj, "ctx")) {
5605 int res;
5606 tmp = PyObject_GetAttrString(obj, "ctx");
5607 if (tmp == NULL) goto failed;
5608 res = obj2ast_expr_context(tmp, &ctx, arena);
5609 if (res != 0) goto failed;
5610 Py_XDECREF(tmp);
5611 tmp = NULL;
5612 } else {
5613 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
5614 return 1;
5615 }
5616 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
5617 if (*out == NULL) goto failed;
5618 return 0;
5619 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005620 isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
5621 if (isinstance == -1) {
5622 return 1;
5623 }
5624 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005625 expr_ty value;
5626 slice_ty slice;
5627 expr_context_ty ctx;
5628
5629 if (PyObject_HasAttrString(obj, "value")) {
5630 int res;
5631 tmp = PyObject_GetAttrString(obj, "value");
5632 if (tmp == NULL) goto failed;
5633 res = obj2ast_expr(tmp, &value, arena);
5634 if (res != 0) goto failed;
5635 Py_XDECREF(tmp);
5636 tmp = NULL;
5637 } else {
5638 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
5639 return 1;
5640 }
5641 if (PyObject_HasAttrString(obj, "slice")) {
5642 int res;
5643 tmp = PyObject_GetAttrString(obj, "slice");
5644 if (tmp == NULL) goto failed;
5645 res = obj2ast_slice(tmp, &slice, arena);
5646 if (res != 0) goto failed;
5647 Py_XDECREF(tmp);
5648 tmp = NULL;
5649 } else {
5650 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
5651 return 1;
5652 }
5653 if (PyObject_HasAttrString(obj, "ctx")) {
5654 int res;
5655 tmp = PyObject_GetAttrString(obj, "ctx");
5656 if (tmp == NULL) goto failed;
5657 res = obj2ast_expr_context(tmp, &ctx, arena);
5658 if (res != 0) goto failed;
5659 Py_XDECREF(tmp);
5660 tmp = NULL;
5661 } else {
5662 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
5663 return 1;
5664 }
5665 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
5666 if (*out == NULL) goto failed;
5667 return 0;
5668 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005669 isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type);
5670 if (isinstance == -1) {
5671 return 1;
5672 }
5673 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005674 expr_ty value;
5675 expr_context_ty ctx;
5676
5677 if (PyObject_HasAttrString(obj, "value")) {
5678 int res;
5679 tmp = PyObject_GetAttrString(obj, "value");
5680 if (tmp == NULL) goto failed;
5681 res = obj2ast_expr(tmp, &value, arena);
5682 if (res != 0) goto failed;
5683 Py_XDECREF(tmp);
5684 tmp = NULL;
5685 } else {
5686 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
5687 return 1;
5688 }
5689 if (PyObject_HasAttrString(obj, "ctx")) {
5690 int res;
5691 tmp = PyObject_GetAttrString(obj, "ctx");
5692 if (tmp == NULL) goto failed;
5693 res = obj2ast_expr_context(tmp, &ctx, arena);
5694 if (res != 0) goto failed;
5695 Py_XDECREF(tmp);
5696 tmp = NULL;
5697 } else {
5698 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
5699 return 1;
5700 }
5701 *out = Starred(value, ctx, lineno, col_offset, arena);
5702 if (*out == NULL) goto failed;
5703 return 0;
5704 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005705 isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
5706 if (isinstance == -1) {
5707 return 1;
5708 }
5709 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005710 identifier id;
5711 expr_context_ty ctx;
5712
5713 if (PyObject_HasAttrString(obj, "id")) {
5714 int res;
5715 tmp = PyObject_GetAttrString(obj, "id");
5716 if (tmp == NULL) goto failed;
5717 res = obj2ast_identifier(tmp, &id, arena);
5718 if (res != 0) goto failed;
5719 Py_XDECREF(tmp);
5720 tmp = NULL;
5721 } else {
5722 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
5723 return 1;
5724 }
5725 if (PyObject_HasAttrString(obj, "ctx")) {
5726 int res;
5727 tmp = PyObject_GetAttrString(obj, "ctx");
5728 if (tmp == NULL) goto failed;
5729 res = obj2ast_expr_context(tmp, &ctx, arena);
5730 if (res != 0) goto failed;
5731 Py_XDECREF(tmp);
5732 tmp = NULL;
5733 } else {
5734 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
5735 return 1;
5736 }
5737 *out = Name(id, ctx, lineno, col_offset, arena);
5738 if (*out == NULL) goto failed;
5739 return 0;
5740 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005741 isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
5742 if (isinstance == -1) {
5743 return 1;
5744 }
5745 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005746 asdl_seq* elts;
5747 expr_context_ty ctx;
5748
5749 if (PyObject_HasAttrString(obj, "elts")) {
5750 int res;
5751 Py_ssize_t len;
5752 Py_ssize_t i;
5753 tmp = PyObject_GetAttrString(obj, "elts");
5754 if (tmp == NULL) goto failed;
5755 if (!PyList_Check(tmp)) {
5756 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5757 goto failed;
5758 }
5759 len = PyList_GET_SIZE(tmp);
5760 elts = asdl_seq_new(len, arena);
5761 if (elts == NULL) goto failed;
5762 for (i = 0; i < len; i++) {
5763 expr_ty value;
5764 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5765 if (res != 0) goto failed;
5766 asdl_seq_SET(elts, i, value);
5767 }
5768 Py_XDECREF(tmp);
5769 tmp = NULL;
5770 } else {
5771 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
5772 return 1;
5773 }
5774 if (PyObject_HasAttrString(obj, "ctx")) {
5775 int res;
5776 tmp = PyObject_GetAttrString(obj, "ctx");
5777 if (tmp == NULL) goto failed;
5778 res = obj2ast_expr_context(tmp, &ctx, arena);
5779 if (res != 0) goto failed;
5780 Py_XDECREF(tmp);
5781 tmp = NULL;
5782 } else {
5783 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
5784 return 1;
5785 }
5786 *out = List(elts, ctx, lineno, col_offset, arena);
5787 if (*out == NULL) goto failed;
5788 return 0;
5789 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005790 isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
5791 if (isinstance == -1) {
5792 return 1;
5793 }
5794 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005795 asdl_seq* elts;
5796 expr_context_ty ctx;
5797
5798 if (PyObject_HasAttrString(obj, "elts")) {
5799 int res;
5800 Py_ssize_t len;
5801 Py_ssize_t i;
5802 tmp = PyObject_GetAttrString(obj, "elts");
5803 if (tmp == NULL) goto failed;
5804 if (!PyList_Check(tmp)) {
5805 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5806 goto failed;
5807 }
5808 len = PyList_GET_SIZE(tmp);
5809 elts = asdl_seq_new(len, arena);
5810 if (elts == NULL) goto failed;
5811 for (i = 0; i < len; i++) {
5812 expr_ty value;
5813 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5814 if (res != 0) goto failed;
5815 asdl_seq_SET(elts, i, value);
5816 }
5817 Py_XDECREF(tmp);
5818 tmp = NULL;
5819 } else {
5820 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
5821 return 1;
5822 }
5823 if (PyObject_HasAttrString(obj, "ctx")) {
5824 int res;
5825 tmp = PyObject_GetAttrString(obj, "ctx");
5826 if (tmp == NULL) goto failed;
5827 res = obj2ast_expr_context(tmp, &ctx, arena);
5828 if (res != 0) goto failed;
5829 Py_XDECREF(tmp);
5830 tmp = NULL;
5831 } else {
5832 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
5833 return 1;
5834 }
5835 *out = Tuple(elts, ctx, lineno, col_offset, arena);
5836 if (*out == NULL) goto failed;
5837 return 0;
5838 }
5839
Benjamin Peterson5b066812010-11-20 01:38:49 +00005840 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
5841 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00005842 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005843 return 1;
5844}
5845
5846int
5847obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
5848{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005849 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005850
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005851 isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
5852 if (isinstance == -1) {
5853 return 1;
5854 }
5855 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005856 *out = Load;
5857 return 0;
5858 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005859 isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
5860 if (isinstance == -1) {
5861 return 1;
5862 }
5863 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005864 *out = Store;
5865 return 0;
5866 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005867 isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
5868 if (isinstance == -1) {
5869 return 1;
5870 }
5871 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005872 *out = Del;
5873 return 0;
5874 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005875 isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
5876 if (isinstance == -1) {
5877 return 1;
5878 }
5879 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005880 *out = AugLoad;
5881 return 0;
5882 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005883 isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
5884 if (isinstance == -1) {
5885 return 1;
5886 }
5887 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005888 *out = AugStore;
5889 return 0;
5890 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005891 isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
5892 if (isinstance == -1) {
5893 return 1;
5894 }
5895 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005896 *out = Param;
5897 return 0;
5898 }
5899
Benjamin Peterson5b066812010-11-20 01:38:49 +00005900 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005901 return 1;
5902}
5903
5904int
5905obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
5906{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005907 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005908
Benjamin Petersond8f65972010-11-20 04:31:07 +00005909 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005910
5911 if (obj == Py_None) {
5912 *out = NULL;
5913 return 0;
5914 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005915 isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
5916 if (isinstance == -1) {
5917 return 1;
5918 }
5919 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005920 expr_ty lower;
5921 expr_ty upper;
5922 expr_ty step;
5923
5924 if (PyObject_HasAttrString(obj, "lower")) {
5925 int res;
5926 tmp = PyObject_GetAttrString(obj, "lower");
5927 if (tmp == NULL) goto failed;
5928 res = obj2ast_expr(tmp, &lower, arena);
5929 if (res != 0) goto failed;
5930 Py_XDECREF(tmp);
5931 tmp = NULL;
5932 } else {
5933 lower = NULL;
5934 }
5935 if (PyObject_HasAttrString(obj, "upper")) {
5936 int res;
5937 tmp = PyObject_GetAttrString(obj, "upper");
5938 if (tmp == NULL) goto failed;
5939 res = obj2ast_expr(tmp, &upper, arena);
5940 if (res != 0) goto failed;
5941 Py_XDECREF(tmp);
5942 tmp = NULL;
5943 } else {
5944 upper = NULL;
5945 }
5946 if (PyObject_HasAttrString(obj, "step")) {
5947 int res;
5948 tmp = PyObject_GetAttrString(obj, "step");
5949 if (tmp == NULL) goto failed;
5950 res = obj2ast_expr(tmp, &step, arena);
5951 if (res != 0) goto failed;
5952 Py_XDECREF(tmp);
5953 tmp = NULL;
5954 } else {
5955 step = NULL;
5956 }
5957 *out = Slice(lower, upper, step, arena);
5958 if (*out == NULL) goto failed;
5959 return 0;
5960 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005961 isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
5962 if (isinstance == -1) {
5963 return 1;
5964 }
5965 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005966 asdl_seq* dims;
5967
5968 if (PyObject_HasAttrString(obj, "dims")) {
5969 int res;
5970 Py_ssize_t len;
5971 Py_ssize_t i;
5972 tmp = PyObject_GetAttrString(obj, "dims");
5973 if (tmp == NULL) goto failed;
5974 if (!PyList_Check(tmp)) {
5975 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5976 goto failed;
5977 }
5978 len = PyList_GET_SIZE(tmp);
5979 dims = asdl_seq_new(len, arena);
5980 if (dims == NULL) goto failed;
5981 for (i = 0; i < len; i++) {
5982 slice_ty value;
5983 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &value, arena);
5984 if (res != 0) goto failed;
5985 asdl_seq_SET(dims, i, value);
5986 }
5987 Py_XDECREF(tmp);
5988 tmp = NULL;
5989 } else {
5990 PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
5991 return 1;
5992 }
5993 *out = ExtSlice(dims, arena);
5994 if (*out == NULL) goto failed;
5995 return 0;
5996 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00005997 isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
5998 if (isinstance == -1) {
5999 return 1;
6000 }
6001 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006002 expr_ty value;
6003
6004 if (PyObject_HasAttrString(obj, "value")) {
6005 int res;
6006 tmp = PyObject_GetAttrString(obj, "value");
6007 if (tmp == NULL) goto failed;
6008 res = obj2ast_expr(tmp, &value, arena);
6009 if (res != 0) goto failed;
6010 Py_XDECREF(tmp);
6011 tmp = NULL;
6012 } else {
6013 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
6014 return 1;
6015 }
6016 *out = Index(value, arena);
6017 if (*out == NULL) goto failed;
6018 return 0;
6019 }
6020
Benjamin Peterson5b066812010-11-20 01:38:49 +00006021 PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj);
6022 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00006023 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006024 return 1;
6025}
6026
6027int
6028obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
6029{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006030 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006031
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006032 isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
6033 if (isinstance == -1) {
6034 return 1;
6035 }
6036 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006037 *out = And;
6038 return 0;
6039 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006040 isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
6041 if (isinstance == -1) {
6042 return 1;
6043 }
6044 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006045 *out = Or;
6046 return 0;
6047 }
6048
Benjamin Peterson5b066812010-11-20 01:38:49 +00006049 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006050 return 1;
6051}
6052
6053int
6054obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
6055{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006056 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006057
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006058 isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
6059 if (isinstance == -1) {
6060 return 1;
6061 }
6062 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006063 *out = Add;
6064 return 0;
6065 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006066 isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
6067 if (isinstance == -1) {
6068 return 1;
6069 }
6070 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006071 *out = Sub;
6072 return 0;
6073 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006074 isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
6075 if (isinstance == -1) {
6076 return 1;
6077 }
6078 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006079 *out = Mult;
6080 return 0;
6081 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006082 isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
6083 if (isinstance == -1) {
6084 return 1;
6085 }
6086 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006087 *out = Div;
6088 return 0;
6089 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006090 isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
6091 if (isinstance == -1) {
6092 return 1;
6093 }
6094 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006095 *out = Mod;
6096 return 0;
6097 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006098 isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
6099 if (isinstance == -1) {
6100 return 1;
6101 }
6102 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006103 *out = Pow;
6104 return 0;
6105 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006106 isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
6107 if (isinstance == -1) {
6108 return 1;
6109 }
6110 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006111 *out = LShift;
6112 return 0;
6113 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006114 isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
6115 if (isinstance == -1) {
6116 return 1;
6117 }
6118 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006119 *out = RShift;
6120 return 0;
6121 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006122 isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
6123 if (isinstance == -1) {
6124 return 1;
6125 }
6126 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006127 *out = BitOr;
6128 return 0;
6129 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006130 isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
6131 if (isinstance == -1) {
6132 return 1;
6133 }
6134 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006135 *out = BitXor;
6136 return 0;
6137 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006138 isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
6139 if (isinstance == -1) {
6140 return 1;
6141 }
6142 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006143 *out = BitAnd;
6144 return 0;
6145 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006146 isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
6147 if (isinstance == -1) {
6148 return 1;
6149 }
6150 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006151 *out = FloorDiv;
6152 return 0;
6153 }
6154
Benjamin Peterson5b066812010-11-20 01:38:49 +00006155 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006156 return 1;
6157}
6158
6159int
6160obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
6161{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006162 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006163
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006164 isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
6165 if (isinstance == -1) {
6166 return 1;
6167 }
6168 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006169 *out = Invert;
6170 return 0;
6171 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006172 isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
6173 if (isinstance == -1) {
6174 return 1;
6175 }
6176 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006177 *out = Not;
6178 return 0;
6179 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006180 isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
6181 if (isinstance == -1) {
6182 return 1;
6183 }
6184 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006185 *out = UAdd;
6186 return 0;
6187 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006188 isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
6189 if (isinstance == -1) {
6190 return 1;
6191 }
6192 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006193 *out = USub;
6194 return 0;
6195 }
6196
Benjamin Peterson5b066812010-11-20 01:38:49 +00006197 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006198 return 1;
6199}
6200
6201int
6202obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
6203{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006204 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006205
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006206 isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
6207 if (isinstance == -1) {
6208 return 1;
6209 }
6210 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006211 *out = Eq;
6212 return 0;
6213 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006214 isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
6215 if (isinstance == -1) {
6216 return 1;
6217 }
6218 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006219 *out = NotEq;
6220 return 0;
6221 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006222 isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
6223 if (isinstance == -1) {
6224 return 1;
6225 }
6226 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006227 *out = Lt;
6228 return 0;
6229 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006230 isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
6231 if (isinstance == -1) {
6232 return 1;
6233 }
6234 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006235 *out = LtE;
6236 return 0;
6237 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006238 isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
6239 if (isinstance == -1) {
6240 return 1;
6241 }
6242 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006243 *out = Gt;
6244 return 0;
6245 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006246 isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
6247 if (isinstance == -1) {
6248 return 1;
6249 }
6250 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006251 *out = GtE;
6252 return 0;
6253 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006254 isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
6255 if (isinstance == -1) {
6256 return 1;
6257 }
6258 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006259 *out = Is;
6260 return 0;
6261 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006262 isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
6263 if (isinstance == -1) {
6264 return 1;
6265 }
6266 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006267 *out = IsNot;
6268 return 0;
6269 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006270 isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
6271 if (isinstance == -1) {
6272 return 1;
6273 }
6274 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006275 *out = In;
6276 return 0;
6277 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006278 isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
6279 if (isinstance == -1) {
6280 return 1;
6281 }
6282 if (isinstance) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006283 *out = NotIn;
6284 return 0;
6285 }
6286
Benjamin Peterson5b066812010-11-20 01:38:49 +00006287 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006288 return 1;
6289}
6290
6291int
6292obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
6293{
6294 PyObject* tmp = NULL;
6295 expr_ty target;
6296 expr_ty iter;
6297 asdl_seq* ifs;
6298
6299 if (PyObject_HasAttrString(obj, "target")) {
6300 int res;
6301 tmp = PyObject_GetAttrString(obj, "target");
6302 if (tmp == NULL) goto failed;
6303 res = obj2ast_expr(tmp, &target, arena);
6304 if (res != 0) goto failed;
6305 Py_XDECREF(tmp);
6306 tmp = NULL;
6307 } else {
6308 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
6309 return 1;
6310 }
6311 if (PyObject_HasAttrString(obj, "iter")) {
6312 int res;
6313 tmp = PyObject_GetAttrString(obj, "iter");
6314 if (tmp == NULL) goto failed;
6315 res = obj2ast_expr(tmp, &iter, arena);
6316 if (res != 0) goto failed;
6317 Py_XDECREF(tmp);
6318 tmp = NULL;
6319 } else {
6320 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
6321 return 1;
6322 }
6323 if (PyObject_HasAttrString(obj, "ifs")) {
6324 int res;
6325 Py_ssize_t len;
6326 Py_ssize_t i;
6327 tmp = PyObject_GetAttrString(obj, "ifs");
6328 if (tmp == NULL) goto failed;
6329 if (!PyList_Check(tmp)) {
6330 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6331 goto failed;
6332 }
6333 len = PyList_GET_SIZE(tmp);
6334 ifs = asdl_seq_new(len, arena);
6335 if (ifs == NULL) goto failed;
6336 for (i = 0; i < len; i++) {
6337 expr_ty value;
6338 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6339 if (res != 0) goto failed;
6340 asdl_seq_SET(ifs, i, value);
6341 }
6342 Py_XDECREF(tmp);
6343 tmp = NULL;
6344 } else {
6345 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
6346 return 1;
6347 }
6348 *out = comprehension(target, iter, ifs, arena);
6349 return 0;
6350failed:
6351 Py_XDECREF(tmp);
6352 return 1;
6353}
6354
6355int
6356obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
6357{
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006358 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00006359
Benjamin Petersond8f65972010-11-20 04:31:07 +00006360 PyObject *tmp = NULL;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006361 int lineno;
6362 int col_offset;
6363
Neal Norwitzad74aa82008-03-31 05:14:30 +00006364 if (obj == Py_None) {
6365 *out = NULL;
6366 return 0;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006367 }
6368 if (PyObject_HasAttrString(obj, "lineno")) {
6369 int res;
6370 tmp = PyObject_GetAttrString(obj, "lineno");
6371 if (tmp == NULL) goto failed;
6372 res = obj2ast_int(tmp, &lineno, arena);
6373 if (res != 0) goto failed;
6374 Py_XDECREF(tmp);
6375 tmp = NULL;
6376 } else {
6377 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
6378 return 1;
6379 }
6380 if (PyObject_HasAttrString(obj, "col_offset")) {
6381 int res;
6382 tmp = PyObject_GetAttrString(obj, "col_offset");
6383 if (tmp == NULL) goto failed;
6384 res = obj2ast_int(tmp, &col_offset, arena);
6385 if (res != 0) goto failed;
6386 Py_XDECREF(tmp);
6387 tmp = NULL;
6388 } else {
6389 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
6390 return 1;
6391 }
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006392 isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
6393 if (isinstance == -1) {
6394 return 1;
6395 }
6396 if (isinstance) {
Neal Norwitzad74aa82008-03-31 05:14:30 +00006397 expr_ty type;
6398 identifier name;
6399 asdl_seq* body;
6400
6401 if (PyObject_HasAttrString(obj, "type")) {
6402 int res;
6403 tmp = PyObject_GetAttrString(obj, "type");
6404 if (tmp == NULL) goto failed;
6405 res = obj2ast_expr(tmp, &type, arena);
6406 if (res != 0) goto failed;
6407 Py_XDECREF(tmp);
6408 tmp = NULL;
6409 } else {
6410 type = NULL;
6411 }
6412 if (PyObject_HasAttrString(obj, "name")) {
6413 int res;
6414 tmp = PyObject_GetAttrString(obj, "name");
6415 if (tmp == NULL) goto failed;
6416 res = obj2ast_identifier(tmp, &name, arena);
6417 if (res != 0) goto failed;
6418 Py_XDECREF(tmp);
6419 tmp = NULL;
6420 } else {
6421 name = NULL;
6422 }
6423 if (PyObject_HasAttrString(obj, "body")) {
6424 int res;
6425 Py_ssize_t len;
6426 Py_ssize_t i;
6427 tmp = PyObject_GetAttrString(obj, "body");
6428 if (tmp == NULL) goto failed;
6429 if (!PyList_Check(tmp)) {
6430 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6431 goto failed;
6432 }
6433 len = PyList_GET_SIZE(tmp);
6434 body = asdl_seq_new(len, arena);
6435 if (body == NULL) goto failed;
6436 for (i = 0; i < len; i++) {
6437 stmt_ty value;
6438 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
6439 if (res != 0) goto failed;
6440 asdl_seq_SET(body, i, value);
6441 }
6442 Py_XDECREF(tmp);
6443 tmp = NULL;
6444 } else {
6445 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
6446 return 1;
6447 }
6448 *out = ExceptHandler(type, name, body, lineno, col_offset,
6449 arena);
6450 if (*out == NULL) goto failed;
6451 return 0;
6452 }
6453
Benjamin Peterson5b066812010-11-20 01:38:49 +00006454 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
6455 failed:
Benjamin Peterson0a4dae52010-11-21 15:12:34 +00006456 Py_XDECREF(tmp);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006457 return 1;
6458}
6459
6460int
6461obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
6462{
6463 PyObject* tmp = NULL;
6464 asdl_seq* args;
6465 identifier vararg;
6466 expr_ty varargannotation;
6467 asdl_seq* kwonlyargs;
6468 identifier kwarg;
6469 expr_ty kwargannotation;
6470 asdl_seq* defaults;
6471 asdl_seq* kw_defaults;
6472
6473 if (PyObject_HasAttrString(obj, "args")) {
6474 int res;
6475 Py_ssize_t len;
6476 Py_ssize_t i;
6477 tmp = PyObject_GetAttrString(obj, "args");
6478 if (tmp == NULL) goto failed;
6479 if (!PyList_Check(tmp)) {
6480 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6481 goto failed;
6482 }
6483 len = PyList_GET_SIZE(tmp);
6484 args = asdl_seq_new(len, arena);
6485 if (args == NULL) goto failed;
6486 for (i = 0; i < len; i++) {
6487 arg_ty value;
6488 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &value, arena);
6489 if (res != 0) goto failed;
6490 asdl_seq_SET(args, i, value);
6491 }
6492 Py_XDECREF(tmp);
6493 tmp = NULL;
6494 } else {
6495 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
6496 return 1;
6497 }
6498 if (PyObject_HasAttrString(obj, "vararg")) {
6499 int res;
6500 tmp = PyObject_GetAttrString(obj, "vararg");
6501 if (tmp == NULL) goto failed;
6502 res = obj2ast_identifier(tmp, &vararg, arena);
6503 if (res != 0) goto failed;
6504 Py_XDECREF(tmp);
6505 tmp = NULL;
6506 } else {
6507 vararg = NULL;
6508 }
6509 if (PyObject_HasAttrString(obj, "varargannotation")) {
6510 int res;
6511 tmp = PyObject_GetAttrString(obj, "varargannotation");
6512 if (tmp == NULL) goto failed;
6513 res = obj2ast_expr(tmp, &varargannotation, arena);
6514 if (res != 0) goto failed;
6515 Py_XDECREF(tmp);
6516 tmp = NULL;
6517 } else {
6518 varargannotation = NULL;
6519 }
6520 if (PyObject_HasAttrString(obj, "kwonlyargs")) {
6521 int res;
6522 Py_ssize_t len;
6523 Py_ssize_t i;
6524 tmp = PyObject_GetAttrString(obj, "kwonlyargs");
6525 if (tmp == NULL) goto failed;
6526 if (!PyList_Check(tmp)) {
6527 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6528 goto failed;
6529 }
6530 len = PyList_GET_SIZE(tmp);
6531 kwonlyargs = asdl_seq_new(len, arena);
6532 if (kwonlyargs == NULL) goto failed;
6533 for (i = 0; i < len; i++) {
6534 arg_ty value;
6535 res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &value, arena);
6536 if (res != 0) goto failed;
6537 asdl_seq_SET(kwonlyargs, i, value);
6538 }
6539 Py_XDECREF(tmp);
6540 tmp = NULL;
6541 } else {
6542 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
6543 return 1;
6544 }
6545 if (PyObject_HasAttrString(obj, "kwarg")) {
6546 int res;
6547 tmp = PyObject_GetAttrString(obj, "kwarg");
6548 if (tmp == NULL) goto failed;
6549 res = obj2ast_identifier(tmp, &kwarg, arena);
6550 if (res != 0) goto failed;
6551 Py_XDECREF(tmp);
6552 tmp = NULL;
6553 } else {
6554 kwarg = NULL;
6555 }
6556 if (PyObject_HasAttrString(obj, "kwargannotation")) {
6557 int res;
6558 tmp = PyObject_GetAttrString(obj, "kwargannotation");
6559 if (tmp == NULL) goto failed;
6560 res = obj2ast_expr(tmp, &kwargannotation, arena);
6561 if (res != 0) goto failed;
6562 Py_XDECREF(tmp);
6563 tmp = NULL;
6564 } else {
6565 kwargannotation = NULL;
6566 }
6567 if (PyObject_HasAttrString(obj, "defaults")) {
6568 int res;
6569 Py_ssize_t len;
6570 Py_ssize_t i;
6571 tmp = PyObject_GetAttrString(obj, "defaults");
6572 if (tmp == NULL) goto failed;
6573 if (!PyList_Check(tmp)) {
6574 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6575 goto failed;
6576 }
6577 len = PyList_GET_SIZE(tmp);
6578 defaults = asdl_seq_new(len, arena);
6579 if (defaults == NULL) goto failed;
6580 for (i = 0; i < len; i++) {
6581 expr_ty value;
6582 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6583 if (res != 0) goto failed;
6584 asdl_seq_SET(defaults, i, value);
6585 }
6586 Py_XDECREF(tmp);
6587 tmp = NULL;
6588 } else {
6589 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
6590 return 1;
6591 }
6592 if (PyObject_HasAttrString(obj, "kw_defaults")) {
6593 int res;
6594 Py_ssize_t len;
6595 Py_ssize_t i;
6596 tmp = PyObject_GetAttrString(obj, "kw_defaults");
6597 if (tmp == NULL) goto failed;
6598 if (!PyList_Check(tmp)) {
6599 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6600 goto failed;
6601 }
6602 len = PyList_GET_SIZE(tmp);
6603 kw_defaults = asdl_seq_new(len, arena);
6604 if (kw_defaults == NULL) goto failed;
6605 for (i = 0; i < len; i++) {
6606 expr_ty value;
6607 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6608 if (res != 0) goto failed;
6609 asdl_seq_SET(kw_defaults, i, value);
6610 }
6611 Py_XDECREF(tmp);
6612 tmp = NULL;
6613 } else {
6614 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
6615 return 1;
6616 }
6617 *out = arguments(args, vararg, varargannotation, kwonlyargs, kwarg,
6618 kwargannotation, defaults, kw_defaults, arena);
6619 return 0;
6620failed:
6621 Py_XDECREF(tmp);
6622 return 1;
6623}
6624
6625int
6626obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
6627{
6628 PyObject* tmp = NULL;
6629 identifier arg;
6630 expr_ty annotation;
6631
6632 if (PyObject_HasAttrString(obj, "arg")) {
6633 int res;
6634 tmp = PyObject_GetAttrString(obj, "arg");
6635 if (tmp == NULL) goto failed;
6636 res = obj2ast_identifier(tmp, &arg, arena);
6637 if (res != 0) goto failed;
6638 Py_XDECREF(tmp);
6639 tmp = NULL;
6640 } else {
6641 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
6642 return 1;
6643 }
6644 if (PyObject_HasAttrString(obj, "annotation")) {
6645 int res;
6646 tmp = PyObject_GetAttrString(obj, "annotation");
6647 if (tmp == NULL) goto failed;
6648 res = obj2ast_expr(tmp, &annotation, arena);
6649 if (res != 0) goto failed;
6650 Py_XDECREF(tmp);
6651 tmp = NULL;
6652 } else {
6653 annotation = NULL;
6654 }
6655 *out = arg(arg, annotation, arena);
6656 return 0;
6657failed:
6658 Py_XDECREF(tmp);
6659 return 1;
6660}
6661
6662int
6663obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
6664{
6665 PyObject* tmp = NULL;
6666 identifier arg;
6667 expr_ty value;
6668
6669 if (PyObject_HasAttrString(obj, "arg")) {
6670 int res;
6671 tmp = PyObject_GetAttrString(obj, "arg");
6672 if (tmp == NULL) goto failed;
6673 res = obj2ast_identifier(tmp, &arg, arena);
6674 if (res != 0) goto failed;
6675 Py_XDECREF(tmp);
6676 tmp = NULL;
6677 } else {
6678 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword");
6679 return 1;
6680 }
6681 if (PyObject_HasAttrString(obj, "value")) {
6682 int res;
6683 tmp = PyObject_GetAttrString(obj, "value");
6684 if (tmp == NULL) goto failed;
6685 res = obj2ast_expr(tmp, &value, arena);
6686 if (res != 0) goto failed;
6687 Py_XDECREF(tmp);
6688 tmp = NULL;
6689 } else {
6690 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
6691 return 1;
6692 }
6693 *out = keyword(arg, value, arena);
6694 return 0;
6695failed:
6696 Py_XDECREF(tmp);
6697 return 1;
6698}
6699
6700int
6701obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
6702{
6703 PyObject* tmp = NULL;
6704 identifier name;
6705 identifier asname;
6706
6707 if (PyObject_HasAttrString(obj, "name")) {
6708 int res;
6709 tmp = PyObject_GetAttrString(obj, "name");
6710 if (tmp == NULL) goto failed;
6711 res = obj2ast_identifier(tmp, &name, arena);
6712 if (res != 0) goto failed;
6713 Py_XDECREF(tmp);
6714 tmp = NULL;
6715 } else {
6716 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
6717 return 1;
6718 }
6719 if (PyObject_HasAttrString(obj, "asname")) {
6720 int res;
6721 tmp = PyObject_GetAttrString(obj, "asname");
6722 if (tmp == NULL) goto failed;
6723 res = obj2ast_identifier(tmp, &asname, arena);
6724 if (res != 0) goto failed;
6725 Py_XDECREF(tmp);
6726 tmp = NULL;
6727 } else {
6728 asname = NULL;
6729 }
6730 *out = alias(name, asname, arena);
6731 return 0;
6732failed:
6733 Py_XDECREF(tmp);
6734 return 1;
6735}
6736
6737
Martin v. Löwis1a214512008-06-11 05:26:20 +00006738static struct PyModuleDef _astmodule = {
6739 PyModuleDef_HEAD_INIT, "_ast"
6740};
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006741PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006742PyInit__ast(void)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006743{
6744 PyObject *m, *d;
Martin v. Löwis1a214512008-06-11 05:26:20 +00006745 if (!init_types()) return NULL;
6746 m = PyModule_Create(&_astmodule);
6747 if (!m) return NULL;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006748 d = PyModule_GetDict(m);
Martin v. Löwis1a214512008-06-11 05:26:20 +00006749 if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return
6750 NULL;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006751 if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006752 return NULL;
Benjamin Petersonefad2442011-07-22 10:39:12 -05006753 if (PyModule_AddStringConstant(m, "__version__", "82163") < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006754 return NULL;
6755 if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return
6756 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006757 if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006758 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006759 if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006760 < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006761 if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006762 0) return NULL;
6763 if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
6764 NULL;
6765 if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return
6766 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006767 if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006768 < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006769 if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006770 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006771 if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006772 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006773 if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006774 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006775 if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006776 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006777 if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006778 0) return NULL;
6779 if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return
6780 NULL;
6781 if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
6782 NULL;
6783 if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
6784 if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return
6785 NULL;
6786 if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
6787 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006788 if (PyDict_SetItemString(d, "TryExcept", (PyObject*)TryExcept_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006789 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006790 if (PyDict_SetItemString(d, "TryFinally", (PyObject*)TryFinally_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006791 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006792 if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006793 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006794 if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006795 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006796 if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006797 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006798 if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006799 return NULL;
Jeremy Hylton81e95022007-02-27 06:50:52 +00006800 if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006801 return NULL;
6802 if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return
6803 NULL;
6804 if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return
6805 NULL;
6806 if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
6807 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006808 if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006809 return NULL;
6810 if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return
6811 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006812 if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006813 return NULL;
6814 if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
6815 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006816 if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006817 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006818 if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006819 return NULL;
6820 if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
6821 NULL;
6822 if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return
6823 NULL;
6824 if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return
6825 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006826 if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006827 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00006828 if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006829 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00006830 if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006831 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006832 if (PyDict_SetItemString(d, "GeneratorExp",
Martin v. Löwis1a214512008-06-11 05:26:20 +00006833 (PyObject*)GeneratorExp_type) < 0) return NULL;
6834 if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
6835 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006836 if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006837 return NULL;
6838 if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return
6839 NULL;
6840 if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return
6841 NULL;
6842 if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return
6843 NULL;
6844 if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return
6845 NULL;
Georg Brandl52318d62006-09-06 07:06:08 +00006846 if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006847 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006848 if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006849 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006850 if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006851 0) return NULL;
Guido van Rossum0368b722007-05-11 16:50:42 +00006852 if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006853 return NULL;
6854 if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return
6855 NULL;
6856 if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return
6857 NULL;
6858 if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
6859 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006860 if (PyDict_SetItemString(d, "expr_context",
Martin v. Löwis1a214512008-06-11 05:26:20 +00006861 (PyObject*)expr_context_type) < 0) return NULL;
6862 if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return
6863 NULL;
6864 if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
6865 NULL;
6866 if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return
6867 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006868 if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006869 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006870 if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006871 return NULL;
6872 if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
6873 NULL;
6874 if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
6875 NULL;
6876 if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
6877 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006878 if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006879 return NULL;
6880 if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
6881 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006882 if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006883 return NULL;
6884 if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return
6885 NULL;
6886 if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006887 if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006888 return NULL;
6889 if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return
6890 NULL;
6891 if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return
6892 NULL;
6893 if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return
6894 NULL;
6895 if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return
6896 NULL;
6897 if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return
6898 NULL;
6899 if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return
6900 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006901 if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006902 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006903 if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006904 return NULL;
6905 if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
6906 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006907 if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_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, "BitAnd", (PyObject*)BitAnd_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006910 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006911 if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006912 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006913 if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006914 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006915 if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006916 return NULL;
6917 if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return
6918 NULL;
6919 if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return
6920 NULL;
6921 if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return
6922 NULL;
6923 if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
6924 NULL;
6925 if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
6926 if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
6927 NULL;
6928 if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
6929 if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return
6930 NULL;
6931 if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
6932 if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return
6933 NULL;
6934 if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
6935 if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
6936 NULL;
6937 if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
6938 if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
6939 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006940 if (PyDict_SetItemString(d, "comprehension",
Martin v. Löwis1a214512008-06-11 05:26:20 +00006941 (PyObject*)comprehension_type) < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006942 if (PyDict_SetItemString(d, "excepthandler",
Martin v. Löwis1a214512008-06-11 05:26:20 +00006943 (PyObject*)excepthandler_type) < 0) return NULL;
Neal Norwitzad74aa82008-03-31 05:14:30 +00006944 if (PyDict_SetItemString(d, "ExceptHandler",
Martin v. Löwis1a214512008-06-11 05:26:20 +00006945 (PyObject*)ExceptHandler_type) < 0) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006946 if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) <
Martin v. Löwis1a214512008-06-11 05:26:20 +00006947 0) return NULL;
6948 if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return
6949 NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006950 if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00006951 return NULL;
6952 if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
6953 NULL;
6954 return m;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00006955}
6956
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006957
Martin v. Löwisbd260da2006-02-26 19:42:26 +00006958PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006959{
Martin v. Löwisbd260da2006-02-26 19:42:26 +00006960 init_types();
6961 return ast2obj_mod(t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006962}
Martin v. Löwis5b222132007-06-10 09:51:05 +00006963
Neal Norwitzdb4115f2008-03-31 04:20:05 +00006964/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
6965mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006966{
6967 mod_ty res;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00006968 PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
6969 (PyObject*)Interactive_type};
6970 char *req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006971 int isinstance;
Neal Norwitzdb4115f2008-03-31 04:20:05 +00006972 assert(0 <= mode && mode <= 2);
6973
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006974 init_types();
Neal Norwitzdb4115f2008-03-31 04:20:05 +00006975
Benjamin Peterson0496c9e2009-12-13 01:24:58 +00006976 isinstance = PyObject_IsInstance(ast, req_type[mode]);
6977 if (isinstance == -1)
6978 return NULL;
6979 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +00006980 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
6981 req_name[mode], Py_TYPE(ast)->tp_name);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006982 return NULL;
6983 }
6984 if (obj2ast_mod(ast, &res, arena) != 0)
6985 return NULL;
6986 else
6987 return res;
6988}
6989
6990int PyAST_Check(PyObject* obj)
6991{
6992 init_types();
Neal Norwitz207c9f32008-03-31 04:42:11 +00006993 return PyObject_IsInstance(obj, (PyObject*)&AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00006994}
6995
Martin v. Löwis5b222132007-06-10 09:51:05 +00006996