701ac4881d3a49b92d37489cc352595eee004749
[profile/ivi/python.git] / Python / Python-ast.c
1 /* File automatically generated by Parser/asdl_c.py. */
2
3
4 /*
5    __version__ 82160.
6
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 */
11
12 #include "Python.h"
13 #include "Python-ast.h"
14
15 static PyTypeObject AST_type;
16 static PyTypeObject *mod_type;
17 static PyObject* ast2obj_mod(void*);
18 static PyTypeObject *Module_type;
19 static char *Module_fields[]={
20         "body",
21 };
22 static PyTypeObject *Interactive_type;
23 static char *Interactive_fields[]={
24         "body",
25 };
26 static PyTypeObject *Expression_type;
27 static char *Expression_fields[]={
28         "body",
29 };
30 static PyTypeObject *Suite_type;
31 static char *Suite_fields[]={
32         "body",
33 };
34 static PyTypeObject *stmt_type;
35 static char *stmt_attributes[] = {
36         "lineno",
37         "col_offset",
38 };
39 static PyObject* ast2obj_stmt(void*);
40 static PyTypeObject *FunctionDef_type;
41 static char *FunctionDef_fields[]={
42         "name",
43         "args",
44         "body",
45         "decorator_list",
46 };
47 static PyTypeObject *ClassDef_type;
48 static char *ClassDef_fields[]={
49         "name",
50         "bases",
51         "body",
52         "decorator_list",
53 };
54 static PyTypeObject *Return_type;
55 static char *Return_fields[]={
56         "value",
57 };
58 static PyTypeObject *Delete_type;
59 static char *Delete_fields[]={
60         "targets",
61 };
62 static PyTypeObject *Assign_type;
63 static char *Assign_fields[]={
64         "targets",
65         "value",
66 };
67 static PyTypeObject *AugAssign_type;
68 static char *AugAssign_fields[]={
69         "target",
70         "op",
71         "value",
72 };
73 static PyTypeObject *Print_type;
74 static char *Print_fields[]={
75         "dest",
76         "values",
77         "nl",
78 };
79 static PyTypeObject *For_type;
80 static char *For_fields[]={
81         "target",
82         "iter",
83         "body",
84         "orelse",
85 };
86 static PyTypeObject *While_type;
87 static char *While_fields[]={
88         "test",
89         "body",
90         "orelse",
91 };
92 static PyTypeObject *If_type;
93 static char *If_fields[]={
94         "test",
95         "body",
96         "orelse",
97 };
98 static PyTypeObject *With_type;
99 static char *With_fields[]={
100         "context_expr",
101         "optional_vars",
102         "body",
103 };
104 static PyTypeObject *Raise_type;
105 static char *Raise_fields[]={
106         "type",
107         "inst",
108         "tback",
109 };
110 static PyTypeObject *TryExcept_type;
111 static char *TryExcept_fields[]={
112         "body",
113         "handlers",
114         "orelse",
115 };
116 static PyTypeObject *TryFinally_type;
117 static char *TryFinally_fields[]={
118         "body",
119         "finalbody",
120 };
121 static PyTypeObject *Assert_type;
122 static char *Assert_fields[]={
123         "test",
124         "msg",
125 };
126 static PyTypeObject *Import_type;
127 static char *Import_fields[]={
128         "names",
129 };
130 static PyTypeObject *ImportFrom_type;
131 static char *ImportFrom_fields[]={
132         "module",
133         "names",
134         "level",
135 };
136 static PyTypeObject *Exec_type;
137 static char *Exec_fields[]={
138         "body",
139         "globals",
140         "locals",
141 };
142 static PyTypeObject *Global_type;
143 static char *Global_fields[]={
144         "names",
145 };
146 static PyTypeObject *Expr_type;
147 static char *Expr_fields[]={
148         "value",
149 };
150 static PyTypeObject *Pass_type;
151 static PyTypeObject *Break_type;
152 static PyTypeObject *Continue_type;
153 static PyTypeObject *expr_type;
154 static char *expr_attributes[] = {
155         "lineno",
156         "col_offset",
157 };
158 static PyObject* ast2obj_expr(void*);
159 static PyTypeObject *BoolOp_type;
160 static char *BoolOp_fields[]={
161         "op",
162         "values",
163 };
164 static PyTypeObject *BinOp_type;
165 static char *BinOp_fields[]={
166         "left",
167         "op",
168         "right",
169 };
170 static PyTypeObject *UnaryOp_type;
171 static char *UnaryOp_fields[]={
172         "op",
173         "operand",
174 };
175 static PyTypeObject *Lambda_type;
176 static char *Lambda_fields[]={
177         "args",
178         "body",
179 };
180 static PyTypeObject *IfExp_type;
181 static char *IfExp_fields[]={
182         "test",
183         "body",
184         "orelse",
185 };
186 static PyTypeObject *Dict_type;
187 static char *Dict_fields[]={
188         "keys",
189         "values",
190 };
191 static PyTypeObject *Set_type;
192 static char *Set_fields[]={
193         "elts",
194 };
195 static PyTypeObject *ListComp_type;
196 static char *ListComp_fields[]={
197         "elt",
198         "generators",
199 };
200 static PyTypeObject *SetComp_type;
201 static char *SetComp_fields[]={
202         "elt",
203         "generators",
204 };
205 static PyTypeObject *DictComp_type;
206 static char *DictComp_fields[]={
207         "key",
208         "value",
209         "generators",
210 };
211 static PyTypeObject *GeneratorExp_type;
212 static char *GeneratorExp_fields[]={
213         "elt",
214         "generators",
215 };
216 static PyTypeObject *Yield_type;
217 static char *Yield_fields[]={
218         "value",
219 };
220 static PyTypeObject *Compare_type;
221 static char *Compare_fields[]={
222         "left",
223         "ops",
224         "comparators",
225 };
226 static PyTypeObject *Call_type;
227 static char *Call_fields[]={
228         "func",
229         "args",
230         "keywords",
231         "starargs",
232         "kwargs",
233 };
234 static PyTypeObject *Repr_type;
235 static char *Repr_fields[]={
236         "value",
237 };
238 static PyTypeObject *Num_type;
239 static char *Num_fields[]={
240         "n",
241 };
242 static PyTypeObject *Str_type;
243 static char *Str_fields[]={
244         "s",
245 };
246 static PyTypeObject *Attribute_type;
247 static char *Attribute_fields[]={
248         "value",
249         "attr",
250         "ctx",
251 };
252 static PyTypeObject *Subscript_type;
253 static char *Subscript_fields[]={
254         "value",
255         "slice",
256         "ctx",
257 };
258 static PyTypeObject *Name_type;
259 static char *Name_fields[]={
260         "id",
261         "ctx",
262 };
263 static PyTypeObject *List_type;
264 static char *List_fields[]={
265         "elts",
266         "ctx",
267 };
268 static PyTypeObject *Tuple_type;
269 static char *Tuple_fields[]={
270         "elts",
271         "ctx",
272 };
273 static PyTypeObject *expr_context_type;
274 static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
275 *AugLoad_singleton, *AugStore_singleton, *Param_singleton;
276 static PyObject* ast2obj_expr_context(expr_context_ty);
277 static PyTypeObject *Load_type;
278 static PyTypeObject *Store_type;
279 static PyTypeObject *Del_type;
280 static PyTypeObject *AugLoad_type;
281 static PyTypeObject *AugStore_type;
282 static PyTypeObject *Param_type;
283 static PyTypeObject *slice_type;
284 static PyObject* ast2obj_slice(void*);
285 static PyTypeObject *Ellipsis_type;
286 static PyTypeObject *Slice_type;
287 static char *Slice_fields[]={
288         "lower",
289         "upper",
290         "step",
291 };
292 static PyTypeObject *ExtSlice_type;
293 static char *ExtSlice_fields[]={
294         "dims",
295 };
296 static PyTypeObject *Index_type;
297 static char *Index_fields[]={
298         "value",
299 };
300 static PyTypeObject *boolop_type;
301 static PyObject *And_singleton, *Or_singleton;
302 static PyObject* ast2obj_boolop(boolop_ty);
303 static PyTypeObject *And_type;
304 static PyTypeObject *Or_type;
305 static PyTypeObject *operator_type;
306 static 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;
310 static PyObject* ast2obj_operator(operator_ty);
311 static PyTypeObject *Add_type;
312 static PyTypeObject *Sub_type;
313 static PyTypeObject *Mult_type;
314 static PyTypeObject *Div_type;
315 static PyTypeObject *Mod_type;
316 static PyTypeObject *Pow_type;
317 static PyTypeObject *LShift_type;
318 static PyTypeObject *RShift_type;
319 static PyTypeObject *BitOr_type;
320 static PyTypeObject *BitXor_type;
321 static PyTypeObject *BitAnd_type;
322 static PyTypeObject *FloorDiv_type;
323 static PyTypeObject *unaryop_type;
324 static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
325 *USub_singleton;
326 static PyObject* ast2obj_unaryop(unaryop_ty);
327 static PyTypeObject *Invert_type;
328 static PyTypeObject *Not_type;
329 static PyTypeObject *UAdd_type;
330 static PyTypeObject *USub_type;
331 static PyTypeObject *cmpop_type;
332 static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
333 *Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
334 *NotIn_singleton;
335 static PyObject* ast2obj_cmpop(cmpop_ty);
336 static PyTypeObject *Eq_type;
337 static PyTypeObject *NotEq_type;
338 static PyTypeObject *Lt_type;
339 static PyTypeObject *LtE_type;
340 static PyTypeObject *Gt_type;
341 static PyTypeObject *GtE_type;
342 static PyTypeObject *Is_type;
343 static PyTypeObject *IsNot_type;
344 static PyTypeObject *In_type;
345 static PyTypeObject *NotIn_type;
346 static PyTypeObject *comprehension_type;
347 static PyObject* ast2obj_comprehension(void*);
348 static char *comprehension_fields[]={
349         "target",
350         "iter",
351         "ifs",
352 };
353 static PyTypeObject *excepthandler_type;
354 static char *excepthandler_attributes[] = {
355         "lineno",
356         "col_offset",
357 };
358 static PyObject* ast2obj_excepthandler(void*);
359 static PyTypeObject *ExceptHandler_type;
360 static char *ExceptHandler_fields[]={
361         "type",
362         "name",
363         "body",
364 };
365 static PyTypeObject *arguments_type;
366 static PyObject* ast2obj_arguments(void*);
367 static char *arguments_fields[]={
368         "args",
369         "vararg",
370         "kwarg",
371         "defaults",
372 };
373 static PyTypeObject *keyword_type;
374 static PyObject* ast2obj_keyword(void*);
375 static char *keyword_fields[]={
376         "arg",
377         "value",
378 };
379 static PyTypeObject *alias_type;
380 static PyObject* ast2obj_alias(void*);
381 static char *alias_fields[]={
382         "name",
383         "asname",
384 };
385
386
387 static int
388 ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
389 {
390     Py_ssize_t i, numfields = 0;
391     int res = -1;
392     PyObject *key, *value, *fields;
393     fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields");
394     if (!fields)
395         PyErr_Clear();
396     if (fields) {
397         numfields = PySequence_Size(fields);
398         if (numfields == -1)
399             goto cleanup;
400     }
401     res = 0; /* if no error occurs, this stays 0 to the end */
402     if (PyTuple_GET_SIZE(args) > 0) {
403         if (numfields != PyTuple_GET_SIZE(args)) {
404             PyErr_Format(PyExc_TypeError, "%.400s constructor takes %s"
405                          "%zd positional argument%s",
406                          Py_TYPE(self)->tp_name,
407                          numfields == 0 ? "" : "either 0 or ",
408                          numfields, numfields == 1 ? "" : "s");
409             res = -1;
410             goto cleanup;
411         }
412         for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
413             /* cannot be reached when fields is NULL */
414             PyObject *name = PySequence_GetItem(fields, i);
415             if (!name) {
416                 res = -1;
417                 goto cleanup;
418             }
419             res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
420             Py_DECREF(name);
421             if (res < 0)
422                 goto cleanup;
423         }
424     }
425     if (kw) {
426         i = 0;  /* needed by PyDict_Next */
427         while (PyDict_Next(kw, &i, &key, &value)) {
428             res = PyObject_SetAttr(self, key, value);
429             if (res < 0)
430                 goto cleanup;
431         }
432     }
433   cleanup:
434     Py_XDECREF(fields);
435     return res;
436 }
437
438 /* Pickling support */
439 static PyObject *
440 ast_type_reduce(PyObject *self, PyObject *unused)
441 {
442     PyObject *res;
443     PyObject *dict = PyObject_GetAttrString(self, "__dict__");
444     if (dict == NULL) {
445         if (PyErr_ExceptionMatches(PyExc_AttributeError))
446             PyErr_Clear();
447         else
448             return NULL;
449     }
450     if (dict) {
451         res = Py_BuildValue("O()O", Py_TYPE(self), dict);
452         Py_DECREF(dict);
453         return res;
454     }
455     return Py_BuildValue("O()", Py_TYPE(self));
456 }
457
458 static PyMethodDef ast_type_methods[] = {
459     {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
460     {NULL}
461 };
462
463 static PyTypeObject AST_type = {
464     PyVarObject_HEAD_INIT(&PyType_Type, 0)
465     "_ast.AST",
466     sizeof(PyObject),
467     0,
468     0,                       /* tp_dealloc */
469     0,                       /* tp_print */
470     0,                       /* tp_getattr */
471     0,                       /* tp_setattr */
472     0,                       /* tp_compare */
473     0,                       /* tp_repr */
474     0,                       /* tp_as_number */
475     0,                       /* tp_as_sequence */
476     0,                       /* tp_as_mapping */
477     0,                       /* tp_hash */
478     0,                       /* tp_call */
479     0,                       /* tp_str */
480     PyObject_GenericGetAttr, /* tp_getattro */
481     PyObject_GenericSetAttr, /* tp_setattro */
482     0,                       /* tp_as_buffer */
483     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
484     0,                       /* tp_doc */
485     0,                       /* tp_traverse */
486     0,                       /* tp_clear */
487     0,                       /* tp_richcompare */
488     0,                       /* tp_weaklistoffset */
489     0,                       /* tp_iter */
490     0,                       /* tp_iternext */
491     ast_type_methods,        /* tp_methods */
492     0,                       /* tp_members */
493     0,                       /* tp_getset */
494     0,                       /* tp_base */
495     0,                       /* tp_dict */
496     0,                       /* tp_descr_get */
497     0,                       /* tp_descr_set */
498     0,                       /* tp_dictoffset */
499     (initproc)ast_type_init, /* tp_init */
500     PyType_GenericAlloc,     /* tp_alloc */
501     PyType_GenericNew,       /* tp_new */
502     PyObject_Del,            /* tp_free */
503 };
504
505
506 static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
507 {
508     PyObject *fnames, *result;
509     int i;
510     fnames = PyTuple_New(num_fields);
511     if (!fnames) return NULL;
512     for (i = 0; i < num_fields; i++) {
513         PyObject *field = PyString_FromString(fields[i]);
514         if (!field) {
515             Py_DECREF(fnames);
516             return NULL;
517         }
518         PyTuple_SET_ITEM(fnames, i, field);
519     }
520     result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){sOss}",
521                     type, base, "_fields", fnames, "__module__", "_ast");
522     Py_DECREF(fnames);
523     return (PyTypeObject*)result;
524 }
525
526 static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
527 {
528     int i, result;
529     PyObject *s, *l = PyTuple_New(num_fields);
530     if (!l)
531         return 0;
532     for (i = 0; i < num_fields; i++) {
533         s = PyString_FromString(attrs[i]);
534         if (!s) {
535             Py_DECREF(l);
536             return 0;
537         }
538         PyTuple_SET_ITEM(l, i, s);
539     }
540     result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0;
541     Py_DECREF(l);
542     return result;
543 }
544
545 /* Conversion AST -> Python */
546
547 static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
548 {
549     int i, n = asdl_seq_LEN(seq);
550     PyObject *result = PyList_New(n);
551     PyObject *value;
552     if (!result)
553         return NULL;
554     for (i = 0; i < n; i++) {
555         value = func(asdl_seq_GET(seq, i));
556         if (!value) {
557             Py_DECREF(result);
558             return NULL;
559         }
560         PyList_SET_ITEM(result, i, value);
561     }
562     return result;
563 }
564
565 static PyObject* ast2obj_object(void *o)
566 {
567     if (!o)
568         o = Py_None;
569     Py_INCREF((PyObject*)o);
570     return (PyObject*)o;
571 }
572 #define ast2obj_identifier ast2obj_object
573 #define ast2obj_string ast2obj_object
574 static PyObject* ast2obj_bool(bool b)
575 {
576     return PyBool_FromLong(b);
577 }
578
579 static PyObject* ast2obj_int(long b)
580 {
581     return PyInt_FromLong(b);
582 }
583
584 /* Conversion Python -> AST */
585
586 static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
587 {
588     if (obj == Py_None)
589         obj = NULL;
590     if (obj)
591         PyArena_AddPyObject(arena, obj);
592     Py_XINCREF(obj);
593     *out = obj;
594     return 0;
595 }
596
597 #define obj2ast_identifier obj2ast_object
598 #define obj2ast_string obj2ast_object
599
600 static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
601 {
602     int i;
603     if (!PyInt_Check(obj) && !PyLong_Check(obj)) {
604         PyObject *s = PyObject_Repr(obj);
605         if (s == NULL) return 1;
606         PyErr_Format(PyExc_ValueError, "invalid integer value: %.400s",
607                      PyString_AS_STRING(s));
608         Py_DECREF(s);
609         return 1;
610     }
611
612     i = (int)PyLong_AsLong(obj);
613     if (i == -1 && PyErr_Occurred())
614         return 1;
615     *out = i;
616     return 0;
617 }
618
619 static int obj2ast_bool(PyObject* obj, bool* out, PyArena* arena)
620 {
621     if (!PyBool_Check(obj)) {
622         PyObject *s = PyObject_Repr(obj);
623         if (s == NULL) return 1;
624         PyErr_Format(PyExc_ValueError, "invalid boolean value: %.400s",
625                      PyString_AS_STRING(s));
626         Py_DECREF(s);
627         return 1;
628     }
629
630     *out = (obj == Py_True);
631     return 0;
632 }
633
634 static int add_ast_fields(void)
635 {
636     PyObject *empty_tuple, *d;
637     if (PyType_Ready(&AST_type) < 0)
638         return -1;
639     d = AST_type.tp_dict;
640     empty_tuple = PyTuple_New(0);
641     if (!empty_tuple ||
642         PyDict_SetItemString(d, "_fields", empty_tuple) < 0 ||
643         PyDict_SetItemString(d, "_attributes", empty_tuple) < 0) {
644         Py_XDECREF(empty_tuple);
645         return -1;
646     }
647     Py_DECREF(empty_tuple);
648     return 0;
649 }
650
651
652 static int init_types(void)
653 {
654         static int initialized;
655         if (initialized) return 1;
656         if (add_ast_fields() < 0) return 0;
657         mod_type = make_type("mod", &AST_type, NULL, 0);
658         if (!mod_type) return 0;
659         if (!add_attributes(mod_type, NULL, 0)) return 0;
660         Module_type = make_type("Module", mod_type, Module_fields, 1);
661         if (!Module_type) return 0;
662         Interactive_type = make_type("Interactive", mod_type,
663                                      Interactive_fields, 1);
664         if (!Interactive_type) return 0;
665         Expression_type = make_type("Expression", mod_type, Expression_fields,
666                                     1);
667         if (!Expression_type) return 0;
668         Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
669         if (!Suite_type) return 0;
670         stmt_type = make_type("stmt", &AST_type, NULL, 0);
671         if (!stmt_type) return 0;
672         if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
673         FunctionDef_type = make_type("FunctionDef", stmt_type,
674                                      FunctionDef_fields, 4);
675         if (!FunctionDef_type) return 0;
676         ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 4);
677         if (!ClassDef_type) return 0;
678         Return_type = make_type("Return", stmt_type, Return_fields, 1);
679         if (!Return_type) return 0;
680         Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
681         if (!Delete_type) return 0;
682         Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
683         if (!Assign_type) return 0;
684         AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
685         if (!AugAssign_type) return 0;
686         Print_type = make_type("Print", stmt_type, Print_fields, 3);
687         if (!Print_type) return 0;
688         For_type = make_type("For", stmt_type, For_fields, 4);
689         if (!For_type) return 0;
690         While_type = make_type("While", stmt_type, While_fields, 3);
691         if (!While_type) return 0;
692         If_type = make_type("If", stmt_type, If_fields, 3);
693         if (!If_type) return 0;
694         With_type = make_type("With", stmt_type, With_fields, 3);
695         if (!With_type) return 0;
696         Raise_type = make_type("Raise", stmt_type, Raise_fields, 3);
697         if (!Raise_type) return 0;
698         TryExcept_type = make_type("TryExcept", stmt_type, TryExcept_fields, 3);
699         if (!TryExcept_type) return 0;
700         TryFinally_type = make_type("TryFinally", stmt_type, TryFinally_fields,
701                                     2);
702         if (!TryFinally_type) return 0;
703         Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
704         if (!Assert_type) return 0;
705         Import_type = make_type("Import", stmt_type, Import_fields, 1);
706         if (!Import_type) return 0;
707         ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields,
708                                     3);
709         if (!ImportFrom_type) return 0;
710         Exec_type = make_type("Exec", stmt_type, Exec_fields, 3);
711         if (!Exec_type) return 0;
712         Global_type = make_type("Global", stmt_type, Global_fields, 1);
713         if (!Global_type) return 0;
714         Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
715         if (!Expr_type) return 0;
716         Pass_type = make_type("Pass", stmt_type, NULL, 0);
717         if (!Pass_type) return 0;
718         Break_type = make_type("Break", stmt_type, NULL, 0);
719         if (!Break_type) return 0;
720         Continue_type = make_type("Continue", stmt_type, NULL, 0);
721         if (!Continue_type) return 0;
722         expr_type = make_type("expr", &AST_type, NULL, 0);
723         if (!expr_type) return 0;
724         if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
725         BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
726         if (!BoolOp_type) return 0;
727         BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
728         if (!BinOp_type) return 0;
729         UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
730         if (!UnaryOp_type) return 0;
731         Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
732         if (!Lambda_type) return 0;
733         IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
734         if (!IfExp_type) return 0;
735         Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
736         if (!Dict_type) return 0;
737         Set_type = make_type("Set", expr_type, Set_fields, 1);
738         if (!Set_type) return 0;
739         ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
740         if (!ListComp_type) return 0;
741         SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
742         if (!SetComp_type) return 0;
743         DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
744         if (!DictComp_type) return 0;
745         GeneratorExp_type = make_type("GeneratorExp", expr_type,
746                                       GeneratorExp_fields, 2);
747         if (!GeneratorExp_type) return 0;
748         Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
749         if (!Yield_type) return 0;
750         Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
751         if (!Compare_type) return 0;
752         Call_type = make_type("Call", expr_type, Call_fields, 5);
753         if (!Call_type) return 0;
754         Repr_type = make_type("Repr", expr_type, Repr_fields, 1);
755         if (!Repr_type) return 0;
756         Num_type = make_type("Num", expr_type, Num_fields, 1);
757         if (!Num_type) return 0;
758         Str_type = make_type("Str", expr_type, Str_fields, 1);
759         if (!Str_type) return 0;
760         Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
761         if (!Attribute_type) return 0;
762         Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
763         if (!Subscript_type) return 0;
764         Name_type = make_type("Name", expr_type, Name_fields, 2);
765         if (!Name_type) return 0;
766         List_type = make_type("List", expr_type, List_fields, 2);
767         if (!List_type) return 0;
768         Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
769         if (!Tuple_type) return 0;
770         expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
771         if (!expr_context_type) return 0;
772         if (!add_attributes(expr_context_type, NULL, 0)) return 0;
773         Load_type = make_type("Load", expr_context_type, NULL, 0);
774         if (!Load_type) return 0;
775         Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
776         if (!Load_singleton) return 0;
777         Store_type = make_type("Store", expr_context_type, NULL, 0);
778         if (!Store_type) return 0;
779         Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
780         if (!Store_singleton) return 0;
781         Del_type = make_type("Del", expr_context_type, NULL, 0);
782         if (!Del_type) return 0;
783         Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
784         if (!Del_singleton) return 0;
785         AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
786         if (!AugLoad_type) return 0;
787         AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
788         if (!AugLoad_singleton) return 0;
789         AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
790         if (!AugStore_type) return 0;
791         AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
792         if (!AugStore_singleton) return 0;
793         Param_type = make_type("Param", expr_context_type, NULL, 0);
794         if (!Param_type) return 0;
795         Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
796         if (!Param_singleton) return 0;
797         slice_type = make_type("slice", &AST_type, NULL, 0);
798         if (!slice_type) return 0;
799         if (!add_attributes(slice_type, NULL, 0)) return 0;
800         Ellipsis_type = make_type("Ellipsis", slice_type, NULL, 0);
801         if (!Ellipsis_type) return 0;
802         Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
803         if (!Slice_type) return 0;
804         ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
805         if (!ExtSlice_type) return 0;
806         Index_type = make_type("Index", slice_type, Index_fields, 1);
807         if (!Index_type) return 0;
808         boolop_type = make_type("boolop", &AST_type, NULL, 0);
809         if (!boolop_type) return 0;
810         if (!add_attributes(boolop_type, NULL, 0)) return 0;
811         And_type = make_type("And", boolop_type, NULL, 0);
812         if (!And_type) return 0;
813         And_singleton = PyType_GenericNew(And_type, NULL, NULL);
814         if (!And_singleton) return 0;
815         Or_type = make_type("Or", boolop_type, NULL, 0);
816         if (!Or_type) return 0;
817         Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
818         if (!Or_singleton) return 0;
819         operator_type = make_type("operator", &AST_type, NULL, 0);
820         if (!operator_type) return 0;
821         if (!add_attributes(operator_type, NULL, 0)) return 0;
822         Add_type = make_type("Add", operator_type, NULL, 0);
823         if (!Add_type) return 0;
824         Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
825         if (!Add_singleton) return 0;
826         Sub_type = make_type("Sub", operator_type, NULL, 0);
827         if (!Sub_type) return 0;
828         Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
829         if (!Sub_singleton) return 0;
830         Mult_type = make_type("Mult", operator_type, NULL, 0);
831         if (!Mult_type) return 0;
832         Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
833         if (!Mult_singleton) return 0;
834         Div_type = make_type("Div", operator_type, NULL, 0);
835         if (!Div_type) return 0;
836         Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
837         if (!Div_singleton) return 0;
838         Mod_type = make_type("Mod", operator_type, NULL, 0);
839         if (!Mod_type) return 0;
840         Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
841         if (!Mod_singleton) return 0;
842         Pow_type = make_type("Pow", operator_type, NULL, 0);
843         if (!Pow_type) return 0;
844         Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
845         if (!Pow_singleton) return 0;
846         LShift_type = make_type("LShift", operator_type, NULL, 0);
847         if (!LShift_type) return 0;
848         LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
849         if (!LShift_singleton) return 0;
850         RShift_type = make_type("RShift", operator_type, NULL, 0);
851         if (!RShift_type) return 0;
852         RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
853         if (!RShift_singleton) return 0;
854         BitOr_type = make_type("BitOr", operator_type, NULL, 0);
855         if (!BitOr_type) return 0;
856         BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
857         if (!BitOr_singleton) return 0;
858         BitXor_type = make_type("BitXor", operator_type, NULL, 0);
859         if (!BitXor_type) return 0;
860         BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
861         if (!BitXor_singleton) return 0;
862         BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
863         if (!BitAnd_type) return 0;
864         BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
865         if (!BitAnd_singleton) return 0;
866         FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
867         if (!FloorDiv_type) return 0;
868         FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
869         if (!FloorDiv_singleton) return 0;
870         unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
871         if (!unaryop_type) return 0;
872         if (!add_attributes(unaryop_type, NULL, 0)) return 0;
873         Invert_type = make_type("Invert", unaryop_type, NULL, 0);
874         if (!Invert_type) return 0;
875         Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
876         if (!Invert_singleton) return 0;
877         Not_type = make_type("Not", unaryop_type, NULL, 0);
878         if (!Not_type) return 0;
879         Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
880         if (!Not_singleton) return 0;
881         UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
882         if (!UAdd_type) return 0;
883         UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
884         if (!UAdd_singleton) return 0;
885         USub_type = make_type("USub", unaryop_type, NULL, 0);
886         if (!USub_type) return 0;
887         USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
888         if (!USub_singleton) return 0;
889         cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
890         if (!cmpop_type) return 0;
891         if (!add_attributes(cmpop_type, NULL, 0)) return 0;
892         Eq_type = make_type("Eq", cmpop_type, NULL, 0);
893         if (!Eq_type) return 0;
894         Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
895         if (!Eq_singleton) return 0;
896         NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
897         if (!NotEq_type) return 0;
898         NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
899         if (!NotEq_singleton) return 0;
900         Lt_type = make_type("Lt", cmpop_type, NULL, 0);
901         if (!Lt_type) return 0;
902         Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
903         if (!Lt_singleton) return 0;
904         LtE_type = make_type("LtE", cmpop_type, NULL, 0);
905         if (!LtE_type) return 0;
906         LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
907         if (!LtE_singleton) return 0;
908         Gt_type = make_type("Gt", cmpop_type, NULL, 0);
909         if (!Gt_type) return 0;
910         Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
911         if (!Gt_singleton) return 0;
912         GtE_type = make_type("GtE", cmpop_type, NULL, 0);
913         if (!GtE_type) return 0;
914         GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
915         if (!GtE_singleton) return 0;
916         Is_type = make_type("Is", cmpop_type, NULL, 0);
917         if (!Is_type) return 0;
918         Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
919         if (!Is_singleton) return 0;
920         IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
921         if (!IsNot_type) return 0;
922         IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
923         if (!IsNot_singleton) return 0;
924         In_type = make_type("In", cmpop_type, NULL, 0);
925         if (!In_type) return 0;
926         In_singleton = PyType_GenericNew(In_type, NULL, NULL);
927         if (!In_singleton) return 0;
928         NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
929         if (!NotIn_type) return 0;
930         NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
931         if (!NotIn_singleton) return 0;
932         comprehension_type = make_type("comprehension", &AST_type,
933                                        comprehension_fields, 3);
934         if (!comprehension_type) return 0;
935         excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
936         if (!excepthandler_type) return 0;
937         if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
938             return 0;
939         ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
940                                        ExceptHandler_fields, 3);
941         if (!ExceptHandler_type) return 0;
942         arguments_type = make_type("arguments", &AST_type, arguments_fields, 4);
943         if (!arguments_type) return 0;
944         keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
945         if (!keyword_type) return 0;
946         alias_type = make_type("alias", &AST_type, alias_fields, 2);
947         if (!alias_type) return 0;
948         initialized = 1;
949         return 1;
950 }
951
952 static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
953 static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
954 static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
955 static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
956                                 arena);
957 static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
958 static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
959 static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
960 static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
961 static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
962 static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
963                                  arena);
964 static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
965                                  arena);
966 static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
967 static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
968 static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
969
970 mod_ty
971 Module(asdl_seq * body, PyArena *arena)
972 {
973         mod_ty p;
974         p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
975         if (!p)
976                 return NULL;
977         p->kind = Module_kind;
978         p->v.Module.body = body;
979         return p;
980 }
981
982 mod_ty
983 Interactive(asdl_seq * body, PyArena *arena)
984 {
985         mod_ty p;
986         p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
987         if (!p)
988                 return NULL;
989         p->kind = Interactive_kind;
990         p->v.Interactive.body = body;
991         return p;
992 }
993
994 mod_ty
995 Expression(expr_ty body, PyArena *arena)
996 {
997         mod_ty p;
998         if (!body) {
999                 PyErr_SetString(PyExc_ValueError,
1000                                 "field body is required for Expression");
1001                 return NULL;
1002         }
1003         p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1004         if (!p)
1005                 return NULL;
1006         p->kind = Expression_kind;
1007         p->v.Expression.body = body;
1008         return p;
1009 }
1010
1011 mod_ty
1012 Suite(asdl_seq * body, PyArena *arena)
1013 {
1014         mod_ty p;
1015         p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1016         if (!p)
1017                 return NULL;
1018         p->kind = Suite_kind;
1019         p->v.Suite.body = body;
1020         return p;
1021 }
1022
1023 stmt_ty
1024 FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
1025             decorator_list, int lineno, int col_offset, PyArena *arena)
1026 {
1027         stmt_ty p;
1028         if (!name) {
1029                 PyErr_SetString(PyExc_ValueError,
1030                                 "field name is required for FunctionDef");
1031                 return NULL;
1032         }
1033         if (!args) {
1034                 PyErr_SetString(PyExc_ValueError,
1035                                 "field args is required for FunctionDef");
1036                 return NULL;
1037         }
1038         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1039         if (!p)
1040                 return NULL;
1041         p->kind = FunctionDef_kind;
1042         p->v.FunctionDef.name = name;
1043         p->v.FunctionDef.args = args;
1044         p->v.FunctionDef.body = body;
1045         p->v.FunctionDef.decorator_list = decorator_list;
1046         p->lineno = lineno;
1047         p->col_offset = col_offset;
1048         return p;
1049 }
1050
1051 stmt_ty
1052 ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, asdl_seq *
1053          decorator_list, int lineno, int col_offset, PyArena *arena)
1054 {
1055         stmt_ty p;
1056         if (!name) {
1057                 PyErr_SetString(PyExc_ValueError,
1058                                 "field name is required for ClassDef");
1059                 return NULL;
1060         }
1061         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1062         if (!p)
1063                 return NULL;
1064         p->kind = ClassDef_kind;
1065         p->v.ClassDef.name = name;
1066         p->v.ClassDef.bases = bases;
1067         p->v.ClassDef.body = body;
1068         p->v.ClassDef.decorator_list = decorator_list;
1069         p->lineno = lineno;
1070         p->col_offset = col_offset;
1071         return p;
1072 }
1073
1074 stmt_ty
1075 Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
1076 {
1077         stmt_ty p;
1078         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1079         if (!p)
1080                 return NULL;
1081         p->kind = Return_kind;
1082         p->v.Return.value = value;
1083         p->lineno = lineno;
1084         p->col_offset = col_offset;
1085         return p;
1086 }
1087
1088 stmt_ty
1089 Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
1090 {
1091         stmt_ty p;
1092         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1093         if (!p)
1094                 return NULL;
1095         p->kind = Delete_kind;
1096         p->v.Delete.targets = targets;
1097         p->lineno = lineno;
1098         p->col_offset = col_offset;
1099         return p;
1100 }
1101
1102 stmt_ty
1103 Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
1104        *arena)
1105 {
1106         stmt_ty p;
1107         if (!value) {
1108                 PyErr_SetString(PyExc_ValueError,
1109                                 "field value is required for Assign");
1110                 return NULL;
1111         }
1112         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1113         if (!p)
1114                 return NULL;
1115         p->kind = Assign_kind;
1116         p->v.Assign.targets = targets;
1117         p->v.Assign.value = value;
1118         p->lineno = lineno;
1119         p->col_offset = col_offset;
1120         return p;
1121 }
1122
1123 stmt_ty
1124 AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1125           col_offset, PyArena *arena)
1126 {
1127         stmt_ty p;
1128         if (!target) {
1129                 PyErr_SetString(PyExc_ValueError,
1130                                 "field target is required for AugAssign");
1131                 return NULL;
1132         }
1133         if (!op) {
1134                 PyErr_SetString(PyExc_ValueError,
1135                                 "field op is required for AugAssign");
1136                 return NULL;
1137         }
1138         if (!value) {
1139                 PyErr_SetString(PyExc_ValueError,
1140                                 "field value is required for AugAssign");
1141                 return NULL;
1142         }
1143         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1144         if (!p)
1145                 return NULL;
1146         p->kind = AugAssign_kind;
1147         p->v.AugAssign.target = target;
1148         p->v.AugAssign.op = op;
1149         p->v.AugAssign.value = value;
1150         p->lineno = lineno;
1151         p->col_offset = col_offset;
1152         return p;
1153 }
1154
1155 stmt_ty
1156 Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, int col_offset,
1157       PyArena *arena)
1158 {
1159         stmt_ty p;
1160         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1161         if (!p)
1162                 return NULL;
1163         p->kind = Print_kind;
1164         p->v.Print.dest = dest;
1165         p->v.Print.values = values;
1166         p->v.Print.nl = nl;
1167         p->lineno = lineno;
1168         p->col_offset = col_offset;
1169         return p;
1170 }
1171
1172 stmt_ty
1173 For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
1174     lineno, int col_offset, PyArena *arena)
1175 {
1176         stmt_ty p;
1177         if (!target) {
1178                 PyErr_SetString(PyExc_ValueError,
1179                                 "field target is required for For");
1180                 return NULL;
1181         }
1182         if (!iter) {
1183                 PyErr_SetString(PyExc_ValueError,
1184                                 "field iter is required for For");
1185                 return NULL;
1186         }
1187         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1188         if (!p)
1189                 return NULL;
1190         p->kind = For_kind;
1191         p->v.For.target = target;
1192         p->v.For.iter = iter;
1193         p->v.For.body = body;
1194         p->v.For.orelse = orelse;
1195         p->lineno = lineno;
1196         p->col_offset = col_offset;
1197         return p;
1198 }
1199
1200 stmt_ty
1201 While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1202       col_offset, PyArena *arena)
1203 {
1204         stmt_ty p;
1205         if (!test) {
1206                 PyErr_SetString(PyExc_ValueError,
1207                                 "field test is required for While");
1208                 return NULL;
1209         }
1210         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1211         if (!p)
1212                 return NULL;
1213         p->kind = While_kind;
1214         p->v.While.test = test;
1215         p->v.While.body = body;
1216         p->v.While.orelse = orelse;
1217         p->lineno = lineno;
1218         p->col_offset = col_offset;
1219         return p;
1220 }
1221
1222 stmt_ty
1223 If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
1224    col_offset, PyArena *arena)
1225 {
1226         stmt_ty p;
1227         if (!test) {
1228                 PyErr_SetString(PyExc_ValueError,
1229                                 "field test is required for If");
1230                 return NULL;
1231         }
1232         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1233         if (!p)
1234                 return NULL;
1235         p->kind = If_kind;
1236         p->v.If.test = test;
1237         p->v.If.body = body;
1238         p->v.If.orelse = orelse;
1239         p->lineno = lineno;
1240         p->col_offset = col_offset;
1241         return p;
1242 }
1243
1244 stmt_ty
1245 With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int lineno,
1246      int col_offset, PyArena *arena)
1247 {
1248         stmt_ty p;
1249         if (!context_expr) {
1250                 PyErr_SetString(PyExc_ValueError,
1251                                 "field context_expr is required for With");
1252                 return NULL;
1253         }
1254         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1255         if (!p)
1256                 return NULL;
1257         p->kind = With_kind;
1258         p->v.With.context_expr = context_expr;
1259         p->v.With.optional_vars = optional_vars;
1260         p->v.With.body = body;
1261         p->lineno = lineno;
1262         p->col_offset = col_offset;
1263         return p;
1264 }
1265
1266 stmt_ty
1267 Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, int col_offset,
1268       PyArena *arena)
1269 {
1270         stmt_ty p;
1271         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1272         if (!p)
1273                 return NULL;
1274         p->kind = Raise_kind;
1275         p->v.Raise.type = type;
1276         p->v.Raise.inst = inst;
1277         p->v.Raise.tback = tback;
1278         p->lineno = lineno;
1279         p->col_offset = col_offset;
1280         return p;
1281 }
1282
1283 stmt_ty
1284 TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno,
1285           int col_offset, PyArena *arena)
1286 {
1287         stmt_ty p;
1288         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1289         if (!p)
1290                 return NULL;
1291         p->kind = TryExcept_kind;
1292         p->v.TryExcept.body = body;
1293         p->v.TryExcept.handlers = handlers;
1294         p->v.TryExcept.orelse = orelse;
1295         p->lineno = lineno;
1296         p->col_offset = col_offset;
1297         return p;
1298 }
1299
1300 stmt_ty
1301 TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int col_offset,
1302            PyArena *arena)
1303 {
1304         stmt_ty p;
1305         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1306         if (!p)
1307                 return NULL;
1308         p->kind = TryFinally_kind;
1309         p->v.TryFinally.body = body;
1310         p->v.TryFinally.finalbody = finalbody;
1311         p->lineno = lineno;
1312         p->col_offset = col_offset;
1313         return p;
1314 }
1315
1316 stmt_ty
1317 Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
1318 {
1319         stmt_ty p;
1320         if (!test) {
1321                 PyErr_SetString(PyExc_ValueError,
1322                                 "field test is required for Assert");
1323                 return NULL;
1324         }
1325         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1326         if (!p)
1327                 return NULL;
1328         p->kind = Assert_kind;
1329         p->v.Assert.test = test;
1330         p->v.Assert.msg = msg;
1331         p->lineno = lineno;
1332         p->col_offset = col_offset;
1333         return p;
1334 }
1335
1336 stmt_ty
1337 Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1338 {
1339         stmt_ty p;
1340         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1341         if (!p)
1342                 return NULL;
1343         p->kind = Import_kind;
1344         p->v.Import.names = names;
1345         p->lineno = lineno;
1346         p->col_offset = col_offset;
1347         return p;
1348 }
1349
1350 stmt_ty
1351 ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
1352            col_offset, PyArena *arena)
1353 {
1354         stmt_ty p;
1355         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1356         if (!p)
1357                 return NULL;
1358         p->kind = ImportFrom_kind;
1359         p->v.ImportFrom.module = module;
1360         p->v.ImportFrom.names = names;
1361         p->v.ImportFrom.level = level;
1362         p->lineno = lineno;
1363         p->col_offset = col_offset;
1364         return p;
1365 }
1366
1367 stmt_ty
1368 Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, int col_offset,
1369      PyArena *arena)
1370 {
1371         stmt_ty p;
1372         if (!body) {
1373                 PyErr_SetString(PyExc_ValueError,
1374                                 "field body is required for Exec");
1375                 return NULL;
1376         }
1377         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1378         if (!p)
1379                 return NULL;
1380         p->kind = Exec_kind;
1381         p->v.Exec.body = body;
1382         p->v.Exec.globals = globals;
1383         p->v.Exec.locals = locals;
1384         p->lineno = lineno;
1385         p->col_offset = col_offset;
1386         return p;
1387 }
1388
1389 stmt_ty
1390 Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
1391 {
1392         stmt_ty p;
1393         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1394         if (!p)
1395                 return NULL;
1396         p->kind = Global_kind;
1397         p->v.Global.names = names;
1398         p->lineno = lineno;
1399         p->col_offset = col_offset;
1400         return p;
1401 }
1402
1403 stmt_ty
1404 Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
1405 {
1406         stmt_ty p;
1407         if (!value) {
1408                 PyErr_SetString(PyExc_ValueError,
1409                                 "field value is required for Expr");
1410                 return NULL;
1411         }
1412         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1413         if (!p)
1414                 return NULL;
1415         p->kind = Expr_kind;
1416         p->v.Expr.value = value;
1417         p->lineno = lineno;
1418         p->col_offset = col_offset;
1419         return p;
1420 }
1421
1422 stmt_ty
1423 Pass(int lineno, int col_offset, PyArena *arena)
1424 {
1425         stmt_ty p;
1426         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1427         if (!p)
1428                 return NULL;
1429         p->kind = Pass_kind;
1430         p->lineno = lineno;
1431         p->col_offset = col_offset;
1432         return p;
1433 }
1434
1435 stmt_ty
1436 Break(int lineno, int col_offset, PyArena *arena)
1437 {
1438         stmt_ty p;
1439         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1440         if (!p)
1441                 return NULL;
1442         p->kind = Break_kind;
1443         p->lineno = lineno;
1444         p->col_offset = col_offset;
1445         return p;
1446 }
1447
1448 stmt_ty
1449 Continue(int lineno, int col_offset, PyArena *arena)
1450 {
1451         stmt_ty p;
1452         p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
1453         if (!p)
1454                 return NULL;
1455         p->kind = Continue_kind;
1456         p->lineno = lineno;
1457         p->col_offset = col_offset;
1458         return p;
1459 }
1460
1461 expr_ty
1462 BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
1463        *arena)
1464 {
1465         expr_ty p;
1466         if (!op) {
1467                 PyErr_SetString(PyExc_ValueError,
1468                                 "field op is required for BoolOp");
1469                 return NULL;
1470         }
1471         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1472         if (!p)
1473                 return NULL;
1474         p->kind = BoolOp_kind;
1475         p->v.BoolOp.op = op;
1476         p->v.BoolOp.values = values;
1477         p->lineno = lineno;
1478         p->col_offset = col_offset;
1479         return p;
1480 }
1481
1482 expr_ty
1483 BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
1484       PyArena *arena)
1485 {
1486         expr_ty p;
1487         if (!left) {
1488                 PyErr_SetString(PyExc_ValueError,
1489                                 "field left is required for BinOp");
1490                 return NULL;
1491         }
1492         if (!op) {
1493                 PyErr_SetString(PyExc_ValueError,
1494                                 "field op is required for BinOp");
1495                 return NULL;
1496         }
1497         if (!right) {
1498                 PyErr_SetString(PyExc_ValueError,
1499                                 "field right is required for BinOp");
1500                 return NULL;
1501         }
1502         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1503         if (!p)
1504                 return NULL;
1505         p->kind = BinOp_kind;
1506         p->v.BinOp.left = left;
1507         p->v.BinOp.op = op;
1508         p->v.BinOp.right = right;
1509         p->lineno = lineno;
1510         p->col_offset = col_offset;
1511         return p;
1512 }
1513
1514 expr_ty
1515 UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
1516         *arena)
1517 {
1518         expr_ty p;
1519         if (!op) {
1520                 PyErr_SetString(PyExc_ValueError,
1521                                 "field op is required for UnaryOp");
1522                 return NULL;
1523         }
1524         if (!operand) {
1525                 PyErr_SetString(PyExc_ValueError,
1526                                 "field operand is required for UnaryOp");
1527                 return NULL;
1528         }
1529         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1530         if (!p)
1531                 return NULL;
1532         p->kind = UnaryOp_kind;
1533         p->v.UnaryOp.op = op;
1534         p->v.UnaryOp.operand = operand;
1535         p->lineno = lineno;
1536         p->col_offset = col_offset;
1537         return p;
1538 }
1539
1540 expr_ty
1541 Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
1542        *arena)
1543 {
1544         expr_ty p;
1545         if (!args) {
1546                 PyErr_SetString(PyExc_ValueError,
1547                                 "field args is required for Lambda");
1548                 return NULL;
1549         }
1550         if (!body) {
1551                 PyErr_SetString(PyExc_ValueError,
1552                                 "field body is required for Lambda");
1553                 return NULL;
1554         }
1555         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1556         if (!p)
1557                 return NULL;
1558         p->kind = Lambda_kind;
1559         p->v.Lambda.args = args;
1560         p->v.Lambda.body = body;
1561         p->lineno = lineno;
1562         p->col_offset = col_offset;
1563         return p;
1564 }
1565
1566 expr_ty
1567 IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
1568       PyArena *arena)
1569 {
1570         expr_ty p;
1571         if (!test) {
1572                 PyErr_SetString(PyExc_ValueError,
1573                                 "field test is required for IfExp");
1574                 return NULL;
1575         }
1576         if (!body) {
1577                 PyErr_SetString(PyExc_ValueError,
1578                                 "field body is required for IfExp");
1579                 return NULL;
1580         }
1581         if (!orelse) {
1582                 PyErr_SetString(PyExc_ValueError,
1583                                 "field orelse is required for IfExp");
1584                 return NULL;
1585         }
1586         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1587         if (!p)
1588                 return NULL;
1589         p->kind = IfExp_kind;
1590         p->v.IfExp.test = test;
1591         p->v.IfExp.body = body;
1592         p->v.IfExp.orelse = orelse;
1593         p->lineno = lineno;
1594         p->col_offset = col_offset;
1595         return p;
1596 }
1597
1598 expr_ty
1599 Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
1600      *arena)
1601 {
1602         expr_ty p;
1603         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1604         if (!p)
1605                 return NULL;
1606         p->kind = Dict_kind;
1607         p->v.Dict.keys = keys;
1608         p->v.Dict.values = values;
1609         p->lineno = lineno;
1610         p->col_offset = col_offset;
1611         return p;
1612 }
1613
1614 expr_ty
1615 Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
1616 {
1617         expr_ty p;
1618         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1619         if (!p)
1620                 return NULL;
1621         p->kind = Set_kind;
1622         p->v.Set.elts = elts;
1623         p->lineno = lineno;
1624         p->col_offset = col_offset;
1625         return p;
1626 }
1627
1628 expr_ty
1629 ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1630          PyArena *arena)
1631 {
1632         expr_ty p;
1633         if (!elt) {
1634                 PyErr_SetString(PyExc_ValueError,
1635                                 "field elt is required for ListComp");
1636                 return NULL;
1637         }
1638         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1639         if (!p)
1640                 return NULL;
1641         p->kind = ListComp_kind;
1642         p->v.ListComp.elt = elt;
1643         p->v.ListComp.generators = generators;
1644         p->lineno = lineno;
1645         p->col_offset = col_offset;
1646         return p;
1647 }
1648
1649 expr_ty
1650 SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
1651         *arena)
1652 {
1653         expr_ty p;
1654         if (!elt) {
1655                 PyErr_SetString(PyExc_ValueError,
1656                                 "field elt is required for SetComp");
1657                 return NULL;
1658         }
1659         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1660         if (!p)
1661                 return NULL;
1662         p->kind = SetComp_kind;
1663         p->v.SetComp.elt = elt;
1664         p->v.SetComp.generators = generators;
1665         p->lineno = lineno;
1666         p->col_offset = col_offset;
1667         return p;
1668 }
1669
1670 expr_ty
1671 DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
1672          col_offset, PyArena *arena)
1673 {
1674         expr_ty p;
1675         if (!key) {
1676                 PyErr_SetString(PyExc_ValueError,
1677                                 "field key is required for DictComp");
1678                 return NULL;
1679         }
1680         if (!value) {
1681                 PyErr_SetString(PyExc_ValueError,
1682                                 "field value is required for DictComp");
1683                 return NULL;
1684         }
1685         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1686         if (!p)
1687                 return NULL;
1688         p->kind = DictComp_kind;
1689         p->v.DictComp.key = key;
1690         p->v.DictComp.value = value;
1691         p->v.DictComp.generators = generators;
1692         p->lineno = lineno;
1693         p->col_offset = col_offset;
1694         return p;
1695 }
1696
1697 expr_ty
1698 GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
1699              PyArena *arena)
1700 {
1701         expr_ty p;
1702         if (!elt) {
1703                 PyErr_SetString(PyExc_ValueError,
1704                                 "field elt is required for GeneratorExp");
1705                 return NULL;
1706         }
1707         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1708         if (!p)
1709                 return NULL;
1710         p->kind = GeneratorExp_kind;
1711         p->v.GeneratorExp.elt = elt;
1712         p->v.GeneratorExp.generators = generators;
1713         p->lineno = lineno;
1714         p->col_offset = col_offset;
1715         return p;
1716 }
1717
1718 expr_ty
1719 Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
1720 {
1721         expr_ty p;
1722         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1723         if (!p)
1724                 return NULL;
1725         p->kind = Yield_kind;
1726         p->v.Yield.value = value;
1727         p->lineno = lineno;
1728         p->col_offset = col_offset;
1729         return p;
1730 }
1731
1732 expr_ty
1733 Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
1734         int col_offset, PyArena *arena)
1735 {
1736         expr_ty p;
1737         if (!left) {
1738                 PyErr_SetString(PyExc_ValueError,
1739                                 "field left is required for Compare");
1740                 return NULL;
1741         }
1742         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1743         if (!p)
1744                 return NULL;
1745         p->kind = Compare_kind;
1746         p->v.Compare.left = left;
1747         p->v.Compare.ops = ops;
1748         p->v.Compare.comparators = comparators;
1749         p->lineno = lineno;
1750         p->col_offset = col_offset;
1751         return p;
1752 }
1753
1754 expr_ty
1755 Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs,
1756      expr_ty kwargs, int lineno, int col_offset, PyArena *arena)
1757 {
1758         expr_ty p;
1759         if (!func) {
1760                 PyErr_SetString(PyExc_ValueError,
1761                                 "field func is required for Call");
1762                 return NULL;
1763         }
1764         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1765         if (!p)
1766                 return NULL;
1767         p->kind = Call_kind;
1768         p->v.Call.func = func;
1769         p->v.Call.args = args;
1770         p->v.Call.keywords = keywords;
1771         p->v.Call.starargs = starargs;
1772         p->v.Call.kwargs = kwargs;
1773         p->lineno = lineno;
1774         p->col_offset = col_offset;
1775         return p;
1776 }
1777
1778 expr_ty
1779 Repr(expr_ty value, int lineno, int col_offset, PyArena *arena)
1780 {
1781         expr_ty p;
1782         if (!value) {
1783                 PyErr_SetString(PyExc_ValueError,
1784                                 "field value is required for Repr");
1785                 return NULL;
1786         }
1787         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1788         if (!p)
1789                 return NULL;
1790         p->kind = Repr_kind;
1791         p->v.Repr.value = value;
1792         p->lineno = lineno;
1793         p->col_offset = col_offset;
1794         return p;
1795 }
1796
1797 expr_ty
1798 Num(object n, int lineno, int col_offset, PyArena *arena)
1799 {
1800         expr_ty p;
1801         if (!n) {
1802                 PyErr_SetString(PyExc_ValueError,
1803                                 "field n is required for Num");
1804                 return NULL;
1805         }
1806         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1807         if (!p)
1808                 return NULL;
1809         p->kind = Num_kind;
1810         p->v.Num.n = n;
1811         p->lineno = lineno;
1812         p->col_offset = col_offset;
1813         return p;
1814 }
1815
1816 expr_ty
1817 Str(string s, int lineno, int col_offset, PyArena *arena)
1818 {
1819         expr_ty p;
1820         if (!s) {
1821                 PyErr_SetString(PyExc_ValueError,
1822                                 "field s is required for Str");
1823                 return NULL;
1824         }
1825         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1826         if (!p)
1827                 return NULL;
1828         p->kind = Str_kind;
1829         p->v.Str.s = s;
1830         p->lineno = lineno;
1831         p->col_offset = col_offset;
1832         return p;
1833 }
1834
1835 expr_ty
1836 Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
1837           col_offset, PyArena *arena)
1838 {
1839         expr_ty p;
1840         if (!value) {
1841                 PyErr_SetString(PyExc_ValueError,
1842                                 "field value is required for Attribute");
1843                 return NULL;
1844         }
1845         if (!attr) {
1846                 PyErr_SetString(PyExc_ValueError,
1847                                 "field attr is required for Attribute");
1848                 return NULL;
1849         }
1850         if (!ctx) {
1851                 PyErr_SetString(PyExc_ValueError,
1852                                 "field ctx is required for Attribute");
1853                 return NULL;
1854         }
1855         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1856         if (!p)
1857                 return NULL;
1858         p->kind = Attribute_kind;
1859         p->v.Attribute.value = value;
1860         p->v.Attribute.attr = attr;
1861         p->v.Attribute.ctx = ctx;
1862         p->lineno = lineno;
1863         p->col_offset = col_offset;
1864         return p;
1865 }
1866
1867 expr_ty
1868 Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
1869           col_offset, PyArena *arena)
1870 {
1871         expr_ty p;
1872         if (!value) {
1873                 PyErr_SetString(PyExc_ValueError,
1874                                 "field value is required for Subscript");
1875                 return NULL;
1876         }
1877         if (!slice) {
1878                 PyErr_SetString(PyExc_ValueError,
1879                                 "field slice is required for Subscript");
1880                 return NULL;
1881         }
1882         if (!ctx) {
1883                 PyErr_SetString(PyExc_ValueError,
1884                                 "field ctx is required for Subscript");
1885                 return NULL;
1886         }
1887         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1888         if (!p)
1889                 return NULL;
1890         p->kind = Subscript_kind;
1891         p->v.Subscript.value = value;
1892         p->v.Subscript.slice = slice;
1893         p->v.Subscript.ctx = ctx;
1894         p->lineno = lineno;
1895         p->col_offset = col_offset;
1896         return p;
1897 }
1898
1899 expr_ty
1900 Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
1901      *arena)
1902 {
1903         expr_ty p;
1904         if (!id) {
1905                 PyErr_SetString(PyExc_ValueError,
1906                                 "field id is required for Name");
1907                 return NULL;
1908         }
1909         if (!ctx) {
1910                 PyErr_SetString(PyExc_ValueError,
1911                                 "field ctx is required for Name");
1912                 return NULL;
1913         }
1914         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1915         if (!p)
1916                 return NULL;
1917         p->kind = Name_kind;
1918         p->v.Name.id = id;
1919         p->v.Name.ctx = ctx;
1920         p->lineno = lineno;
1921         p->col_offset = col_offset;
1922         return p;
1923 }
1924
1925 expr_ty
1926 List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
1927      *arena)
1928 {
1929         expr_ty p;
1930         if (!ctx) {
1931                 PyErr_SetString(PyExc_ValueError,
1932                                 "field ctx is required for List");
1933                 return NULL;
1934         }
1935         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1936         if (!p)
1937                 return NULL;
1938         p->kind = List_kind;
1939         p->v.List.elts = elts;
1940         p->v.List.ctx = ctx;
1941         p->lineno = lineno;
1942         p->col_offset = col_offset;
1943         return p;
1944 }
1945
1946 expr_ty
1947 Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
1948       *arena)
1949 {
1950         expr_ty p;
1951         if (!ctx) {
1952                 PyErr_SetString(PyExc_ValueError,
1953                                 "field ctx is required for Tuple");
1954                 return NULL;
1955         }
1956         p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
1957         if (!p)
1958                 return NULL;
1959         p->kind = Tuple_kind;
1960         p->v.Tuple.elts = elts;
1961         p->v.Tuple.ctx = ctx;
1962         p->lineno = lineno;
1963         p->col_offset = col_offset;
1964         return p;
1965 }
1966
1967 slice_ty
1968 Ellipsis(PyArena *arena)
1969 {
1970         slice_ty p;
1971         p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
1972         if (!p)
1973                 return NULL;
1974         p->kind = Ellipsis_kind;
1975         return p;
1976 }
1977
1978 slice_ty
1979 Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
1980 {
1981         slice_ty p;
1982         p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
1983         if (!p)
1984                 return NULL;
1985         p->kind = Slice_kind;
1986         p->v.Slice.lower = lower;
1987         p->v.Slice.upper = upper;
1988         p->v.Slice.step = step;
1989         return p;
1990 }
1991
1992 slice_ty
1993 ExtSlice(asdl_seq * dims, PyArena *arena)
1994 {
1995         slice_ty p;
1996         p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
1997         if (!p)
1998                 return NULL;
1999         p->kind = ExtSlice_kind;
2000         p->v.ExtSlice.dims = dims;
2001         return p;
2002 }
2003
2004 slice_ty
2005 Index(expr_ty value, PyArena *arena)
2006 {
2007         slice_ty p;
2008         if (!value) {
2009                 PyErr_SetString(PyExc_ValueError,
2010                                 "field value is required for Index");
2011                 return NULL;
2012         }
2013         p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
2014         if (!p)
2015                 return NULL;
2016         p->kind = Index_kind;
2017         p->v.Index.value = value;
2018         return p;
2019 }
2020
2021 comprehension_ty
2022 comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena)
2023 {
2024         comprehension_ty p;
2025         if (!target) {
2026                 PyErr_SetString(PyExc_ValueError,
2027                                 "field target is required for comprehension");
2028                 return NULL;
2029         }
2030         if (!iter) {
2031                 PyErr_SetString(PyExc_ValueError,
2032                                 "field iter is required for comprehension");
2033                 return NULL;
2034         }
2035         p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
2036         if (!p)
2037                 return NULL;
2038         p->target = target;
2039         p->iter = iter;
2040         p->ifs = ifs;
2041         return p;
2042 }
2043
2044 excepthandler_ty
2045 ExceptHandler(expr_ty type, expr_ty name, asdl_seq * body, int lineno, int
2046               col_offset, PyArena *arena)
2047 {
2048         excepthandler_ty p;
2049         p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
2050         if (!p)
2051                 return NULL;
2052         p->kind = ExceptHandler_kind;
2053         p->v.ExceptHandler.type = type;
2054         p->v.ExceptHandler.name = name;
2055         p->v.ExceptHandler.body = body;
2056         p->lineno = lineno;
2057         p->col_offset = col_offset;
2058         return p;
2059 }
2060
2061 arguments_ty
2062 arguments(asdl_seq * args, identifier vararg, identifier kwarg, asdl_seq *
2063           defaults, PyArena *arena)
2064 {
2065         arguments_ty p;
2066         p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
2067         if (!p)
2068                 return NULL;
2069         p->args = args;
2070         p->vararg = vararg;
2071         p->kwarg = kwarg;
2072         p->defaults = defaults;
2073         return p;
2074 }
2075
2076 keyword_ty
2077 keyword(identifier arg, expr_ty value, PyArena *arena)
2078 {
2079         keyword_ty p;
2080         if (!arg) {
2081                 PyErr_SetString(PyExc_ValueError,
2082                                 "field arg is required for keyword");
2083                 return NULL;
2084         }
2085         if (!value) {
2086                 PyErr_SetString(PyExc_ValueError,
2087                                 "field value is required for keyword");
2088                 return NULL;
2089         }
2090         p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
2091         if (!p)
2092                 return NULL;
2093         p->arg = arg;
2094         p->value = value;
2095         return p;
2096 }
2097
2098 alias_ty
2099 alias(identifier name, identifier asname, PyArena *arena)
2100 {
2101         alias_ty p;
2102         if (!name) {
2103                 PyErr_SetString(PyExc_ValueError,
2104                                 "field name is required for alias");
2105                 return NULL;
2106         }
2107         p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
2108         if (!p)
2109                 return NULL;
2110         p->name = name;
2111         p->asname = asname;
2112         return p;
2113 }
2114
2115
2116 PyObject*
2117 ast2obj_mod(void* _o)
2118 {
2119         mod_ty o = (mod_ty)_o;
2120         PyObject *result = NULL, *value = NULL;
2121         if (!o) {
2122                 Py_INCREF(Py_None);
2123                 return Py_None;
2124         }
2125
2126         switch (o->kind) {
2127         case Module_kind:
2128                 result = PyType_GenericNew(Module_type, NULL, NULL);
2129                 if (!result) goto failed;
2130                 value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
2131                 if (!value) goto failed;
2132                 if (PyObject_SetAttrString(result, "body", value) == -1)
2133                         goto failed;
2134                 Py_DECREF(value);
2135                 break;
2136         case Interactive_kind:
2137                 result = PyType_GenericNew(Interactive_type, NULL, NULL);
2138                 if (!result) goto failed;
2139                 value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
2140                 if (!value) goto failed;
2141                 if (PyObject_SetAttrString(result, "body", value) == -1)
2142                         goto failed;
2143                 Py_DECREF(value);
2144                 break;
2145         case Expression_kind:
2146                 result = PyType_GenericNew(Expression_type, NULL, NULL);
2147                 if (!result) goto failed;
2148                 value = ast2obj_expr(o->v.Expression.body);
2149                 if (!value) goto failed;
2150                 if (PyObject_SetAttrString(result, "body", value) == -1)
2151                         goto failed;
2152                 Py_DECREF(value);
2153                 break;
2154         case Suite_kind:
2155                 result = PyType_GenericNew(Suite_type, NULL, NULL);
2156                 if (!result) goto failed;
2157                 value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
2158                 if (!value) goto failed;
2159                 if (PyObject_SetAttrString(result, "body", value) == -1)
2160                         goto failed;
2161                 Py_DECREF(value);
2162                 break;
2163         }
2164         return result;
2165 failed:
2166         Py_XDECREF(value);
2167         Py_XDECREF(result);
2168         return NULL;
2169 }
2170
2171 PyObject*
2172 ast2obj_stmt(void* _o)
2173 {
2174         stmt_ty o = (stmt_ty)_o;
2175         PyObject *result = NULL, *value = NULL;
2176         if (!o) {
2177                 Py_INCREF(Py_None);
2178                 return Py_None;
2179         }
2180
2181         switch (o->kind) {
2182         case FunctionDef_kind:
2183                 result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
2184                 if (!result) goto failed;
2185                 value = ast2obj_identifier(o->v.FunctionDef.name);
2186                 if (!value) goto failed;
2187                 if (PyObject_SetAttrString(result, "name", value) == -1)
2188                         goto failed;
2189                 Py_DECREF(value);
2190                 value = ast2obj_arguments(o->v.FunctionDef.args);
2191                 if (!value) goto failed;
2192                 if (PyObject_SetAttrString(result, "args", value) == -1)
2193                         goto failed;
2194                 Py_DECREF(value);
2195                 value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
2196                 if (!value) goto failed;
2197                 if (PyObject_SetAttrString(result, "body", value) == -1)
2198                         goto failed;
2199                 Py_DECREF(value);
2200                 value = ast2obj_list(o->v.FunctionDef.decorator_list,
2201                                      ast2obj_expr);
2202                 if (!value) goto failed;
2203                 if (PyObject_SetAttrString(result, "decorator_list", value) ==
2204                     -1)
2205                         goto failed;
2206                 Py_DECREF(value);
2207                 break;
2208         case ClassDef_kind:
2209                 result = PyType_GenericNew(ClassDef_type, NULL, NULL);
2210                 if (!result) goto failed;
2211                 value = ast2obj_identifier(o->v.ClassDef.name);
2212                 if (!value) goto failed;
2213                 if (PyObject_SetAttrString(result, "name", value) == -1)
2214                         goto failed;
2215                 Py_DECREF(value);
2216                 value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
2217                 if (!value) goto failed;
2218                 if (PyObject_SetAttrString(result, "bases", value) == -1)
2219                         goto failed;
2220                 Py_DECREF(value);
2221                 value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
2222                 if (!value) goto failed;
2223                 if (PyObject_SetAttrString(result, "body", value) == -1)
2224                         goto failed;
2225                 Py_DECREF(value);
2226                 value = ast2obj_list(o->v.ClassDef.decorator_list,
2227                                      ast2obj_expr);
2228                 if (!value) goto failed;
2229                 if (PyObject_SetAttrString(result, "decorator_list", value) ==
2230                     -1)
2231                         goto failed;
2232                 Py_DECREF(value);
2233                 break;
2234         case Return_kind:
2235                 result = PyType_GenericNew(Return_type, NULL, NULL);
2236                 if (!result) goto failed;
2237                 value = ast2obj_expr(o->v.Return.value);
2238                 if (!value) goto failed;
2239                 if (PyObject_SetAttrString(result, "value", value) == -1)
2240                         goto failed;
2241                 Py_DECREF(value);
2242                 break;
2243         case Delete_kind:
2244                 result = PyType_GenericNew(Delete_type, NULL, NULL);
2245                 if (!result) goto failed;
2246                 value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
2247                 if (!value) goto failed;
2248                 if (PyObject_SetAttrString(result, "targets", value) == -1)
2249                         goto failed;
2250                 Py_DECREF(value);
2251                 break;
2252         case Assign_kind:
2253                 result = PyType_GenericNew(Assign_type, NULL, NULL);
2254                 if (!result) goto failed;
2255                 value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
2256                 if (!value) goto failed;
2257                 if (PyObject_SetAttrString(result, "targets", value) == -1)
2258                         goto failed;
2259                 Py_DECREF(value);
2260                 value = ast2obj_expr(o->v.Assign.value);
2261                 if (!value) goto failed;
2262                 if (PyObject_SetAttrString(result, "value", value) == -1)
2263                         goto failed;
2264                 Py_DECREF(value);
2265                 break;
2266         case AugAssign_kind:
2267                 result = PyType_GenericNew(AugAssign_type, NULL, NULL);
2268                 if (!result) goto failed;
2269                 value = ast2obj_expr(o->v.AugAssign.target);
2270                 if (!value) goto failed;
2271                 if (PyObject_SetAttrString(result, "target", value) == -1)
2272                         goto failed;
2273                 Py_DECREF(value);
2274                 value = ast2obj_operator(o->v.AugAssign.op);
2275                 if (!value) goto failed;
2276                 if (PyObject_SetAttrString(result, "op", value) == -1)
2277                         goto failed;
2278                 Py_DECREF(value);
2279                 value = ast2obj_expr(o->v.AugAssign.value);
2280                 if (!value) goto failed;
2281                 if (PyObject_SetAttrString(result, "value", value) == -1)
2282                         goto failed;
2283                 Py_DECREF(value);
2284                 break;
2285         case Print_kind:
2286                 result = PyType_GenericNew(Print_type, NULL, NULL);
2287                 if (!result) goto failed;
2288                 value = ast2obj_expr(o->v.Print.dest);
2289                 if (!value) goto failed;
2290                 if (PyObject_SetAttrString(result, "dest", value) == -1)
2291                         goto failed;
2292                 Py_DECREF(value);
2293                 value = ast2obj_list(o->v.Print.values, ast2obj_expr);
2294                 if (!value) goto failed;
2295                 if (PyObject_SetAttrString(result, "values", value) == -1)
2296                         goto failed;
2297                 Py_DECREF(value);
2298                 value = ast2obj_bool(o->v.Print.nl);
2299                 if (!value) goto failed;
2300                 if (PyObject_SetAttrString(result, "nl", value) == -1)
2301                         goto failed;
2302                 Py_DECREF(value);
2303                 break;
2304         case For_kind:
2305                 result = PyType_GenericNew(For_type, NULL, NULL);
2306                 if (!result) goto failed;
2307                 value = ast2obj_expr(o->v.For.target);
2308                 if (!value) goto failed;
2309                 if (PyObject_SetAttrString(result, "target", value) == -1)
2310                         goto failed;
2311                 Py_DECREF(value);
2312                 value = ast2obj_expr(o->v.For.iter);
2313                 if (!value) goto failed;
2314                 if (PyObject_SetAttrString(result, "iter", value) == -1)
2315                         goto failed;
2316                 Py_DECREF(value);
2317                 value = ast2obj_list(o->v.For.body, ast2obj_stmt);
2318                 if (!value) goto failed;
2319                 if (PyObject_SetAttrString(result, "body", value) == -1)
2320                         goto failed;
2321                 Py_DECREF(value);
2322                 value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
2323                 if (!value) goto failed;
2324                 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2325                         goto failed;
2326                 Py_DECREF(value);
2327                 break;
2328         case While_kind:
2329                 result = PyType_GenericNew(While_type, NULL, NULL);
2330                 if (!result) goto failed;
2331                 value = ast2obj_expr(o->v.While.test);
2332                 if (!value) goto failed;
2333                 if (PyObject_SetAttrString(result, "test", value) == -1)
2334                         goto failed;
2335                 Py_DECREF(value);
2336                 value = ast2obj_list(o->v.While.body, ast2obj_stmt);
2337                 if (!value) goto failed;
2338                 if (PyObject_SetAttrString(result, "body", value) == -1)
2339                         goto failed;
2340                 Py_DECREF(value);
2341                 value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
2342                 if (!value) goto failed;
2343                 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2344                         goto failed;
2345                 Py_DECREF(value);
2346                 break;
2347         case If_kind:
2348                 result = PyType_GenericNew(If_type, NULL, NULL);
2349                 if (!result) goto failed;
2350                 value = ast2obj_expr(o->v.If.test);
2351                 if (!value) goto failed;
2352                 if (PyObject_SetAttrString(result, "test", value) == -1)
2353                         goto failed;
2354                 Py_DECREF(value);
2355                 value = ast2obj_list(o->v.If.body, ast2obj_stmt);
2356                 if (!value) goto failed;
2357                 if (PyObject_SetAttrString(result, "body", value) == -1)
2358                         goto failed;
2359                 Py_DECREF(value);
2360                 value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
2361                 if (!value) goto failed;
2362                 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2363                         goto failed;
2364                 Py_DECREF(value);
2365                 break;
2366         case With_kind:
2367                 result = PyType_GenericNew(With_type, NULL, NULL);
2368                 if (!result) goto failed;
2369                 value = ast2obj_expr(o->v.With.context_expr);
2370                 if (!value) goto failed;
2371                 if (PyObject_SetAttrString(result, "context_expr", value) == -1)
2372                         goto failed;
2373                 Py_DECREF(value);
2374                 value = ast2obj_expr(o->v.With.optional_vars);
2375                 if (!value) goto failed;
2376                 if (PyObject_SetAttrString(result, "optional_vars", value) ==
2377                     -1)
2378                         goto failed;
2379                 Py_DECREF(value);
2380                 value = ast2obj_list(o->v.With.body, ast2obj_stmt);
2381                 if (!value) goto failed;
2382                 if (PyObject_SetAttrString(result, "body", value) == -1)
2383                         goto failed;
2384                 Py_DECREF(value);
2385                 break;
2386         case Raise_kind:
2387                 result = PyType_GenericNew(Raise_type, NULL, NULL);
2388                 if (!result) goto failed;
2389                 value = ast2obj_expr(o->v.Raise.type);
2390                 if (!value) goto failed;
2391                 if (PyObject_SetAttrString(result, "type", value) == -1)
2392                         goto failed;
2393                 Py_DECREF(value);
2394                 value = ast2obj_expr(o->v.Raise.inst);
2395                 if (!value) goto failed;
2396                 if (PyObject_SetAttrString(result, "inst", value) == -1)
2397                         goto failed;
2398                 Py_DECREF(value);
2399                 value = ast2obj_expr(o->v.Raise.tback);
2400                 if (!value) goto failed;
2401                 if (PyObject_SetAttrString(result, "tback", value) == -1)
2402                         goto failed;
2403                 Py_DECREF(value);
2404                 break;
2405         case TryExcept_kind:
2406                 result = PyType_GenericNew(TryExcept_type, NULL, NULL);
2407                 if (!result) goto failed;
2408                 value = ast2obj_list(o->v.TryExcept.body, ast2obj_stmt);
2409                 if (!value) goto failed;
2410                 if (PyObject_SetAttrString(result, "body", value) == -1)
2411                         goto failed;
2412                 Py_DECREF(value);
2413                 value = ast2obj_list(o->v.TryExcept.handlers,
2414                                      ast2obj_excepthandler);
2415                 if (!value) goto failed;
2416                 if (PyObject_SetAttrString(result, "handlers", value) == -1)
2417                         goto failed;
2418                 Py_DECREF(value);
2419                 value = ast2obj_list(o->v.TryExcept.orelse, ast2obj_stmt);
2420                 if (!value) goto failed;
2421                 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2422                         goto failed;
2423                 Py_DECREF(value);
2424                 break;
2425         case TryFinally_kind:
2426                 result = PyType_GenericNew(TryFinally_type, NULL, NULL);
2427                 if (!result) goto failed;
2428                 value = ast2obj_list(o->v.TryFinally.body, ast2obj_stmt);
2429                 if (!value) goto failed;
2430                 if (PyObject_SetAttrString(result, "body", value) == -1)
2431                         goto failed;
2432                 Py_DECREF(value);
2433                 value = ast2obj_list(o->v.TryFinally.finalbody, ast2obj_stmt);
2434                 if (!value) goto failed;
2435                 if (PyObject_SetAttrString(result, "finalbody", value) == -1)
2436                         goto failed;
2437                 Py_DECREF(value);
2438                 break;
2439         case Assert_kind:
2440                 result = PyType_GenericNew(Assert_type, NULL, NULL);
2441                 if (!result) goto failed;
2442                 value = ast2obj_expr(o->v.Assert.test);
2443                 if (!value) goto failed;
2444                 if (PyObject_SetAttrString(result, "test", value) == -1)
2445                         goto failed;
2446                 Py_DECREF(value);
2447                 value = ast2obj_expr(o->v.Assert.msg);
2448                 if (!value) goto failed;
2449                 if (PyObject_SetAttrString(result, "msg", value) == -1)
2450                         goto failed;
2451                 Py_DECREF(value);
2452                 break;
2453         case Import_kind:
2454                 result = PyType_GenericNew(Import_type, NULL, NULL);
2455                 if (!result) goto failed;
2456                 value = ast2obj_list(o->v.Import.names, ast2obj_alias);
2457                 if (!value) goto failed;
2458                 if (PyObject_SetAttrString(result, "names", value) == -1)
2459                         goto failed;
2460                 Py_DECREF(value);
2461                 break;
2462         case ImportFrom_kind:
2463                 result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
2464                 if (!result) goto failed;
2465                 value = ast2obj_identifier(o->v.ImportFrom.module);
2466                 if (!value) goto failed;
2467                 if (PyObject_SetAttrString(result, "module", value) == -1)
2468                         goto failed;
2469                 Py_DECREF(value);
2470                 value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
2471                 if (!value) goto failed;
2472                 if (PyObject_SetAttrString(result, "names", value) == -1)
2473                         goto failed;
2474                 Py_DECREF(value);
2475                 value = ast2obj_int(o->v.ImportFrom.level);
2476                 if (!value) goto failed;
2477                 if (PyObject_SetAttrString(result, "level", value) == -1)
2478                         goto failed;
2479                 Py_DECREF(value);
2480                 break;
2481         case Exec_kind:
2482                 result = PyType_GenericNew(Exec_type, NULL, NULL);
2483                 if (!result) goto failed;
2484                 value = ast2obj_expr(o->v.Exec.body);
2485                 if (!value) goto failed;
2486                 if (PyObject_SetAttrString(result, "body", value) == -1)
2487                         goto failed;
2488                 Py_DECREF(value);
2489                 value = ast2obj_expr(o->v.Exec.globals);
2490                 if (!value) goto failed;
2491                 if (PyObject_SetAttrString(result, "globals", value) == -1)
2492                         goto failed;
2493                 Py_DECREF(value);
2494                 value = ast2obj_expr(o->v.Exec.locals);
2495                 if (!value) goto failed;
2496                 if (PyObject_SetAttrString(result, "locals", value) == -1)
2497                         goto failed;
2498                 Py_DECREF(value);
2499                 break;
2500         case Global_kind:
2501                 result = PyType_GenericNew(Global_type, NULL, NULL);
2502                 if (!result) goto failed;
2503                 value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
2504                 if (!value) goto failed;
2505                 if (PyObject_SetAttrString(result, "names", value) == -1)
2506                         goto failed;
2507                 Py_DECREF(value);
2508                 break;
2509         case Expr_kind:
2510                 result = PyType_GenericNew(Expr_type, NULL, NULL);
2511                 if (!result) goto failed;
2512                 value = ast2obj_expr(o->v.Expr.value);
2513                 if (!value) goto failed;
2514                 if (PyObject_SetAttrString(result, "value", value) == -1)
2515                         goto failed;
2516                 Py_DECREF(value);
2517                 break;
2518         case Pass_kind:
2519                 result = PyType_GenericNew(Pass_type, NULL, NULL);
2520                 if (!result) goto failed;
2521                 break;
2522         case Break_kind:
2523                 result = PyType_GenericNew(Break_type, NULL, NULL);
2524                 if (!result) goto failed;
2525                 break;
2526         case Continue_kind:
2527                 result = PyType_GenericNew(Continue_type, NULL, NULL);
2528                 if (!result) goto failed;
2529                 break;
2530         }
2531         value = ast2obj_int(o->lineno);
2532         if (!value) goto failed;
2533         if (PyObject_SetAttrString(result, "lineno", value) < 0)
2534                 goto failed;
2535         Py_DECREF(value);
2536         value = ast2obj_int(o->col_offset);
2537         if (!value) goto failed;
2538         if (PyObject_SetAttrString(result, "col_offset", value) < 0)
2539                 goto failed;
2540         Py_DECREF(value);
2541         return result;
2542 failed:
2543         Py_XDECREF(value);
2544         Py_XDECREF(result);
2545         return NULL;
2546 }
2547
2548 PyObject*
2549 ast2obj_expr(void* _o)
2550 {
2551         expr_ty o = (expr_ty)_o;
2552         PyObject *result = NULL, *value = NULL;
2553         if (!o) {
2554                 Py_INCREF(Py_None);
2555                 return Py_None;
2556         }
2557
2558         switch (o->kind) {
2559         case BoolOp_kind:
2560                 result = PyType_GenericNew(BoolOp_type, NULL, NULL);
2561                 if (!result) goto failed;
2562                 value = ast2obj_boolop(o->v.BoolOp.op);
2563                 if (!value) goto failed;
2564                 if (PyObject_SetAttrString(result, "op", value) == -1)
2565                         goto failed;
2566                 Py_DECREF(value);
2567                 value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
2568                 if (!value) goto failed;
2569                 if (PyObject_SetAttrString(result, "values", value) == -1)
2570                         goto failed;
2571                 Py_DECREF(value);
2572                 break;
2573         case BinOp_kind:
2574                 result = PyType_GenericNew(BinOp_type, NULL, NULL);
2575                 if (!result) goto failed;
2576                 value = ast2obj_expr(o->v.BinOp.left);
2577                 if (!value) goto failed;
2578                 if (PyObject_SetAttrString(result, "left", value) == -1)
2579                         goto failed;
2580                 Py_DECREF(value);
2581                 value = ast2obj_operator(o->v.BinOp.op);
2582                 if (!value) goto failed;
2583                 if (PyObject_SetAttrString(result, "op", value) == -1)
2584                         goto failed;
2585                 Py_DECREF(value);
2586                 value = ast2obj_expr(o->v.BinOp.right);
2587                 if (!value) goto failed;
2588                 if (PyObject_SetAttrString(result, "right", value) == -1)
2589                         goto failed;
2590                 Py_DECREF(value);
2591                 break;
2592         case UnaryOp_kind:
2593                 result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
2594                 if (!result) goto failed;
2595                 value = ast2obj_unaryop(o->v.UnaryOp.op);
2596                 if (!value) goto failed;
2597                 if (PyObject_SetAttrString(result, "op", value) == -1)
2598                         goto failed;
2599                 Py_DECREF(value);
2600                 value = ast2obj_expr(o->v.UnaryOp.operand);
2601                 if (!value) goto failed;
2602                 if (PyObject_SetAttrString(result, "operand", value) == -1)
2603                         goto failed;
2604                 Py_DECREF(value);
2605                 break;
2606         case Lambda_kind:
2607                 result = PyType_GenericNew(Lambda_type, NULL, NULL);
2608                 if (!result) goto failed;
2609                 value = ast2obj_arguments(o->v.Lambda.args);
2610                 if (!value) goto failed;
2611                 if (PyObject_SetAttrString(result, "args", value) == -1)
2612                         goto failed;
2613                 Py_DECREF(value);
2614                 value = ast2obj_expr(o->v.Lambda.body);
2615                 if (!value) goto failed;
2616                 if (PyObject_SetAttrString(result, "body", value) == -1)
2617                         goto failed;
2618                 Py_DECREF(value);
2619                 break;
2620         case IfExp_kind:
2621                 result = PyType_GenericNew(IfExp_type, NULL, NULL);
2622                 if (!result) goto failed;
2623                 value = ast2obj_expr(o->v.IfExp.test);
2624                 if (!value) goto failed;
2625                 if (PyObject_SetAttrString(result, "test", value) == -1)
2626                         goto failed;
2627                 Py_DECREF(value);
2628                 value = ast2obj_expr(o->v.IfExp.body);
2629                 if (!value) goto failed;
2630                 if (PyObject_SetAttrString(result, "body", value) == -1)
2631                         goto failed;
2632                 Py_DECREF(value);
2633                 value = ast2obj_expr(o->v.IfExp.orelse);
2634                 if (!value) goto failed;
2635                 if (PyObject_SetAttrString(result, "orelse", value) == -1)
2636                         goto failed;
2637                 Py_DECREF(value);
2638                 break;
2639         case Dict_kind:
2640                 result = PyType_GenericNew(Dict_type, NULL, NULL);
2641                 if (!result) goto failed;
2642                 value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
2643                 if (!value) goto failed;
2644                 if (PyObject_SetAttrString(result, "keys", value) == -1)
2645                         goto failed;
2646                 Py_DECREF(value);
2647                 value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
2648                 if (!value) goto failed;
2649                 if (PyObject_SetAttrString(result, "values", value) == -1)
2650                         goto failed;
2651                 Py_DECREF(value);
2652                 break;
2653         case Set_kind:
2654                 result = PyType_GenericNew(Set_type, NULL, NULL);
2655                 if (!result) goto failed;
2656                 value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
2657                 if (!value) goto failed;
2658                 if (PyObject_SetAttrString(result, "elts", value) == -1)
2659                         goto failed;
2660                 Py_DECREF(value);
2661                 break;
2662         case ListComp_kind:
2663                 result = PyType_GenericNew(ListComp_type, NULL, NULL);
2664                 if (!result) goto failed;
2665                 value = ast2obj_expr(o->v.ListComp.elt);
2666                 if (!value) goto failed;
2667                 if (PyObject_SetAttrString(result, "elt", value) == -1)
2668                         goto failed;
2669                 Py_DECREF(value);
2670                 value = ast2obj_list(o->v.ListComp.generators,
2671                                      ast2obj_comprehension);
2672                 if (!value) goto failed;
2673                 if (PyObject_SetAttrString(result, "generators", value) == -1)
2674                         goto failed;
2675                 Py_DECREF(value);
2676                 break;
2677         case SetComp_kind:
2678                 result = PyType_GenericNew(SetComp_type, NULL, NULL);
2679                 if (!result) goto failed;
2680                 value = ast2obj_expr(o->v.SetComp.elt);
2681                 if (!value) goto failed;
2682                 if (PyObject_SetAttrString(result, "elt", value) == -1)
2683                         goto failed;
2684                 Py_DECREF(value);
2685                 value = ast2obj_list(o->v.SetComp.generators,
2686                                      ast2obj_comprehension);
2687                 if (!value) goto failed;
2688                 if (PyObject_SetAttrString(result, "generators", value) == -1)
2689                         goto failed;
2690                 Py_DECREF(value);
2691                 break;
2692         case DictComp_kind:
2693                 result = PyType_GenericNew(DictComp_type, NULL, NULL);
2694                 if (!result) goto failed;
2695                 value = ast2obj_expr(o->v.DictComp.key);
2696                 if (!value) goto failed;
2697                 if (PyObject_SetAttrString(result, "key", value) == -1)
2698                         goto failed;
2699                 Py_DECREF(value);
2700                 value = ast2obj_expr(o->v.DictComp.value);
2701                 if (!value) goto failed;
2702                 if (PyObject_SetAttrString(result, "value", value) == -1)
2703                         goto failed;
2704                 Py_DECREF(value);
2705                 value = ast2obj_list(o->v.DictComp.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;
2712         case GeneratorExp_kind:
2713                 result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
2714                 if (!result) goto failed;
2715                 value = ast2obj_expr(o->v.GeneratorExp.elt);
2716                 if (!value) goto failed;
2717                 if (PyObject_SetAttrString(result, "elt", value) == -1)
2718                         goto failed;
2719                 Py_DECREF(value);
2720                 value = ast2obj_list(o->v.GeneratorExp.generators,
2721                                      ast2obj_comprehension);
2722                 if (!value) goto failed;
2723                 if (PyObject_SetAttrString(result, "generators", value) == -1)
2724                         goto failed;
2725                 Py_DECREF(value);
2726                 break;
2727         case Yield_kind:
2728                 result = PyType_GenericNew(Yield_type, NULL, NULL);
2729                 if (!result) goto failed;
2730                 value = ast2obj_expr(o->v.Yield.value);
2731                 if (!value) goto failed;
2732                 if (PyObject_SetAttrString(result, "value", value) == -1)
2733                         goto failed;
2734                 Py_DECREF(value);
2735                 break;
2736         case Compare_kind:
2737                 result = PyType_GenericNew(Compare_type, NULL, NULL);
2738                 if (!result) goto failed;
2739                 value = ast2obj_expr(o->v.Compare.left);
2740                 if (!value) goto failed;
2741                 if (PyObject_SetAttrString(result, "left", value) == -1)
2742                         goto failed;
2743                 Py_DECREF(value);
2744                 {
2745                         int i, n = asdl_seq_LEN(o->v.Compare.ops);
2746                         value = PyList_New(n);
2747                         if (!value) goto failed;
2748                         for(i = 0; i < n; i++)
2749                                 PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
2750                 }
2751                 if (!value) goto failed;
2752                 if (PyObject_SetAttrString(result, "ops", value) == -1)
2753                         goto failed;
2754                 Py_DECREF(value);
2755                 value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
2756                 if (!value) goto failed;
2757                 if (PyObject_SetAttrString(result, "comparators", value) == -1)
2758                         goto failed;
2759                 Py_DECREF(value);
2760                 break;
2761         case Call_kind:
2762                 result = PyType_GenericNew(Call_type, NULL, NULL);
2763                 if (!result) goto failed;
2764                 value = ast2obj_expr(o->v.Call.func);
2765                 if (!value) goto failed;
2766                 if (PyObject_SetAttrString(result, "func", value) == -1)
2767                         goto failed;
2768                 Py_DECREF(value);
2769                 value = ast2obj_list(o->v.Call.args, ast2obj_expr);
2770                 if (!value) goto failed;
2771                 if (PyObject_SetAttrString(result, "args", value) == -1)
2772                         goto failed;
2773                 Py_DECREF(value);
2774                 value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
2775                 if (!value) goto failed;
2776                 if (PyObject_SetAttrString(result, "keywords", value) == -1)
2777                         goto failed;
2778                 Py_DECREF(value);
2779                 value = ast2obj_expr(o->v.Call.starargs);
2780                 if (!value) goto failed;
2781                 if (PyObject_SetAttrString(result, "starargs", value) == -1)
2782                         goto failed;
2783                 Py_DECREF(value);
2784                 value = ast2obj_expr(o->v.Call.kwargs);
2785                 if (!value) goto failed;
2786                 if (PyObject_SetAttrString(result, "kwargs", value) == -1)
2787                         goto failed;
2788                 Py_DECREF(value);
2789                 break;
2790         case Repr_kind:
2791                 result = PyType_GenericNew(Repr_type, NULL, NULL);
2792                 if (!result) goto failed;
2793                 value = ast2obj_expr(o->v.Repr.value);
2794                 if (!value) goto failed;
2795                 if (PyObject_SetAttrString(result, "value", value) == -1)
2796                         goto failed;
2797                 Py_DECREF(value);
2798                 break;
2799         case Num_kind:
2800                 result = PyType_GenericNew(Num_type, NULL, NULL);
2801                 if (!result) goto failed;
2802                 value = ast2obj_object(o->v.Num.n);
2803                 if (!value) goto failed;
2804                 if (PyObject_SetAttrString(result, "n", value) == -1)
2805                         goto failed;
2806                 Py_DECREF(value);
2807                 break;
2808         case Str_kind:
2809                 result = PyType_GenericNew(Str_type, NULL, NULL);
2810                 if (!result) goto failed;
2811                 value = ast2obj_string(o->v.Str.s);
2812                 if (!value) goto failed;
2813                 if (PyObject_SetAttrString(result, "s", value) == -1)
2814                         goto failed;
2815                 Py_DECREF(value);
2816                 break;
2817         case Attribute_kind:
2818                 result = PyType_GenericNew(Attribute_type, NULL, NULL);
2819                 if (!result) goto failed;
2820                 value = ast2obj_expr(o->v.Attribute.value);
2821                 if (!value) goto failed;
2822                 if (PyObject_SetAttrString(result, "value", value) == -1)
2823                         goto failed;
2824                 Py_DECREF(value);
2825                 value = ast2obj_identifier(o->v.Attribute.attr);
2826                 if (!value) goto failed;
2827                 if (PyObject_SetAttrString(result, "attr", value) == -1)
2828                         goto failed;
2829                 Py_DECREF(value);
2830                 value = ast2obj_expr_context(o->v.Attribute.ctx);
2831                 if (!value) goto failed;
2832                 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2833                         goto failed;
2834                 Py_DECREF(value);
2835                 break;
2836         case Subscript_kind:
2837                 result = PyType_GenericNew(Subscript_type, NULL, NULL);
2838                 if (!result) goto failed;
2839                 value = ast2obj_expr(o->v.Subscript.value);
2840                 if (!value) goto failed;
2841                 if (PyObject_SetAttrString(result, "value", value) == -1)
2842                         goto failed;
2843                 Py_DECREF(value);
2844                 value = ast2obj_slice(o->v.Subscript.slice);
2845                 if (!value) goto failed;
2846                 if (PyObject_SetAttrString(result, "slice", value) == -1)
2847                         goto failed;
2848                 Py_DECREF(value);
2849                 value = ast2obj_expr_context(o->v.Subscript.ctx);
2850                 if (!value) goto failed;
2851                 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2852                         goto failed;
2853                 Py_DECREF(value);
2854                 break;
2855         case Name_kind:
2856                 result = PyType_GenericNew(Name_type, NULL, NULL);
2857                 if (!result) goto failed;
2858                 value = ast2obj_identifier(o->v.Name.id);
2859                 if (!value) goto failed;
2860                 if (PyObject_SetAttrString(result, "id", value) == -1)
2861                         goto failed;
2862                 Py_DECREF(value);
2863                 value = ast2obj_expr_context(o->v.Name.ctx);
2864                 if (!value) goto failed;
2865                 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2866                         goto failed;
2867                 Py_DECREF(value);
2868                 break;
2869         case List_kind:
2870                 result = PyType_GenericNew(List_type, NULL, NULL);
2871                 if (!result) goto failed;
2872                 value = ast2obj_list(o->v.List.elts, ast2obj_expr);
2873                 if (!value) goto failed;
2874                 if (PyObject_SetAttrString(result, "elts", value) == -1)
2875                         goto failed;
2876                 Py_DECREF(value);
2877                 value = ast2obj_expr_context(o->v.List.ctx);
2878                 if (!value) goto failed;
2879                 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2880                         goto failed;
2881                 Py_DECREF(value);
2882                 break;
2883         case Tuple_kind:
2884                 result = PyType_GenericNew(Tuple_type, NULL, NULL);
2885                 if (!result) goto failed;
2886                 value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
2887                 if (!value) goto failed;
2888                 if (PyObject_SetAttrString(result, "elts", value) == -1)
2889                         goto failed;
2890                 Py_DECREF(value);
2891                 value = ast2obj_expr_context(o->v.Tuple.ctx);
2892                 if (!value) goto failed;
2893                 if (PyObject_SetAttrString(result, "ctx", value) == -1)
2894                         goto failed;
2895                 Py_DECREF(value);
2896                 break;
2897         }
2898         value = ast2obj_int(o->lineno);
2899         if (!value) goto failed;
2900         if (PyObject_SetAttrString(result, "lineno", value) < 0)
2901                 goto failed;
2902         Py_DECREF(value);
2903         value = ast2obj_int(o->col_offset);
2904         if (!value) goto failed;
2905         if (PyObject_SetAttrString(result, "col_offset", value) < 0)
2906                 goto failed;
2907         Py_DECREF(value);
2908         return result;
2909 failed:
2910         Py_XDECREF(value);
2911         Py_XDECREF(result);
2912         return NULL;
2913 }
2914
2915 PyObject* ast2obj_expr_context(expr_context_ty o)
2916 {
2917         switch(o) {
2918                 case Load:
2919                         Py_INCREF(Load_singleton);
2920                         return Load_singleton;
2921                 case Store:
2922                         Py_INCREF(Store_singleton);
2923                         return Store_singleton;
2924                 case Del:
2925                         Py_INCREF(Del_singleton);
2926                         return Del_singleton;
2927                 case AugLoad:
2928                         Py_INCREF(AugLoad_singleton);
2929                         return AugLoad_singleton;
2930                 case AugStore:
2931                         Py_INCREF(AugStore_singleton);
2932                         return AugStore_singleton;
2933                 case Param:
2934                         Py_INCREF(Param_singleton);
2935                         return Param_singleton;
2936                 default:
2937                         /* should never happen, but just in case ... */
2938                         PyErr_Format(PyExc_SystemError, "unknown expr_context found");
2939                         return NULL;
2940         }
2941 }
2942 PyObject*
2943 ast2obj_slice(void* _o)
2944 {
2945         slice_ty o = (slice_ty)_o;
2946         PyObject *result = NULL, *value = NULL;
2947         if (!o) {
2948                 Py_INCREF(Py_None);
2949                 return Py_None;
2950         }
2951
2952         switch (o->kind) {
2953         case Ellipsis_kind:
2954                 result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
2955                 if (!result) goto failed;
2956                 break;
2957         case Slice_kind:
2958                 result = PyType_GenericNew(Slice_type, NULL, NULL);
2959                 if (!result) goto failed;
2960                 value = ast2obj_expr(o->v.Slice.lower);
2961                 if (!value) goto failed;
2962                 if (PyObject_SetAttrString(result, "lower", value) == -1)
2963                         goto failed;
2964                 Py_DECREF(value);
2965                 value = ast2obj_expr(o->v.Slice.upper);
2966                 if (!value) goto failed;
2967                 if (PyObject_SetAttrString(result, "upper", value) == -1)
2968                         goto failed;
2969                 Py_DECREF(value);
2970                 value = ast2obj_expr(o->v.Slice.step);
2971                 if (!value) goto failed;
2972                 if (PyObject_SetAttrString(result, "step", value) == -1)
2973                         goto failed;
2974                 Py_DECREF(value);
2975                 break;
2976         case ExtSlice_kind:
2977                 result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
2978                 if (!result) goto failed;
2979                 value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
2980                 if (!value) goto failed;
2981                 if (PyObject_SetAttrString(result, "dims", value) == -1)
2982                         goto failed;
2983                 Py_DECREF(value);
2984                 break;
2985         case Index_kind:
2986                 result = PyType_GenericNew(Index_type, NULL, NULL);
2987                 if (!result) goto failed;
2988                 value = ast2obj_expr(o->v.Index.value);
2989                 if (!value) goto failed;
2990                 if (PyObject_SetAttrString(result, "value", value) == -1)
2991                         goto failed;
2992                 Py_DECREF(value);
2993                 break;
2994         }
2995         return result;
2996 failed:
2997         Py_XDECREF(value);
2998         Py_XDECREF(result);
2999         return NULL;
3000 }
3001
3002 PyObject* ast2obj_boolop(boolop_ty o)
3003 {
3004         switch(o) {
3005                 case And:
3006                         Py_INCREF(And_singleton);
3007                         return And_singleton;
3008                 case Or:
3009                         Py_INCREF(Or_singleton);
3010                         return Or_singleton;
3011                 default:
3012                         /* should never happen, but just in case ... */
3013                         PyErr_Format(PyExc_SystemError, "unknown boolop found");
3014                         return NULL;
3015         }
3016 }
3017 PyObject* ast2obj_operator(operator_ty o)
3018 {
3019         switch(o) {
3020                 case Add:
3021                         Py_INCREF(Add_singleton);
3022                         return Add_singleton;
3023                 case Sub:
3024                         Py_INCREF(Sub_singleton);
3025                         return Sub_singleton;
3026                 case Mult:
3027                         Py_INCREF(Mult_singleton);
3028                         return Mult_singleton;
3029                 case Div:
3030                         Py_INCREF(Div_singleton);
3031                         return Div_singleton;
3032                 case Mod:
3033                         Py_INCREF(Mod_singleton);
3034                         return Mod_singleton;
3035                 case Pow:
3036                         Py_INCREF(Pow_singleton);
3037                         return Pow_singleton;
3038                 case LShift:
3039                         Py_INCREF(LShift_singleton);
3040                         return LShift_singleton;
3041                 case RShift:
3042                         Py_INCREF(RShift_singleton);
3043                         return RShift_singleton;
3044                 case BitOr:
3045                         Py_INCREF(BitOr_singleton);
3046                         return BitOr_singleton;
3047                 case BitXor:
3048                         Py_INCREF(BitXor_singleton);
3049                         return BitXor_singleton;
3050                 case BitAnd:
3051                         Py_INCREF(BitAnd_singleton);
3052                         return BitAnd_singleton;
3053                 case FloorDiv:
3054                         Py_INCREF(FloorDiv_singleton);
3055                         return FloorDiv_singleton;
3056                 default:
3057                         /* should never happen, but just in case ... */
3058                         PyErr_Format(PyExc_SystemError, "unknown operator found");
3059                         return NULL;
3060         }
3061 }
3062 PyObject* ast2obj_unaryop(unaryop_ty o)
3063 {
3064         switch(o) {
3065                 case Invert:
3066                         Py_INCREF(Invert_singleton);
3067                         return Invert_singleton;
3068                 case Not:
3069                         Py_INCREF(Not_singleton);
3070                         return Not_singleton;
3071                 case UAdd:
3072                         Py_INCREF(UAdd_singleton);
3073                         return UAdd_singleton;
3074                 case USub:
3075                         Py_INCREF(USub_singleton);
3076                         return USub_singleton;
3077                 default:
3078                         /* should never happen, but just in case ... */
3079                         PyErr_Format(PyExc_SystemError, "unknown unaryop found");
3080                         return NULL;
3081         }
3082 }
3083 PyObject* ast2obj_cmpop(cmpop_ty o)
3084 {
3085         switch(o) {
3086                 case Eq:
3087                         Py_INCREF(Eq_singleton);
3088                         return Eq_singleton;
3089                 case NotEq:
3090                         Py_INCREF(NotEq_singleton);
3091                         return NotEq_singleton;
3092                 case Lt:
3093                         Py_INCREF(Lt_singleton);
3094                         return Lt_singleton;
3095                 case LtE:
3096                         Py_INCREF(LtE_singleton);
3097                         return LtE_singleton;
3098                 case Gt:
3099                         Py_INCREF(Gt_singleton);
3100                         return Gt_singleton;
3101                 case GtE:
3102                         Py_INCREF(GtE_singleton);
3103                         return GtE_singleton;
3104                 case Is:
3105                         Py_INCREF(Is_singleton);
3106                         return Is_singleton;
3107                 case IsNot:
3108                         Py_INCREF(IsNot_singleton);
3109                         return IsNot_singleton;
3110                 case In:
3111                         Py_INCREF(In_singleton);
3112                         return In_singleton;
3113                 case NotIn:
3114                         Py_INCREF(NotIn_singleton);
3115                         return NotIn_singleton;
3116                 default:
3117                         /* should never happen, but just in case ... */
3118                         PyErr_Format(PyExc_SystemError, "unknown cmpop found");
3119                         return NULL;
3120         }
3121 }
3122 PyObject*
3123 ast2obj_comprehension(void* _o)
3124 {
3125         comprehension_ty o = (comprehension_ty)_o;
3126         PyObject *result = NULL, *value = NULL;
3127         if (!o) {
3128                 Py_INCREF(Py_None);
3129                 return Py_None;
3130         }
3131
3132         result = PyType_GenericNew(comprehension_type, NULL, NULL);
3133         if (!result) return NULL;
3134         value = ast2obj_expr(o->target);
3135         if (!value) goto failed;
3136         if (PyObject_SetAttrString(result, "target", value) == -1)
3137                 goto failed;
3138         Py_DECREF(value);
3139         value = ast2obj_expr(o->iter);
3140         if (!value) goto failed;
3141         if (PyObject_SetAttrString(result, "iter", value) == -1)
3142                 goto failed;
3143         Py_DECREF(value);
3144         value = ast2obj_list(o->ifs, ast2obj_expr);
3145         if (!value) goto failed;
3146         if (PyObject_SetAttrString(result, "ifs", value) == -1)
3147                 goto failed;
3148         Py_DECREF(value);
3149         return result;
3150 failed:
3151         Py_XDECREF(value);
3152         Py_XDECREF(result);
3153         return NULL;
3154 }
3155
3156 PyObject*
3157 ast2obj_excepthandler(void* _o)
3158 {
3159         excepthandler_ty o = (excepthandler_ty)_o;
3160         PyObject *result = NULL, *value = NULL;
3161         if (!o) {
3162                 Py_INCREF(Py_None);
3163                 return Py_None;
3164         }
3165
3166         switch (o->kind) {
3167         case ExceptHandler_kind:
3168                 result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
3169                 if (!result) goto failed;
3170                 value = ast2obj_expr(o->v.ExceptHandler.type);
3171                 if (!value) goto failed;
3172                 if (PyObject_SetAttrString(result, "type", value) == -1)
3173                         goto failed;
3174                 Py_DECREF(value);
3175                 value = ast2obj_expr(o->v.ExceptHandler.name);
3176                 if (!value) goto failed;
3177                 if (PyObject_SetAttrString(result, "name", value) == -1)
3178                         goto failed;
3179                 Py_DECREF(value);
3180                 value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
3181                 if (!value) goto failed;
3182                 if (PyObject_SetAttrString(result, "body", value) == -1)
3183                         goto failed;
3184                 Py_DECREF(value);
3185                 break;
3186         }
3187         value = ast2obj_int(o->lineno);
3188         if (!value) goto failed;
3189         if (PyObject_SetAttrString(result, "lineno", value) < 0)
3190                 goto failed;
3191         Py_DECREF(value);
3192         value = ast2obj_int(o->col_offset);
3193         if (!value) goto failed;
3194         if (PyObject_SetAttrString(result, "col_offset", value) < 0)
3195                 goto failed;
3196         Py_DECREF(value);
3197         return result;
3198 failed:
3199         Py_XDECREF(value);
3200         Py_XDECREF(result);
3201         return NULL;
3202 }
3203
3204 PyObject*
3205 ast2obj_arguments(void* _o)
3206 {
3207         arguments_ty o = (arguments_ty)_o;
3208         PyObject *result = NULL, *value = NULL;
3209         if (!o) {
3210                 Py_INCREF(Py_None);
3211                 return Py_None;
3212         }
3213
3214         result = PyType_GenericNew(arguments_type, NULL, NULL);
3215         if (!result) return NULL;
3216         value = ast2obj_list(o->args, ast2obj_expr);
3217         if (!value) goto failed;
3218         if (PyObject_SetAttrString(result, "args", value) == -1)
3219                 goto failed;
3220         Py_DECREF(value);
3221         value = ast2obj_identifier(o->vararg);
3222         if (!value) goto failed;
3223         if (PyObject_SetAttrString(result, "vararg", value) == -1)
3224                 goto failed;
3225         Py_DECREF(value);
3226         value = ast2obj_identifier(o->kwarg);
3227         if (!value) goto failed;
3228         if (PyObject_SetAttrString(result, "kwarg", value) == -1)
3229                 goto failed;
3230         Py_DECREF(value);
3231         value = ast2obj_list(o->defaults, ast2obj_expr);
3232         if (!value) goto failed;
3233         if (PyObject_SetAttrString(result, "defaults", value) == -1)
3234                 goto failed;
3235         Py_DECREF(value);
3236         return result;
3237 failed:
3238         Py_XDECREF(value);
3239         Py_XDECREF(result);
3240         return NULL;
3241 }
3242
3243 PyObject*
3244 ast2obj_keyword(void* _o)
3245 {
3246         keyword_ty o = (keyword_ty)_o;
3247         PyObject *result = NULL, *value = NULL;
3248         if (!o) {
3249                 Py_INCREF(Py_None);
3250                 return Py_None;
3251         }
3252
3253         result = PyType_GenericNew(keyword_type, NULL, NULL);
3254         if (!result) return NULL;
3255         value = ast2obj_identifier(o->arg);
3256         if (!value) goto failed;
3257         if (PyObject_SetAttrString(result, "arg", value) == -1)
3258                 goto failed;
3259         Py_DECREF(value);
3260         value = ast2obj_expr(o->value);
3261         if (!value) goto failed;
3262         if (PyObject_SetAttrString(result, "value", value) == -1)
3263                 goto failed;
3264         Py_DECREF(value);
3265         return result;
3266 failed:
3267         Py_XDECREF(value);
3268         Py_XDECREF(result);
3269         return NULL;
3270 }
3271
3272 PyObject*
3273 ast2obj_alias(void* _o)
3274 {
3275         alias_ty o = (alias_ty)_o;
3276         PyObject *result = NULL, *value = NULL;
3277         if (!o) {
3278                 Py_INCREF(Py_None);
3279                 return Py_None;
3280         }
3281
3282         result = PyType_GenericNew(alias_type, NULL, NULL);
3283         if (!result) return NULL;
3284         value = ast2obj_identifier(o->name);
3285         if (!value) goto failed;
3286         if (PyObject_SetAttrString(result, "name", value) == -1)
3287                 goto failed;
3288         Py_DECREF(value);
3289         value = ast2obj_identifier(o->asname);
3290         if (!value) goto failed;
3291         if (PyObject_SetAttrString(result, "asname", value) == -1)
3292                 goto failed;
3293         Py_DECREF(value);
3294         return result;
3295 failed:
3296         Py_XDECREF(value);
3297         Py_XDECREF(result);
3298         return NULL;
3299 }
3300
3301
3302 int
3303 obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
3304 {
3305         PyObject* tmp = NULL;
3306         int isinstance;
3307
3308
3309         if (obj == Py_None) {
3310                 *out = NULL;
3311                 return 0;
3312         }
3313         isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type);
3314         if (isinstance == -1) {
3315                 return 1;
3316         }
3317         if (isinstance) {
3318                 asdl_seq* body;
3319
3320                 if (PyObject_HasAttrString(obj, "body")) {
3321                         int res;
3322                         Py_ssize_t len;
3323                         Py_ssize_t i;
3324                         tmp = PyObject_GetAttrString(obj, "body");
3325                         if (tmp == NULL) goto failed;
3326                         if (!PyList_Check(tmp)) {
3327                                 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3328                                 goto failed;
3329                         }
3330                         len = PyList_GET_SIZE(tmp);
3331                         body = asdl_seq_new(len, arena);
3332                         if (body == NULL) goto failed;
3333                         for (i = 0; i < len; i++) {
3334                                 stmt_ty value;
3335                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3336                                 if (res != 0) goto failed;
3337                                 asdl_seq_SET(body, i, value);
3338                         }
3339                         Py_XDECREF(tmp);
3340                         tmp = NULL;
3341                 } else {
3342                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
3343                         return 1;
3344                 }
3345                 *out = Module(body, arena);
3346                 if (*out == NULL) goto failed;
3347                 return 0;
3348         }
3349         isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type);
3350         if (isinstance == -1) {
3351                 return 1;
3352         }
3353         if (isinstance) {
3354                 asdl_seq* body;
3355
3356                 if (PyObject_HasAttrString(obj, "body")) {
3357                         int res;
3358                         Py_ssize_t len;
3359                         Py_ssize_t i;
3360                         tmp = PyObject_GetAttrString(obj, "body");
3361                         if (tmp == NULL) goto failed;
3362                         if (!PyList_Check(tmp)) {
3363                                 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3364                                 goto failed;
3365                         }
3366                         len = PyList_GET_SIZE(tmp);
3367                         body = asdl_seq_new(len, arena);
3368                         if (body == NULL) goto failed;
3369                         for (i = 0; i < len; i++) {
3370                                 stmt_ty value;
3371                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3372                                 if (res != 0) goto failed;
3373                                 asdl_seq_SET(body, i, value);
3374                         }
3375                         Py_XDECREF(tmp);
3376                         tmp = NULL;
3377                 } else {
3378                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
3379                         return 1;
3380                 }
3381                 *out = Interactive(body, arena);
3382                 if (*out == NULL) goto failed;
3383                 return 0;
3384         }
3385         isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type);
3386         if (isinstance == -1) {
3387                 return 1;
3388         }
3389         if (isinstance) {
3390                 expr_ty body;
3391
3392                 if (PyObject_HasAttrString(obj, "body")) {
3393                         int res;
3394                         tmp = PyObject_GetAttrString(obj, "body");
3395                         if (tmp == NULL) goto failed;
3396                         res = obj2ast_expr(tmp, &body, arena);
3397                         if (res != 0) goto failed;
3398                         Py_XDECREF(tmp);
3399                         tmp = NULL;
3400                 } else {
3401                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
3402                         return 1;
3403                 }
3404                 *out = Expression(body, arena);
3405                 if (*out == NULL) goto failed;
3406                 return 0;
3407         }
3408         isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type);
3409         if (isinstance == -1) {
3410                 return 1;
3411         }
3412         if (isinstance) {
3413                 asdl_seq* body;
3414
3415                 if (PyObject_HasAttrString(obj, "body")) {
3416                         int res;
3417                         Py_ssize_t len;
3418                         Py_ssize_t i;
3419                         tmp = PyObject_GetAttrString(obj, "body");
3420                         if (tmp == NULL) goto failed;
3421                         if (!PyList_Check(tmp)) {
3422                                 PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3423                                 goto failed;
3424                         }
3425                         len = PyList_GET_SIZE(tmp);
3426                         body = asdl_seq_new(len, arena);
3427                         if (body == NULL) goto failed;
3428                         for (i = 0; i < len; i++) {
3429                                 stmt_ty value;
3430                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3431                                 if (res != 0) goto failed;
3432                                 asdl_seq_SET(body, i, value);
3433                         }
3434                         Py_XDECREF(tmp);
3435                         tmp = NULL;
3436                 } else {
3437                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
3438                         return 1;
3439                 }
3440                 *out = Suite(body, arena);
3441                 if (*out == NULL) goto failed;
3442                 return 0;
3443         }
3444
3445         tmp = PyObject_Repr(obj);
3446         if (tmp == NULL) goto failed;
3447         PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %.400s", PyString_AS_STRING(tmp));
3448 failed:
3449         Py_XDECREF(tmp);
3450         return 1;
3451 }
3452
3453 int
3454 obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
3455 {
3456         PyObject* tmp = NULL;
3457         int isinstance;
3458
3459         int lineno;
3460         int col_offset;
3461
3462         if (obj == Py_None) {
3463                 *out = NULL;
3464                 return 0;
3465         }
3466         if (PyObject_HasAttrString(obj, "lineno")) {
3467                 int res;
3468                 tmp = PyObject_GetAttrString(obj, "lineno");
3469                 if (tmp == NULL) goto failed;
3470                 res = obj2ast_int(tmp, &lineno, arena);
3471                 if (res != 0) goto failed;
3472                 Py_XDECREF(tmp);
3473                 tmp = NULL;
3474         } else {
3475                 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
3476                 return 1;
3477         }
3478         if (PyObject_HasAttrString(obj, "col_offset")) {
3479                 int res;
3480                 tmp = PyObject_GetAttrString(obj, "col_offset");
3481                 if (tmp == NULL) goto failed;
3482                 res = obj2ast_int(tmp, &col_offset, arena);
3483                 if (res != 0) goto failed;
3484                 Py_XDECREF(tmp);
3485                 tmp = NULL;
3486         } else {
3487                 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
3488                 return 1;
3489         }
3490         isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type);
3491         if (isinstance == -1) {
3492                 return 1;
3493         }
3494         if (isinstance) {
3495                 identifier name;
3496                 arguments_ty args;
3497                 asdl_seq* body;
3498                 asdl_seq* decorator_list;
3499
3500                 if (PyObject_HasAttrString(obj, "name")) {
3501                         int res;
3502                         tmp = PyObject_GetAttrString(obj, "name");
3503                         if (tmp == NULL) goto failed;
3504                         res = obj2ast_identifier(tmp, &name, arena);
3505                         if (res != 0) goto failed;
3506                         Py_XDECREF(tmp);
3507                         tmp = NULL;
3508                 } else {
3509                         PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
3510                         return 1;
3511                 }
3512                 if (PyObject_HasAttrString(obj, "args")) {
3513                         int res;
3514                         tmp = PyObject_GetAttrString(obj, "args");
3515                         if (tmp == NULL) goto failed;
3516                         res = obj2ast_arguments(tmp, &args, arena);
3517                         if (res != 0) goto failed;
3518                         Py_XDECREF(tmp);
3519                         tmp = NULL;
3520                 } else {
3521                         PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
3522                         return 1;
3523                 }
3524                 if (PyObject_HasAttrString(obj, "body")) {
3525                         int res;
3526                         Py_ssize_t len;
3527                         Py_ssize_t i;
3528                         tmp = PyObject_GetAttrString(obj, "body");
3529                         if (tmp == NULL) goto failed;
3530                         if (!PyList_Check(tmp)) {
3531                                 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3532                                 goto failed;
3533                         }
3534                         len = PyList_GET_SIZE(tmp);
3535                         body = asdl_seq_new(len, arena);
3536                         if (body == NULL) goto failed;
3537                         for (i = 0; i < len; i++) {
3538                                 stmt_ty value;
3539                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3540                                 if (res != 0) goto failed;
3541                                 asdl_seq_SET(body, i, value);
3542                         }
3543                         Py_XDECREF(tmp);
3544                         tmp = NULL;
3545                 } else {
3546                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
3547                         return 1;
3548                 }
3549                 if (PyObject_HasAttrString(obj, "decorator_list")) {
3550                         int res;
3551                         Py_ssize_t len;
3552                         Py_ssize_t i;
3553                         tmp = PyObject_GetAttrString(obj, "decorator_list");
3554                         if (tmp == NULL) goto failed;
3555                         if (!PyList_Check(tmp)) {
3556                                 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3557                                 goto failed;
3558                         }
3559                         len = PyList_GET_SIZE(tmp);
3560                         decorator_list = asdl_seq_new(len, arena);
3561                         if (decorator_list == NULL) goto failed;
3562                         for (i = 0; i < len; i++) {
3563                                 expr_ty value;
3564                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3565                                 if (res != 0) goto failed;
3566                                 asdl_seq_SET(decorator_list, i, value);
3567                         }
3568                         Py_XDECREF(tmp);
3569                         tmp = NULL;
3570                 } else {
3571                         PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
3572                         return 1;
3573                 }
3574                 *out = FunctionDef(name, args, body, decorator_list, lineno,
3575                                    col_offset, arena);
3576                 if (*out == NULL) goto failed;
3577                 return 0;
3578         }
3579         isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type);
3580         if (isinstance == -1) {
3581                 return 1;
3582         }
3583         if (isinstance) {
3584                 identifier name;
3585                 asdl_seq* bases;
3586                 asdl_seq* body;
3587                 asdl_seq* decorator_list;
3588
3589                 if (PyObject_HasAttrString(obj, "name")) {
3590                         int res;
3591                         tmp = PyObject_GetAttrString(obj, "name");
3592                         if (tmp == NULL) goto failed;
3593                         res = obj2ast_identifier(tmp, &name, arena);
3594                         if (res != 0) goto failed;
3595                         Py_XDECREF(tmp);
3596                         tmp = NULL;
3597                 } else {
3598                         PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
3599                         return 1;
3600                 }
3601                 if (PyObject_HasAttrString(obj, "bases")) {
3602                         int res;
3603                         Py_ssize_t len;
3604                         Py_ssize_t i;
3605                         tmp = PyObject_GetAttrString(obj, "bases");
3606                         if (tmp == NULL) goto failed;
3607                         if (!PyList_Check(tmp)) {
3608                                 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3609                                 goto failed;
3610                         }
3611                         len = PyList_GET_SIZE(tmp);
3612                         bases = asdl_seq_new(len, arena);
3613                         if (bases == NULL) goto failed;
3614                         for (i = 0; i < len; i++) {
3615                                 expr_ty value;
3616                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3617                                 if (res != 0) goto failed;
3618                                 asdl_seq_SET(bases, i, value);
3619                         }
3620                         Py_XDECREF(tmp);
3621                         tmp = NULL;
3622                 } else {
3623                         PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
3624                         return 1;
3625                 }
3626                 if (PyObject_HasAttrString(obj, "body")) {
3627                         int res;
3628                         Py_ssize_t len;
3629                         Py_ssize_t i;
3630                         tmp = PyObject_GetAttrString(obj, "body");
3631                         if (tmp == NULL) goto failed;
3632                         if (!PyList_Check(tmp)) {
3633                                 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3634                                 goto failed;
3635                         }
3636                         len = PyList_GET_SIZE(tmp);
3637                         body = asdl_seq_new(len, arena);
3638                         if (body == NULL) goto failed;
3639                         for (i = 0; i < len; i++) {
3640                                 stmt_ty value;
3641                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3642                                 if (res != 0) goto failed;
3643                                 asdl_seq_SET(body, i, value);
3644                         }
3645                         Py_XDECREF(tmp);
3646                         tmp = NULL;
3647                 } else {
3648                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
3649                         return 1;
3650                 }
3651                 if (PyObject_HasAttrString(obj, "decorator_list")) {
3652                         int res;
3653                         Py_ssize_t len;
3654                         Py_ssize_t i;
3655                         tmp = PyObject_GetAttrString(obj, "decorator_list");
3656                         if (tmp == NULL) goto failed;
3657                         if (!PyList_Check(tmp)) {
3658                                 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3659                                 goto failed;
3660                         }
3661                         len = PyList_GET_SIZE(tmp);
3662                         decorator_list = asdl_seq_new(len, arena);
3663                         if (decorator_list == NULL) goto failed;
3664                         for (i = 0; i < len; i++) {
3665                                 expr_ty value;
3666                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3667                                 if (res != 0) goto failed;
3668                                 asdl_seq_SET(decorator_list, i, value);
3669                         }
3670                         Py_XDECREF(tmp);
3671                         tmp = NULL;
3672                 } else {
3673                         PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
3674                         return 1;
3675                 }
3676                 *out = ClassDef(name, bases, body, decorator_list, lineno,
3677                                 col_offset, arena);
3678                 if (*out == NULL) goto failed;
3679                 return 0;
3680         }
3681         isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type);
3682         if (isinstance == -1) {
3683                 return 1;
3684         }
3685         if (isinstance) {
3686                 expr_ty value;
3687
3688                 if (PyObject_HasAttrString(obj, "value")) {
3689                         int res;
3690                         tmp = PyObject_GetAttrString(obj, "value");
3691                         if (tmp == NULL) goto failed;
3692                         res = obj2ast_expr(tmp, &value, arena);
3693                         if (res != 0) goto failed;
3694                         Py_XDECREF(tmp);
3695                         tmp = NULL;
3696                 } else {
3697                         value = NULL;
3698                 }
3699                 *out = Return(value, lineno, col_offset, arena);
3700                 if (*out == NULL) goto failed;
3701                 return 0;
3702         }
3703         isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type);
3704         if (isinstance == -1) {
3705                 return 1;
3706         }
3707         if (isinstance) {
3708                 asdl_seq* targets;
3709
3710                 if (PyObject_HasAttrString(obj, "targets")) {
3711                         int res;
3712                         Py_ssize_t len;
3713                         Py_ssize_t i;
3714                         tmp = PyObject_GetAttrString(obj, "targets");
3715                         if (tmp == NULL) goto failed;
3716                         if (!PyList_Check(tmp)) {
3717                                 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3718                                 goto failed;
3719                         }
3720                         len = PyList_GET_SIZE(tmp);
3721                         targets = asdl_seq_new(len, arena);
3722                         if (targets == NULL) goto failed;
3723                         for (i = 0; i < len; i++) {
3724                                 expr_ty value;
3725                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3726                                 if (res != 0) goto failed;
3727                                 asdl_seq_SET(targets, i, value);
3728                         }
3729                         Py_XDECREF(tmp);
3730                         tmp = NULL;
3731                 } else {
3732                         PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
3733                         return 1;
3734                 }
3735                 *out = Delete(targets, lineno, col_offset, arena);
3736                 if (*out == NULL) goto failed;
3737                 return 0;
3738         }
3739         isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type);
3740         if (isinstance == -1) {
3741                 return 1;
3742         }
3743         if (isinstance) {
3744                 asdl_seq* targets;
3745                 expr_ty value;
3746
3747                 if (PyObject_HasAttrString(obj, "targets")) {
3748                         int res;
3749                         Py_ssize_t len;
3750                         Py_ssize_t i;
3751                         tmp = PyObject_GetAttrString(obj, "targets");
3752                         if (tmp == NULL) goto failed;
3753                         if (!PyList_Check(tmp)) {
3754                                 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3755                                 goto failed;
3756                         }
3757                         len = PyList_GET_SIZE(tmp);
3758                         targets = asdl_seq_new(len, arena);
3759                         if (targets == NULL) goto failed;
3760                         for (i = 0; i < len; i++) {
3761                                 expr_ty value;
3762                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3763                                 if (res != 0) goto failed;
3764                                 asdl_seq_SET(targets, i, value);
3765                         }
3766                         Py_XDECREF(tmp);
3767                         tmp = NULL;
3768                 } else {
3769                         PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
3770                         return 1;
3771                 }
3772                 if (PyObject_HasAttrString(obj, "value")) {
3773                         int res;
3774                         tmp = PyObject_GetAttrString(obj, "value");
3775                         if (tmp == NULL) goto failed;
3776                         res = obj2ast_expr(tmp, &value, arena);
3777                         if (res != 0) goto failed;
3778                         Py_XDECREF(tmp);
3779                         tmp = NULL;
3780                 } else {
3781                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
3782                         return 1;
3783                 }
3784                 *out = Assign(targets, value, lineno, col_offset, arena);
3785                 if (*out == NULL) goto failed;
3786                 return 0;
3787         }
3788         isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type);
3789         if (isinstance == -1) {
3790                 return 1;
3791         }
3792         if (isinstance) {
3793                 expr_ty target;
3794                 operator_ty op;
3795                 expr_ty value;
3796
3797                 if (PyObject_HasAttrString(obj, "target")) {
3798                         int res;
3799                         tmp = PyObject_GetAttrString(obj, "target");
3800                         if (tmp == NULL) goto failed;
3801                         res = obj2ast_expr(tmp, &target, arena);
3802                         if (res != 0) goto failed;
3803                         Py_XDECREF(tmp);
3804                         tmp = NULL;
3805                 } else {
3806                         PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
3807                         return 1;
3808                 }
3809                 if (PyObject_HasAttrString(obj, "op")) {
3810                         int res;
3811                         tmp = PyObject_GetAttrString(obj, "op");
3812                         if (tmp == NULL) goto failed;
3813                         res = obj2ast_operator(tmp, &op, arena);
3814                         if (res != 0) goto failed;
3815                         Py_XDECREF(tmp);
3816                         tmp = NULL;
3817                 } else {
3818                         PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
3819                         return 1;
3820                 }
3821                 if (PyObject_HasAttrString(obj, "value")) {
3822                         int res;
3823                         tmp = PyObject_GetAttrString(obj, "value");
3824                         if (tmp == NULL) goto failed;
3825                         res = obj2ast_expr(tmp, &value, arena);
3826                         if (res != 0) goto failed;
3827                         Py_XDECREF(tmp);
3828                         tmp = NULL;
3829                 } else {
3830                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
3831                         return 1;
3832                 }
3833                 *out = AugAssign(target, op, value, lineno, col_offset, arena);
3834                 if (*out == NULL) goto failed;
3835                 return 0;
3836         }
3837         isinstance = PyObject_IsInstance(obj, (PyObject*)Print_type);
3838         if (isinstance == -1) {
3839                 return 1;
3840         }
3841         if (isinstance) {
3842                 expr_ty dest;
3843                 asdl_seq* values;
3844                 bool nl;
3845
3846                 if (PyObject_HasAttrString(obj, "dest")) {
3847                         int res;
3848                         tmp = PyObject_GetAttrString(obj, "dest");
3849                         if (tmp == NULL) goto failed;
3850                         res = obj2ast_expr(tmp, &dest, arena);
3851                         if (res != 0) goto failed;
3852                         Py_XDECREF(tmp);
3853                         tmp = NULL;
3854                 } else {
3855                         dest = NULL;
3856                 }
3857                 if (PyObject_HasAttrString(obj, "values")) {
3858                         int res;
3859                         Py_ssize_t len;
3860                         Py_ssize_t i;
3861                         tmp = PyObject_GetAttrString(obj, "values");
3862                         if (tmp == NULL) goto failed;
3863                         if (!PyList_Check(tmp)) {
3864                                 PyErr_Format(PyExc_TypeError, "Print field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3865                                 goto failed;
3866                         }
3867                         len = PyList_GET_SIZE(tmp);
3868                         values = asdl_seq_new(len, arena);
3869                         if (values == NULL) goto failed;
3870                         for (i = 0; i < len; i++) {
3871                                 expr_ty value;
3872                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
3873                                 if (res != 0) goto failed;
3874                                 asdl_seq_SET(values, i, value);
3875                         }
3876                         Py_XDECREF(tmp);
3877                         tmp = NULL;
3878                 } else {
3879                         PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Print");
3880                         return 1;
3881                 }
3882                 if (PyObject_HasAttrString(obj, "nl")) {
3883                         int res;
3884                         tmp = PyObject_GetAttrString(obj, "nl");
3885                         if (tmp == NULL) goto failed;
3886                         res = obj2ast_bool(tmp, &nl, arena);
3887                         if (res != 0) goto failed;
3888                         Py_XDECREF(tmp);
3889                         tmp = NULL;
3890                 } else {
3891                         PyErr_SetString(PyExc_TypeError, "required field \"nl\" missing from Print");
3892                         return 1;
3893                 }
3894                 *out = Print(dest, values, nl, lineno, col_offset, arena);
3895                 if (*out == NULL) goto failed;
3896                 return 0;
3897         }
3898         isinstance = PyObject_IsInstance(obj, (PyObject*)For_type);
3899         if (isinstance == -1) {
3900                 return 1;
3901         }
3902         if (isinstance) {
3903                 expr_ty target;
3904                 expr_ty iter;
3905                 asdl_seq* body;
3906                 asdl_seq* orelse;
3907
3908                 if (PyObject_HasAttrString(obj, "target")) {
3909                         int res;
3910                         tmp = PyObject_GetAttrString(obj, "target");
3911                         if (tmp == NULL) goto failed;
3912                         res = obj2ast_expr(tmp, &target, arena);
3913                         if (res != 0) goto failed;
3914                         Py_XDECREF(tmp);
3915                         tmp = NULL;
3916                 } else {
3917                         PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
3918                         return 1;
3919                 }
3920                 if (PyObject_HasAttrString(obj, "iter")) {
3921                         int res;
3922                         tmp = PyObject_GetAttrString(obj, "iter");
3923                         if (tmp == NULL) goto failed;
3924                         res = obj2ast_expr(tmp, &iter, arena);
3925                         if (res != 0) goto failed;
3926                         Py_XDECREF(tmp);
3927                         tmp = NULL;
3928                 } else {
3929                         PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
3930                         return 1;
3931                 }
3932                 if (PyObject_HasAttrString(obj, "body")) {
3933                         int res;
3934                         Py_ssize_t len;
3935                         Py_ssize_t i;
3936                         tmp = PyObject_GetAttrString(obj, "body");
3937                         if (tmp == NULL) goto failed;
3938                         if (!PyList_Check(tmp)) {
3939                                 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3940                                 goto failed;
3941                         }
3942                         len = PyList_GET_SIZE(tmp);
3943                         body = asdl_seq_new(len, arena);
3944                         if (body == NULL) goto failed;
3945                         for (i = 0; i < len; i++) {
3946                                 stmt_ty value;
3947                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3948                                 if (res != 0) goto failed;
3949                                 asdl_seq_SET(body, i, value);
3950                         }
3951                         Py_XDECREF(tmp);
3952                         tmp = NULL;
3953                 } else {
3954                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
3955                         return 1;
3956                 }
3957                 if (PyObject_HasAttrString(obj, "orelse")) {
3958                         int res;
3959                         Py_ssize_t len;
3960                         Py_ssize_t i;
3961                         tmp = PyObject_GetAttrString(obj, "orelse");
3962                         if (tmp == NULL) goto failed;
3963                         if (!PyList_Check(tmp)) {
3964                                 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
3965                                 goto failed;
3966                         }
3967                         len = PyList_GET_SIZE(tmp);
3968                         orelse = asdl_seq_new(len, arena);
3969                         if (orelse == NULL) goto failed;
3970                         for (i = 0; i < len; i++) {
3971                                 stmt_ty value;
3972                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
3973                                 if (res != 0) goto failed;
3974                                 asdl_seq_SET(orelse, i, value);
3975                         }
3976                         Py_XDECREF(tmp);
3977                         tmp = NULL;
3978                 } else {
3979                         PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
3980                         return 1;
3981                 }
3982                 *out = For(target, iter, body, orelse, lineno, col_offset,
3983                            arena);
3984                 if (*out == NULL) goto failed;
3985                 return 0;
3986         }
3987         isinstance = PyObject_IsInstance(obj, (PyObject*)While_type);
3988         if (isinstance == -1) {
3989                 return 1;
3990         }
3991         if (isinstance) {
3992                 expr_ty test;
3993                 asdl_seq* body;
3994                 asdl_seq* orelse;
3995
3996                 if (PyObject_HasAttrString(obj, "test")) {
3997                         int res;
3998                         tmp = PyObject_GetAttrString(obj, "test");
3999                         if (tmp == NULL) goto failed;
4000                         res = obj2ast_expr(tmp, &test, arena);
4001                         if (res != 0) goto failed;
4002                         Py_XDECREF(tmp);
4003                         tmp = NULL;
4004                 } else {
4005                         PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
4006                         return 1;
4007                 }
4008                 if (PyObject_HasAttrString(obj, "body")) {
4009                         int res;
4010                         Py_ssize_t len;
4011                         Py_ssize_t i;
4012                         tmp = PyObject_GetAttrString(obj, "body");
4013                         if (tmp == NULL) goto failed;
4014                         if (!PyList_Check(tmp)) {
4015                                 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4016                                 goto failed;
4017                         }
4018                         len = PyList_GET_SIZE(tmp);
4019                         body = asdl_seq_new(len, arena);
4020                         if (body == NULL) goto failed;
4021                         for (i = 0; i < len; i++) {
4022                                 stmt_ty value;
4023                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4024                                 if (res != 0) goto failed;
4025                                 asdl_seq_SET(body, i, value);
4026                         }
4027                         Py_XDECREF(tmp);
4028                         tmp = NULL;
4029                 } else {
4030                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
4031                         return 1;
4032                 }
4033                 if (PyObject_HasAttrString(obj, "orelse")) {
4034                         int res;
4035                         Py_ssize_t len;
4036                         Py_ssize_t i;
4037                         tmp = PyObject_GetAttrString(obj, "orelse");
4038                         if (tmp == NULL) goto failed;
4039                         if (!PyList_Check(tmp)) {
4040                                 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4041                                 goto failed;
4042                         }
4043                         len = PyList_GET_SIZE(tmp);
4044                         orelse = asdl_seq_new(len, arena);
4045                         if (orelse == NULL) goto failed;
4046                         for (i = 0; i < len; i++) {
4047                                 stmt_ty value;
4048                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4049                                 if (res != 0) goto failed;
4050                                 asdl_seq_SET(orelse, i, value);
4051                         }
4052                         Py_XDECREF(tmp);
4053                         tmp = NULL;
4054                 } else {
4055                         PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
4056                         return 1;
4057                 }
4058                 *out = While(test, body, orelse, lineno, col_offset, arena);
4059                 if (*out == NULL) goto failed;
4060                 return 0;
4061         }
4062         isinstance = PyObject_IsInstance(obj, (PyObject*)If_type);
4063         if (isinstance == -1) {
4064                 return 1;
4065         }
4066         if (isinstance) {
4067                 expr_ty test;
4068                 asdl_seq* body;
4069                 asdl_seq* orelse;
4070
4071                 if (PyObject_HasAttrString(obj, "test")) {
4072                         int res;
4073                         tmp = PyObject_GetAttrString(obj, "test");
4074                         if (tmp == NULL) goto failed;
4075                         res = obj2ast_expr(tmp, &test, arena);
4076                         if (res != 0) goto failed;
4077                         Py_XDECREF(tmp);
4078                         tmp = NULL;
4079                 } else {
4080                         PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
4081                         return 1;
4082                 }
4083                 if (PyObject_HasAttrString(obj, "body")) {
4084                         int res;
4085                         Py_ssize_t len;
4086                         Py_ssize_t i;
4087                         tmp = PyObject_GetAttrString(obj, "body");
4088                         if (tmp == NULL) goto failed;
4089                         if (!PyList_Check(tmp)) {
4090                                 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4091                                 goto failed;
4092                         }
4093                         len = PyList_GET_SIZE(tmp);
4094                         body = asdl_seq_new(len, arena);
4095                         if (body == NULL) goto failed;
4096                         for (i = 0; i < len; i++) {
4097                                 stmt_ty value;
4098                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4099                                 if (res != 0) goto failed;
4100                                 asdl_seq_SET(body, i, value);
4101                         }
4102                         Py_XDECREF(tmp);
4103                         tmp = NULL;
4104                 } else {
4105                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
4106                         return 1;
4107                 }
4108                 if (PyObject_HasAttrString(obj, "orelse")) {
4109                         int res;
4110                         Py_ssize_t len;
4111                         Py_ssize_t i;
4112                         tmp = PyObject_GetAttrString(obj, "orelse");
4113                         if (tmp == NULL) goto failed;
4114                         if (!PyList_Check(tmp)) {
4115                                 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4116                                 goto failed;
4117                         }
4118                         len = PyList_GET_SIZE(tmp);
4119                         orelse = asdl_seq_new(len, arena);
4120                         if (orelse == NULL) goto failed;
4121                         for (i = 0; i < len; i++) {
4122                                 stmt_ty value;
4123                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4124                                 if (res != 0) goto failed;
4125                                 asdl_seq_SET(orelse, i, value);
4126                         }
4127                         Py_XDECREF(tmp);
4128                         tmp = NULL;
4129                 } else {
4130                         PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
4131                         return 1;
4132                 }
4133                 *out = If(test, body, orelse, lineno, col_offset, arena);
4134                 if (*out == NULL) goto failed;
4135                 return 0;
4136         }
4137         isinstance = PyObject_IsInstance(obj, (PyObject*)With_type);
4138         if (isinstance == -1) {
4139                 return 1;
4140         }
4141         if (isinstance) {
4142                 expr_ty context_expr;
4143                 expr_ty optional_vars;
4144                 asdl_seq* body;
4145
4146                 if (PyObject_HasAttrString(obj, "context_expr")) {
4147                         int res;
4148                         tmp = PyObject_GetAttrString(obj, "context_expr");
4149                         if (tmp == NULL) goto failed;
4150                         res = obj2ast_expr(tmp, &context_expr, arena);
4151                         if (res != 0) goto failed;
4152                         Py_XDECREF(tmp);
4153                         tmp = NULL;
4154                 } else {
4155                         PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from With");
4156                         return 1;
4157                 }
4158                 if (PyObject_HasAttrString(obj, "optional_vars")) {
4159                         int res;
4160                         tmp = PyObject_GetAttrString(obj, "optional_vars");
4161                         if (tmp == NULL) goto failed;
4162                         res = obj2ast_expr(tmp, &optional_vars, arena);
4163                         if (res != 0) goto failed;
4164                         Py_XDECREF(tmp);
4165                         tmp = NULL;
4166                 } else {
4167                         optional_vars = NULL;
4168                 }
4169                 if (PyObject_HasAttrString(obj, "body")) {
4170                         int res;
4171                         Py_ssize_t len;
4172                         Py_ssize_t i;
4173                         tmp = PyObject_GetAttrString(obj, "body");
4174                         if (tmp == NULL) goto failed;
4175                         if (!PyList_Check(tmp)) {
4176                                 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4177                                 goto failed;
4178                         }
4179                         len = PyList_GET_SIZE(tmp);
4180                         body = asdl_seq_new(len, arena);
4181                         if (body == NULL) goto failed;
4182                         for (i = 0; i < len; i++) {
4183                                 stmt_ty value;
4184                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4185                                 if (res != 0) goto failed;
4186                                 asdl_seq_SET(body, i, value);
4187                         }
4188                         Py_XDECREF(tmp);
4189                         tmp = NULL;
4190                 } else {
4191                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
4192                         return 1;
4193                 }
4194                 *out = With(context_expr, optional_vars, body, lineno,
4195                             col_offset, arena);
4196                 if (*out == NULL) goto failed;
4197                 return 0;
4198         }
4199         isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type);
4200         if (isinstance == -1) {
4201                 return 1;
4202         }
4203         if (isinstance) {
4204                 expr_ty type;
4205                 expr_ty inst;
4206                 expr_ty tback;
4207
4208                 if (PyObject_HasAttrString(obj, "type")) {
4209                         int res;
4210                         tmp = PyObject_GetAttrString(obj, "type");
4211                         if (tmp == NULL) goto failed;
4212                         res = obj2ast_expr(tmp, &type, arena);
4213                         if (res != 0) goto failed;
4214                         Py_XDECREF(tmp);
4215                         tmp = NULL;
4216                 } else {
4217                         type = NULL;
4218                 }
4219                 if (PyObject_HasAttrString(obj, "inst")) {
4220                         int res;
4221                         tmp = PyObject_GetAttrString(obj, "inst");
4222                         if (tmp == NULL) goto failed;
4223                         res = obj2ast_expr(tmp, &inst, arena);
4224                         if (res != 0) goto failed;
4225                         Py_XDECREF(tmp);
4226                         tmp = NULL;
4227                 } else {
4228                         inst = NULL;
4229                 }
4230                 if (PyObject_HasAttrString(obj, "tback")) {
4231                         int res;
4232                         tmp = PyObject_GetAttrString(obj, "tback");
4233                         if (tmp == NULL) goto failed;
4234                         res = obj2ast_expr(tmp, &tback, arena);
4235                         if (res != 0) goto failed;
4236                         Py_XDECREF(tmp);
4237                         tmp = NULL;
4238                 } else {
4239                         tback = NULL;
4240                 }
4241                 *out = Raise(type, inst, tback, lineno, col_offset, arena);
4242                 if (*out == NULL) goto failed;
4243                 return 0;
4244         }
4245         isinstance = PyObject_IsInstance(obj, (PyObject*)TryExcept_type);
4246         if (isinstance == -1) {
4247                 return 1;
4248         }
4249         if (isinstance) {
4250                 asdl_seq* body;
4251                 asdl_seq* handlers;
4252                 asdl_seq* orelse;
4253
4254                 if (PyObject_HasAttrString(obj, "body")) {
4255                         int res;
4256                         Py_ssize_t len;
4257                         Py_ssize_t i;
4258                         tmp = PyObject_GetAttrString(obj, "body");
4259                         if (tmp == NULL) goto failed;
4260                         if (!PyList_Check(tmp)) {
4261                                 PyErr_Format(PyExc_TypeError, "TryExcept field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4262                                 goto failed;
4263                         }
4264                         len = PyList_GET_SIZE(tmp);
4265                         body = asdl_seq_new(len, arena);
4266                         if (body == NULL) goto failed;
4267                         for (i = 0; i < len; i++) {
4268                                 stmt_ty value;
4269                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4270                                 if (res != 0) goto failed;
4271                                 asdl_seq_SET(body, i, value);
4272                         }
4273                         Py_XDECREF(tmp);
4274                         tmp = NULL;
4275                 } else {
4276                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryExcept");
4277                         return 1;
4278                 }
4279                 if (PyObject_HasAttrString(obj, "handlers")) {
4280                         int res;
4281                         Py_ssize_t len;
4282                         Py_ssize_t i;
4283                         tmp = PyObject_GetAttrString(obj, "handlers");
4284                         if (tmp == NULL) goto failed;
4285                         if (!PyList_Check(tmp)) {
4286                                 PyErr_Format(PyExc_TypeError, "TryExcept field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4287                                 goto failed;
4288                         }
4289                         len = PyList_GET_SIZE(tmp);
4290                         handlers = asdl_seq_new(len, arena);
4291                         if (handlers == NULL) goto failed;
4292                         for (i = 0; i < len; i++) {
4293                                 excepthandler_ty value;
4294                                 res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &value, arena);
4295                                 if (res != 0) goto failed;
4296                                 asdl_seq_SET(handlers, i, value);
4297                         }
4298                         Py_XDECREF(tmp);
4299                         tmp = NULL;
4300                 } else {
4301                         PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from TryExcept");
4302                         return 1;
4303                 }
4304                 if (PyObject_HasAttrString(obj, "orelse")) {
4305                         int res;
4306                         Py_ssize_t len;
4307                         Py_ssize_t i;
4308                         tmp = PyObject_GetAttrString(obj, "orelse");
4309                         if (tmp == NULL) goto failed;
4310                         if (!PyList_Check(tmp)) {
4311                                 PyErr_Format(PyExc_TypeError, "TryExcept field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4312                                 goto failed;
4313                         }
4314                         len = PyList_GET_SIZE(tmp);
4315                         orelse = asdl_seq_new(len, arena);
4316                         if (orelse == NULL) goto failed;
4317                         for (i = 0; i < len; i++) {
4318                                 stmt_ty value;
4319                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4320                                 if (res != 0) goto failed;
4321                                 asdl_seq_SET(orelse, i, value);
4322                         }
4323                         Py_XDECREF(tmp);
4324                         tmp = NULL;
4325                 } else {
4326                         PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from TryExcept");
4327                         return 1;
4328                 }
4329                 *out = TryExcept(body, handlers, orelse, lineno, col_offset,
4330                                  arena);
4331                 if (*out == NULL) goto failed;
4332                 return 0;
4333         }
4334         isinstance = PyObject_IsInstance(obj, (PyObject*)TryFinally_type);
4335         if (isinstance == -1) {
4336                 return 1;
4337         }
4338         if (isinstance) {
4339                 asdl_seq* body;
4340                 asdl_seq* finalbody;
4341
4342                 if (PyObject_HasAttrString(obj, "body")) {
4343                         int res;
4344                         Py_ssize_t len;
4345                         Py_ssize_t i;
4346                         tmp = PyObject_GetAttrString(obj, "body");
4347                         if (tmp == NULL) goto failed;
4348                         if (!PyList_Check(tmp)) {
4349                                 PyErr_Format(PyExc_TypeError, "TryFinally field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4350                                 goto failed;
4351                         }
4352                         len = PyList_GET_SIZE(tmp);
4353                         body = asdl_seq_new(len, arena);
4354                         if (body == NULL) goto failed;
4355                         for (i = 0; i < len; i++) {
4356                                 stmt_ty value;
4357                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4358                                 if (res != 0) goto failed;
4359                                 asdl_seq_SET(body, i, value);
4360                         }
4361                         Py_XDECREF(tmp);
4362                         tmp = NULL;
4363                 } else {
4364                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryFinally");
4365                         return 1;
4366                 }
4367                 if (PyObject_HasAttrString(obj, "finalbody")) {
4368                         int res;
4369                         Py_ssize_t len;
4370                         Py_ssize_t i;
4371                         tmp = PyObject_GetAttrString(obj, "finalbody");
4372                         if (tmp == NULL) goto failed;
4373                         if (!PyList_Check(tmp)) {
4374                                 PyErr_Format(PyExc_TypeError, "TryFinally field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4375                                 goto failed;
4376                         }
4377                         len = PyList_GET_SIZE(tmp);
4378                         finalbody = asdl_seq_new(len, arena);
4379                         if (finalbody == NULL) goto failed;
4380                         for (i = 0; i < len; i++) {
4381                                 stmt_ty value;
4382                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
4383                                 if (res != 0) goto failed;
4384                                 asdl_seq_SET(finalbody, i, value);
4385                         }
4386                         Py_XDECREF(tmp);
4387                         tmp = NULL;
4388                 } else {
4389                         PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from TryFinally");
4390                         return 1;
4391                 }
4392                 *out = TryFinally(body, finalbody, lineno, col_offset, arena);
4393                 if (*out == NULL) goto failed;
4394                 return 0;
4395         }
4396         isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type);
4397         if (isinstance == -1) {
4398                 return 1;
4399         }
4400         if (isinstance) {
4401                 expr_ty test;
4402                 expr_ty msg;
4403
4404                 if (PyObject_HasAttrString(obj, "test")) {
4405                         int res;
4406                         tmp = PyObject_GetAttrString(obj, "test");
4407                         if (tmp == NULL) goto failed;
4408                         res = obj2ast_expr(tmp, &test, arena);
4409                         if (res != 0) goto failed;
4410                         Py_XDECREF(tmp);
4411                         tmp = NULL;
4412                 } else {
4413                         PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
4414                         return 1;
4415                 }
4416                 if (PyObject_HasAttrString(obj, "msg")) {
4417                         int res;
4418                         tmp = PyObject_GetAttrString(obj, "msg");
4419                         if (tmp == NULL) goto failed;
4420                         res = obj2ast_expr(tmp, &msg, arena);
4421                         if (res != 0) goto failed;
4422                         Py_XDECREF(tmp);
4423                         tmp = NULL;
4424                 } else {
4425                         msg = NULL;
4426                 }
4427                 *out = Assert(test, msg, lineno, col_offset, arena);
4428                 if (*out == NULL) goto failed;
4429                 return 0;
4430         }
4431         isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type);
4432         if (isinstance == -1) {
4433                 return 1;
4434         }
4435         if (isinstance) {
4436                 asdl_seq* names;
4437
4438                 if (PyObject_HasAttrString(obj, "names")) {
4439                         int res;
4440                         Py_ssize_t len;
4441                         Py_ssize_t i;
4442                         tmp = PyObject_GetAttrString(obj, "names");
4443                         if (tmp == NULL) goto failed;
4444                         if (!PyList_Check(tmp)) {
4445                                 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4446                                 goto failed;
4447                         }
4448                         len = PyList_GET_SIZE(tmp);
4449                         names = asdl_seq_new(len, arena);
4450                         if (names == NULL) goto failed;
4451                         for (i = 0; i < len; i++) {
4452                                 alias_ty value;
4453                                 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
4454                                 if (res != 0) goto failed;
4455                                 asdl_seq_SET(names, i, value);
4456                         }
4457                         Py_XDECREF(tmp);
4458                         tmp = NULL;
4459                 } else {
4460                         PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
4461                         return 1;
4462                 }
4463                 *out = Import(names, lineno, col_offset, arena);
4464                 if (*out == NULL) goto failed;
4465                 return 0;
4466         }
4467         isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type);
4468         if (isinstance == -1) {
4469                 return 1;
4470         }
4471         if (isinstance) {
4472                 identifier module;
4473                 asdl_seq* names;
4474                 int level;
4475
4476                 if (PyObject_HasAttrString(obj, "module")) {
4477                         int res;
4478                         tmp = PyObject_GetAttrString(obj, "module");
4479                         if (tmp == NULL) goto failed;
4480                         res = obj2ast_identifier(tmp, &module, arena);
4481                         if (res != 0) goto failed;
4482                         Py_XDECREF(tmp);
4483                         tmp = NULL;
4484                 } else {
4485                         module = NULL;
4486                 }
4487                 if (PyObject_HasAttrString(obj, "names")) {
4488                         int res;
4489                         Py_ssize_t len;
4490                         Py_ssize_t i;
4491                         tmp = PyObject_GetAttrString(obj, "names");
4492                         if (tmp == NULL) goto failed;
4493                         if (!PyList_Check(tmp)) {
4494                                 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4495                                 goto failed;
4496                         }
4497                         len = PyList_GET_SIZE(tmp);
4498                         names = asdl_seq_new(len, arena);
4499                         if (names == NULL) goto failed;
4500                         for (i = 0; i < len; i++) {
4501                                 alias_ty value;
4502                                 res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
4503                                 if (res != 0) goto failed;
4504                                 asdl_seq_SET(names, i, value);
4505                         }
4506                         Py_XDECREF(tmp);
4507                         tmp = NULL;
4508                 } else {
4509                         PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
4510                         return 1;
4511                 }
4512                 if (PyObject_HasAttrString(obj, "level")) {
4513                         int res;
4514                         tmp = PyObject_GetAttrString(obj, "level");
4515                         if (tmp == NULL) goto failed;
4516                         res = obj2ast_int(tmp, &level, arena);
4517                         if (res != 0) goto failed;
4518                         Py_XDECREF(tmp);
4519                         tmp = NULL;
4520                 } else {
4521                         level = 0;
4522                 }
4523                 *out = ImportFrom(module, names, level, lineno, col_offset,
4524                                   arena);
4525                 if (*out == NULL) goto failed;
4526                 return 0;
4527         }
4528         isinstance = PyObject_IsInstance(obj, (PyObject*)Exec_type);
4529         if (isinstance == -1) {
4530                 return 1;
4531         }
4532         if (isinstance) {
4533                 expr_ty body;
4534                 expr_ty globals;
4535                 expr_ty locals;
4536
4537                 if (PyObject_HasAttrString(obj, "body")) {
4538                         int res;
4539                         tmp = PyObject_GetAttrString(obj, "body");
4540                         if (tmp == NULL) goto failed;
4541                         res = obj2ast_expr(tmp, &body, arena);
4542                         if (res != 0) goto failed;
4543                         Py_XDECREF(tmp);
4544                         tmp = NULL;
4545                 } else {
4546                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Exec");
4547                         return 1;
4548                 }
4549                 if (PyObject_HasAttrString(obj, "globals")) {
4550                         int res;
4551                         tmp = PyObject_GetAttrString(obj, "globals");
4552                         if (tmp == NULL) goto failed;
4553                         res = obj2ast_expr(tmp, &globals, arena);
4554                         if (res != 0) goto failed;
4555                         Py_XDECREF(tmp);
4556                         tmp = NULL;
4557                 } else {
4558                         globals = NULL;
4559                 }
4560                 if (PyObject_HasAttrString(obj, "locals")) {
4561                         int res;
4562                         tmp = PyObject_GetAttrString(obj, "locals");
4563                         if (tmp == NULL) goto failed;
4564                         res = obj2ast_expr(tmp, &locals, arena);
4565                         if (res != 0) goto failed;
4566                         Py_XDECREF(tmp);
4567                         tmp = NULL;
4568                 } else {
4569                         locals = NULL;
4570                 }
4571                 *out = Exec(body, globals, locals, lineno, col_offset, arena);
4572                 if (*out == NULL) goto failed;
4573                 return 0;
4574         }
4575         isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type);
4576         if (isinstance == -1) {
4577                 return 1;
4578         }
4579         if (isinstance) {
4580                 asdl_seq* names;
4581
4582                 if (PyObject_HasAttrString(obj, "names")) {
4583                         int res;
4584                         Py_ssize_t len;
4585                         Py_ssize_t i;
4586                         tmp = PyObject_GetAttrString(obj, "names");
4587                         if (tmp == NULL) goto failed;
4588                         if (!PyList_Check(tmp)) {
4589                                 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4590                                 goto failed;
4591                         }
4592                         len = PyList_GET_SIZE(tmp);
4593                         names = asdl_seq_new(len, arena);
4594                         if (names == NULL) goto failed;
4595                         for (i = 0; i < len; i++) {
4596                                 identifier value;
4597                                 res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &value, arena);
4598                                 if (res != 0) goto failed;
4599                                 asdl_seq_SET(names, i, value);
4600                         }
4601                         Py_XDECREF(tmp);
4602                         tmp = NULL;
4603                 } else {
4604                         PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
4605                         return 1;
4606                 }
4607                 *out = Global(names, lineno, col_offset, arena);
4608                 if (*out == NULL) goto failed;
4609                 return 0;
4610         }
4611         isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type);
4612         if (isinstance == -1) {
4613                 return 1;
4614         }
4615         if (isinstance) {
4616                 expr_ty value;
4617
4618                 if (PyObject_HasAttrString(obj, "value")) {
4619                         int res;
4620                         tmp = PyObject_GetAttrString(obj, "value");
4621                         if (tmp == NULL) goto failed;
4622                         res = obj2ast_expr(tmp, &value, arena);
4623                         if (res != 0) goto failed;
4624                         Py_XDECREF(tmp);
4625                         tmp = NULL;
4626                 } else {
4627                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
4628                         return 1;
4629                 }
4630                 *out = Expr(value, lineno, col_offset, arena);
4631                 if (*out == NULL) goto failed;
4632                 return 0;
4633         }
4634         isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type);
4635         if (isinstance == -1) {
4636                 return 1;
4637         }
4638         if (isinstance) {
4639
4640                 *out = Pass(lineno, col_offset, arena);
4641                 if (*out == NULL) goto failed;
4642                 return 0;
4643         }
4644         isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type);
4645         if (isinstance == -1) {
4646                 return 1;
4647         }
4648         if (isinstance) {
4649
4650                 *out = Break(lineno, col_offset, arena);
4651                 if (*out == NULL) goto failed;
4652                 return 0;
4653         }
4654         isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type);
4655         if (isinstance == -1) {
4656                 return 1;
4657         }
4658         if (isinstance) {
4659
4660                 *out = Continue(lineno, col_offset, arena);
4661                 if (*out == NULL) goto failed;
4662                 return 0;
4663         }
4664
4665         tmp = PyObject_Repr(obj);
4666         if (tmp == NULL) goto failed;
4667         PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %.400s", PyString_AS_STRING(tmp));
4668 failed:
4669         Py_XDECREF(tmp);
4670         return 1;
4671 }
4672
4673 int
4674 obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
4675 {
4676         PyObject* tmp = NULL;
4677         int isinstance;
4678
4679         int lineno;
4680         int col_offset;
4681
4682         if (obj == Py_None) {
4683                 *out = NULL;
4684                 return 0;
4685         }
4686         if (PyObject_HasAttrString(obj, "lineno")) {
4687                 int res;
4688                 tmp = PyObject_GetAttrString(obj, "lineno");
4689                 if (tmp == NULL) goto failed;
4690                 res = obj2ast_int(tmp, &lineno, arena);
4691                 if (res != 0) goto failed;
4692                 Py_XDECREF(tmp);
4693                 tmp = NULL;
4694         } else {
4695                 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
4696                 return 1;
4697         }
4698         if (PyObject_HasAttrString(obj, "col_offset")) {
4699                 int res;
4700                 tmp = PyObject_GetAttrString(obj, "col_offset");
4701                 if (tmp == NULL) goto failed;
4702                 res = obj2ast_int(tmp, &col_offset, arena);
4703                 if (res != 0) goto failed;
4704                 Py_XDECREF(tmp);
4705                 tmp = NULL;
4706         } else {
4707                 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
4708                 return 1;
4709         }
4710         isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type);
4711         if (isinstance == -1) {
4712                 return 1;
4713         }
4714         if (isinstance) {
4715                 boolop_ty op;
4716                 asdl_seq* values;
4717
4718                 if (PyObject_HasAttrString(obj, "op")) {
4719                         int res;
4720                         tmp = PyObject_GetAttrString(obj, "op");
4721                         if (tmp == NULL) goto failed;
4722                         res = obj2ast_boolop(tmp, &op, arena);
4723                         if (res != 0) goto failed;
4724                         Py_XDECREF(tmp);
4725                         tmp = NULL;
4726                 } else {
4727                         PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
4728                         return 1;
4729                 }
4730                 if (PyObject_HasAttrString(obj, "values")) {
4731                         int res;
4732                         Py_ssize_t len;
4733                         Py_ssize_t i;
4734                         tmp = PyObject_GetAttrString(obj, "values");
4735                         if (tmp == NULL) goto failed;
4736                         if (!PyList_Check(tmp)) {
4737                                 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4738                                 goto failed;
4739                         }
4740                         len = PyList_GET_SIZE(tmp);
4741                         values = asdl_seq_new(len, arena);
4742                         if (values == NULL) goto failed;
4743                         for (i = 0; i < len; i++) {
4744                                 expr_ty value;
4745                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
4746                                 if (res != 0) goto failed;
4747                                 asdl_seq_SET(values, i, value);
4748                         }
4749                         Py_XDECREF(tmp);
4750                         tmp = NULL;
4751                 } else {
4752                         PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
4753                         return 1;
4754                 }
4755                 *out = BoolOp(op, values, lineno, col_offset, arena);
4756                 if (*out == NULL) goto failed;
4757                 return 0;
4758         }
4759         isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type);
4760         if (isinstance == -1) {
4761                 return 1;
4762         }
4763         if (isinstance) {
4764                 expr_ty left;
4765                 operator_ty op;
4766                 expr_ty right;
4767
4768                 if (PyObject_HasAttrString(obj, "left")) {
4769                         int res;
4770                         tmp = PyObject_GetAttrString(obj, "left");
4771                         if (tmp == NULL) goto failed;
4772                         res = obj2ast_expr(tmp, &left, arena);
4773                         if (res != 0) goto failed;
4774                         Py_XDECREF(tmp);
4775                         tmp = NULL;
4776                 } else {
4777                         PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
4778                         return 1;
4779                 }
4780                 if (PyObject_HasAttrString(obj, "op")) {
4781                         int res;
4782                         tmp = PyObject_GetAttrString(obj, "op");
4783                         if (tmp == NULL) goto failed;
4784                         res = obj2ast_operator(tmp, &op, arena);
4785                         if (res != 0) goto failed;
4786                         Py_XDECREF(tmp);
4787                         tmp = NULL;
4788                 } else {
4789                         PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
4790                         return 1;
4791                 }
4792                 if (PyObject_HasAttrString(obj, "right")) {
4793                         int res;
4794                         tmp = PyObject_GetAttrString(obj, "right");
4795                         if (tmp == NULL) goto failed;
4796                         res = obj2ast_expr(tmp, &right, arena);
4797                         if (res != 0) goto failed;
4798                         Py_XDECREF(tmp);
4799                         tmp = NULL;
4800                 } else {
4801                         PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
4802                         return 1;
4803                 }
4804                 *out = BinOp(left, op, right, lineno, col_offset, arena);
4805                 if (*out == NULL) goto failed;
4806                 return 0;
4807         }
4808         isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type);
4809         if (isinstance == -1) {
4810                 return 1;
4811         }
4812         if (isinstance) {
4813                 unaryop_ty op;
4814                 expr_ty operand;
4815
4816                 if (PyObject_HasAttrString(obj, "op")) {
4817                         int res;
4818                         tmp = PyObject_GetAttrString(obj, "op");
4819                         if (tmp == NULL) goto failed;
4820                         res = obj2ast_unaryop(tmp, &op, arena);
4821                         if (res != 0) goto failed;
4822                         Py_XDECREF(tmp);
4823                         tmp = NULL;
4824                 } else {
4825                         PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
4826                         return 1;
4827                 }
4828                 if (PyObject_HasAttrString(obj, "operand")) {
4829                         int res;
4830                         tmp = PyObject_GetAttrString(obj, "operand");
4831                         if (tmp == NULL) goto failed;
4832                         res = obj2ast_expr(tmp, &operand, arena);
4833                         if (res != 0) goto failed;
4834                         Py_XDECREF(tmp);
4835                         tmp = NULL;
4836                 } else {
4837                         PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
4838                         return 1;
4839                 }
4840                 *out = UnaryOp(op, operand, lineno, col_offset, arena);
4841                 if (*out == NULL) goto failed;
4842                 return 0;
4843         }
4844         isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type);
4845         if (isinstance == -1) {
4846                 return 1;
4847         }
4848         if (isinstance) {
4849                 arguments_ty args;
4850                 expr_ty body;
4851
4852                 if (PyObject_HasAttrString(obj, "args")) {
4853                         int res;
4854                         tmp = PyObject_GetAttrString(obj, "args");
4855                         if (tmp == NULL) goto failed;
4856                         res = obj2ast_arguments(tmp, &args, arena);
4857                         if (res != 0) goto failed;
4858                         Py_XDECREF(tmp);
4859                         tmp = NULL;
4860                 } else {
4861                         PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
4862                         return 1;
4863                 }
4864                 if (PyObject_HasAttrString(obj, "body")) {
4865                         int res;
4866                         tmp = PyObject_GetAttrString(obj, "body");
4867                         if (tmp == NULL) goto failed;
4868                         res = obj2ast_expr(tmp, &body, arena);
4869                         if (res != 0) goto failed;
4870                         Py_XDECREF(tmp);
4871                         tmp = NULL;
4872                 } else {
4873                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
4874                         return 1;
4875                 }
4876                 *out = Lambda(args, body, lineno, col_offset, arena);
4877                 if (*out == NULL) goto failed;
4878                 return 0;
4879         }
4880         isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type);
4881         if (isinstance == -1) {
4882                 return 1;
4883         }
4884         if (isinstance) {
4885                 expr_ty test;
4886                 expr_ty body;
4887                 expr_ty orelse;
4888
4889                 if (PyObject_HasAttrString(obj, "test")) {
4890                         int res;
4891                         tmp = PyObject_GetAttrString(obj, "test");
4892                         if (tmp == NULL) goto failed;
4893                         res = obj2ast_expr(tmp, &test, arena);
4894                         if (res != 0) goto failed;
4895                         Py_XDECREF(tmp);
4896                         tmp = NULL;
4897                 } else {
4898                         PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
4899                         return 1;
4900                 }
4901                 if (PyObject_HasAttrString(obj, "body")) {
4902                         int res;
4903                         tmp = PyObject_GetAttrString(obj, "body");
4904                         if (tmp == NULL) goto failed;
4905                         res = obj2ast_expr(tmp, &body, arena);
4906                         if (res != 0) goto failed;
4907                         Py_XDECREF(tmp);
4908                         tmp = NULL;
4909                 } else {
4910                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
4911                         return 1;
4912                 }
4913                 if (PyObject_HasAttrString(obj, "orelse")) {
4914                         int res;
4915                         tmp = PyObject_GetAttrString(obj, "orelse");
4916                         if (tmp == NULL) goto failed;
4917                         res = obj2ast_expr(tmp, &orelse, arena);
4918                         if (res != 0) goto failed;
4919                         Py_XDECREF(tmp);
4920                         tmp = NULL;
4921                 } else {
4922                         PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
4923                         return 1;
4924                 }
4925                 *out = IfExp(test, body, orelse, lineno, col_offset, arena);
4926                 if (*out == NULL) goto failed;
4927                 return 0;
4928         }
4929         isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type);
4930         if (isinstance == -1) {
4931                 return 1;
4932         }
4933         if (isinstance) {
4934                 asdl_seq* keys;
4935                 asdl_seq* values;
4936
4937                 if (PyObject_HasAttrString(obj, "keys")) {
4938                         int res;
4939                         Py_ssize_t len;
4940                         Py_ssize_t i;
4941                         tmp = PyObject_GetAttrString(obj, "keys");
4942                         if (tmp == NULL) goto failed;
4943                         if (!PyList_Check(tmp)) {
4944                                 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4945                                 goto failed;
4946                         }
4947                         len = PyList_GET_SIZE(tmp);
4948                         keys = asdl_seq_new(len, arena);
4949                         if (keys == NULL) goto failed;
4950                         for (i = 0; i < len; i++) {
4951                                 expr_ty value;
4952                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
4953                                 if (res != 0) goto failed;
4954                                 asdl_seq_SET(keys, i, value);
4955                         }
4956                         Py_XDECREF(tmp);
4957                         tmp = NULL;
4958                 } else {
4959                         PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
4960                         return 1;
4961                 }
4962                 if (PyObject_HasAttrString(obj, "values")) {
4963                         int res;
4964                         Py_ssize_t len;
4965                         Py_ssize_t i;
4966                         tmp = PyObject_GetAttrString(obj, "values");
4967                         if (tmp == NULL) goto failed;
4968                         if (!PyList_Check(tmp)) {
4969                                 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
4970                                 goto failed;
4971                         }
4972                         len = PyList_GET_SIZE(tmp);
4973                         values = asdl_seq_new(len, arena);
4974                         if (values == NULL) goto failed;
4975                         for (i = 0; i < len; i++) {
4976                                 expr_ty value;
4977                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
4978                                 if (res != 0) goto failed;
4979                                 asdl_seq_SET(values, i, value);
4980                         }
4981                         Py_XDECREF(tmp);
4982                         tmp = NULL;
4983                 } else {
4984                         PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
4985                         return 1;
4986                 }
4987                 *out = Dict(keys, values, lineno, col_offset, arena);
4988                 if (*out == NULL) goto failed;
4989                 return 0;
4990         }
4991         isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type);
4992         if (isinstance == -1) {
4993                 return 1;
4994         }
4995         if (isinstance) {
4996                 asdl_seq* elts;
4997
4998                 if (PyObject_HasAttrString(obj, "elts")) {
4999                         int res;
5000                         Py_ssize_t len;
5001                         Py_ssize_t i;
5002                         tmp = PyObject_GetAttrString(obj, "elts");
5003                         if (tmp == NULL) goto failed;
5004                         if (!PyList_Check(tmp)) {
5005                                 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5006                                 goto failed;
5007                         }
5008                         len = PyList_GET_SIZE(tmp);
5009                         elts = asdl_seq_new(len, arena);
5010                         if (elts == NULL) goto failed;
5011                         for (i = 0; i < len; i++) {
5012                                 expr_ty value;
5013                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5014                                 if (res != 0) goto failed;
5015                                 asdl_seq_SET(elts, i, value);
5016                         }
5017                         Py_XDECREF(tmp);
5018                         tmp = NULL;
5019                 } else {
5020                         PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
5021                         return 1;
5022                 }
5023                 *out = Set(elts, lineno, col_offset, arena);
5024                 if (*out == NULL) goto failed;
5025                 return 0;
5026         }
5027         isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type);
5028         if (isinstance == -1) {
5029                 return 1;
5030         }
5031         if (isinstance) {
5032                 expr_ty elt;
5033                 asdl_seq* generators;
5034
5035                 if (PyObject_HasAttrString(obj, "elt")) {
5036                         int res;
5037                         tmp = PyObject_GetAttrString(obj, "elt");
5038                         if (tmp == NULL) goto failed;
5039                         res = obj2ast_expr(tmp, &elt, arena);
5040                         if (res != 0) goto failed;
5041                         Py_XDECREF(tmp);
5042                         tmp = NULL;
5043                 } else {
5044                         PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
5045                         return 1;
5046                 }
5047                 if (PyObject_HasAttrString(obj, "generators")) {
5048                         int res;
5049                         Py_ssize_t len;
5050                         Py_ssize_t i;
5051                         tmp = PyObject_GetAttrString(obj, "generators");
5052                         if (tmp == NULL) goto failed;
5053                         if (!PyList_Check(tmp)) {
5054                                 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5055                                 goto failed;
5056                         }
5057                         len = PyList_GET_SIZE(tmp);
5058                         generators = asdl_seq_new(len, arena);
5059                         if (generators == NULL) goto failed;
5060                         for (i = 0; i < len; i++) {
5061                                 comprehension_ty value;
5062                                 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5063                                 if (res != 0) goto failed;
5064                                 asdl_seq_SET(generators, i, value);
5065                         }
5066                         Py_XDECREF(tmp);
5067                         tmp = NULL;
5068                 } else {
5069                         PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
5070                         return 1;
5071                 }
5072                 *out = ListComp(elt, generators, lineno, col_offset, arena);
5073                 if (*out == NULL) goto failed;
5074                 return 0;
5075         }
5076         isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type);
5077         if (isinstance == -1) {
5078                 return 1;
5079         }
5080         if (isinstance) {
5081                 expr_ty elt;
5082                 asdl_seq* generators;
5083
5084                 if (PyObject_HasAttrString(obj, "elt")) {
5085                         int res;
5086                         tmp = PyObject_GetAttrString(obj, "elt");
5087                         if (tmp == NULL) goto failed;
5088                         res = obj2ast_expr(tmp, &elt, arena);
5089                         if (res != 0) goto failed;
5090                         Py_XDECREF(tmp);
5091                         tmp = NULL;
5092                 } else {
5093                         PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
5094                         return 1;
5095                 }
5096                 if (PyObject_HasAttrString(obj, "generators")) {
5097                         int res;
5098                         Py_ssize_t len;
5099                         Py_ssize_t i;
5100                         tmp = PyObject_GetAttrString(obj, "generators");
5101                         if (tmp == NULL) goto failed;
5102                         if (!PyList_Check(tmp)) {
5103                                 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5104                                 goto failed;
5105                         }
5106                         len = PyList_GET_SIZE(tmp);
5107                         generators = asdl_seq_new(len, arena);
5108                         if (generators == NULL) goto failed;
5109                         for (i = 0; i < len; i++) {
5110                                 comprehension_ty value;
5111                                 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5112                                 if (res != 0) goto failed;
5113                                 asdl_seq_SET(generators, i, value);
5114                         }
5115                         Py_XDECREF(tmp);
5116                         tmp = NULL;
5117                 } else {
5118                         PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
5119                         return 1;
5120                 }
5121                 *out = SetComp(elt, generators, lineno, col_offset, arena);
5122                 if (*out == NULL) goto failed;
5123                 return 0;
5124         }
5125         isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type);
5126         if (isinstance == -1) {
5127                 return 1;
5128         }
5129         if (isinstance) {
5130                 expr_ty key;
5131                 expr_ty value;
5132                 asdl_seq* generators;
5133
5134                 if (PyObject_HasAttrString(obj, "key")) {
5135                         int res;
5136                         tmp = PyObject_GetAttrString(obj, "key");
5137                         if (tmp == NULL) goto failed;
5138                         res = obj2ast_expr(tmp, &key, arena);
5139                         if (res != 0) goto failed;
5140                         Py_XDECREF(tmp);
5141                         tmp = NULL;
5142                 } else {
5143                         PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
5144                         return 1;
5145                 }
5146                 if (PyObject_HasAttrString(obj, "value")) {
5147                         int res;
5148                         tmp = PyObject_GetAttrString(obj, "value");
5149                         if (tmp == NULL) goto failed;
5150                         res = obj2ast_expr(tmp, &value, arena);
5151                         if (res != 0) goto failed;
5152                         Py_XDECREF(tmp);
5153                         tmp = NULL;
5154                 } else {
5155                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
5156                         return 1;
5157                 }
5158                 if (PyObject_HasAttrString(obj, "generators")) {
5159                         int res;
5160                         Py_ssize_t len;
5161                         Py_ssize_t i;
5162                         tmp = PyObject_GetAttrString(obj, "generators");
5163                         if (tmp == NULL) goto failed;
5164                         if (!PyList_Check(tmp)) {
5165                                 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5166                                 goto failed;
5167                         }
5168                         len = PyList_GET_SIZE(tmp);
5169                         generators = asdl_seq_new(len, arena);
5170                         if (generators == NULL) goto failed;
5171                         for (i = 0; i < len; i++) {
5172                                 comprehension_ty value;
5173                                 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5174                                 if (res != 0) goto failed;
5175                                 asdl_seq_SET(generators, i, value);
5176                         }
5177                         Py_XDECREF(tmp);
5178                         tmp = NULL;
5179                 } else {
5180                         PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
5181                         return 1;
5182                 }
5183                 *out = DictComp(key, value, generators, lineno, col_offset,
5184                                 arena);
5185                 if (*out == NULL) goto failed;
5186                 return 0;
5187         }
5188         isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type);
5189         if (isinstance == -1) {
5190                 return 1;
5191         }
5192         if (isinstance) {
5193                 expr_ty elt;
5194                 asdl_seq* generators;
5195
5196                 if (PyObject_HasAttrString(obj, "elt")) {
5197                         int res;
5198                         tmp = PyObject_GetAttrString(obj, "elt");
5199                         if (tmp == NULL) goto failed;
5200                         res = obj2ast_expr(tmp, &elt, arena);
5201                         if (res != 0) goto failed;
5202                         Py_XDECREF(tmp);
5203                         tmp = NULL;
5204                 } else {
5205                         PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
5206                         return 1;
5207                 }
5208                 if (PyObject_HasAttrString(obj, "generators")) {
5209                         int res;
5210                         Py_ssize_t len;
5211                         Py_ssize_t i;
5212                         tmp = PyObject_GetAttrString(obj, "generators");
5213                         if (tmp == NULL) goto failed;
5214                         if (!PyList_Check(tmp)) {
5215                                 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5216                                 goto failed;
5217                         }
5218                         len = PyList_GET_SIZE(tmp);
5219                         generators = asdl_seq_new(len, arena);
5220                         if (generators == NULL) goto failed;
5221                         for (i = 0; i < len; i++) {
5222                                 comprehension_ty value;
5223                                 res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
5224                                 if (res != 0) goto failed;
5225                                 asdl_seq_SET(generators, i, value);
5226                         }
5227                         Py_XDECREF(tmp);
5228                         tmp = NULL;
5229                 } else {
5230                         PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
5231                         return 1;
5232                 }
5233                 *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
5234                 if (*out == NULL) goto failed;
5235                 return 0;
5236         }
5237         isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type);
5238         if (isinstance == -1) {
5239                 return 1;
5240         }
5241         if (isinstance) {
5242                 expr_ty value;
5243
5244                 if (PyObject_HasAttrString(obj, "value")) {
5245                         int res;
5246                         tmp = PyObject_GetAttrString(obj, "value");
5247                         if (tmp == NULL) goto failed;
5248                         res = obj2ast_expr(tmp, &value, arena);
5249                         if (res != 0) goto failed;
5250                         Py_XDECREF(tmp);
5251                         tmp = NULL;
5252                 } else {
5253                         value = NULL;
5254                 }
5255                 *out = Yield(value, lineno, col_offset, arena);
5256                 if (*out == NULL) goto failed;
5257                 return 0;
5258         }
5259         isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
5260         if (isinstance == -1) {
5261                 return 1;
5262         }
5263         if (isinstance) {
5264                 expr_ty left;
5265                 asdl_int_seq* ops;
5266                 asdl_seq* comparators;
5267
5268                 if (PyObject_HasAttrString(obj, "left")) {
5269                         int res;
5270                         tmp = PyObject_GetAttrString(obj, "left");
5271                         if (tmp == NULL) goto failed;
5272                         res = obj2ast_expr(tmp, &left, arena);
5273                         if (res != 0) goto failed;
5274                         Py_XDECREF(tmp);
5275                         tmp = NULL;
5276                 } else {
5277                         PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
5278                         return 1;
5279                 }
5280                 if (PyObject_HasAttrString(obj, "ops")) {
5281                         int res;
5282                         Py_ssize_t len;
5283                         Py_ssize_t i;
5284                         tmp = PyObject_GetAttrString(obj, "ops");
5285                         if (tmp == NULL) goto failed;
5286                         if (!PyList_Check(tmp)) {
5287                                 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5288                                 goto failed;
5289                         }
5290                         len = PyList_GET_SIZE(tmp);
5291                         ops = asdl_int_seq_new(len, arena);
5292                         if (ops == NULL) goto failed;
5293                         for (i = 0; i < len; i++) {
5294                                 cmpop_ty value;
5295                                 res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &value, arena);
5296                                 if (res != 0) goto failed;
5297                                 asdl_seq_SET(ops, i, value);
5298                         }
5299                         Py_XDECREF(tmp);
5300                         tmp = NULL;
5301                 } else {
5302                         PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
5303                         return 1;
5304                 }
5305                 if (PyObject_HasAttrString(obj, "comparators")) {
5306                         int res;
5307                         Py_ssize_t len;
5308                         Py_ssize_t i;
5309                         tmp = PyObject_GetAttrString(obj, "comparators");
5310                         if (tmp == NULL) goto failed;
5311                         if (!PyList_Check(tmp)) {
5312                                 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5313                                 goto failed;
5314                         }
5315                         len = PyList_GET_SIZE(tmp);
5316                         comparators = asdl_seq_new(len, arena);
5317                         if (comparators == NULL) goto failed;
5318                         for (i = 0; i < len; i++) {
5319                                 expr_ty value;
5320                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5321                                 if (res != 0) goto failed;
5322                                 asdl_seq_SET(comparators, i, value);
5323                         }
5324                         Py_XDECREF(tmp);
5325                         tmp = NULL;
5326                 } else {
5327                         PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
5328                         return 1;
5329                 }
5330                 *out = Compare(left, ops, comparators, lineno, col_offset,
5331                                arena);
5332                 if (*out == NULL) goto failed;
5333                 return 0;
5334         }
5335         isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type);
5336         if (isinstance == -1) {
5337                 return 1;
5338         }
5339         if (isinstance) {
5340                 expr_ty func;
5341                 asdl_seq* args;
5342                 asdl_seq* keywords;
5343                 expr_ty starargs;
5344                 expr_ty kwargs;
5345
5346                 if (PyObject_HasAttrString(obj, "func")) {
5347                         int res;
5348                         tmp = PyObject_GetAttrString(obj, "func");
5349                         if (tmp == NULL) goto failed;
5350                         res = obj2ast_expr(tmp, &func, arena);
5351                         if (res != 0) goto failed;
5352                         Py_XDECREF(tmp);
5353                         tmp = NULL;
5354                 } else {
5355                         PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
5356                         return 1;
5357                 }
5358                 if (PyObject_HasAttrString(obj, "args")) {
5359                         int res;
5360                         Py_ssize_t len;
5361                         Py_ssize_t i;
5362                         tmp = PyObject_GetAttrString(obj, "args");
5363                         if (tmp == NULL) goto failed;
5364                         if (!PyList_Check(tmp)) {
5365                                 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5366                                 goto failed;
5367                         }
5368                         len = PyList_GET_SIZE(tmp);
5369                         args = asdl_seq_new(len, arena);
5370                         if (args == NULL) goto failed;
5371                         for (i = 0; i < len; i++) {
5372                                 expr_ty value;
5373                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5374                                 if (res != 0) goto failed;
5375                                 asdl_seq_SET(args, i, value);
5376                         }
5377                         Py_XDECREF(tmp);
5378                         tmp = NULL;
5379                 } else {
5380                         PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
5381                         return 1;
5382                 }
5383                 if (PyObject_HasAttrString(obj, "keywords")) {
5384                         int res;
5385                         Py_ssize_t len;
5386                         Py_ssize_t i;
5387                         tmp = PyObject_GetAttrString(obj, "keywords");
5388                         if (tmp == NULL) goto failed;
5389                         if (!PyList_Check(tmp)) {
5390                                 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5391                                 goto failed;
5392                         }
5393                         len = PyList_GET_SIZE(tmp);
5394                         keywords = asdl_seq_new(len, arena);
5395                         if (keywords == NULL) goto failed;
5396                         for (i = 0; i < len; i++) {
5397                                 keyword_ty value;
5398                                 res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &value, arena);
5399                                 if (res != 0) goto failed;
5400                                 asdl_seq_SET(keywords, i, value);
5401                         }
5402                         Py_XDECREF(tmp);
5403                         tmp = NULL;
5404                 } else {
5405                         PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
5406                         return 1;
5407                 }
5408                 if (PyObject_HasAttrString(obj, "starargs")) {
5409                         int res;
5410                         tmp = PyObject_GetAttrString(obj, "starargs");
5411                         if (tmp == NULL) goto failed;
5412                         res = obj2ast_expr(tmp, &starargs, arena);
5413                         if (res != 0) goto failed;
5414                         Py_XDECREF(tmp);
5415                         tmp = NULL;
5416                 } else {
5417                         starargs = NULL;
5418                 }
5419                 if (PyObject_HasAttrString(obj, "kwargs")) {
5420                         int res;
5421                         tmp = PyObject_GetAttrString(obj, "kwargs");
5422                         if (tmp == NULL) goto failed;
5423                         res = obj2ast_expr(tmp, &kwargs, arena);
5424                         if (res != 0) goto failed;
5425                         Py_XDECREF(tmp);
5426                         tmp = NULL;
5427                 } else {
5428                         kwargs = NULL;
5429                 }
5430                 *out = Call(func, args, keywords, starargs, kwargs, lineno,
5431                             col_offset, arena);
5432                 if (*out == NULL) goto failed;
5433                 return 0;
5434         }
5435         isinstance = PyObject_IsInstance(obj, (PyObject*)Repr_type);
5436         if (isinstance == -1) {
5437                 return 1;
5438         }
5439         if (isinstance) {
5440                 expr_ty value;
5441
5442                 if (PyObject_HasAttrString(obj, "value")) {
5443                         int res;
5444                         tmp = PyObject_GetAttrString(obj, "value");
5445                         if (tmp == NULL) goto failed;
5446                         res = obj2ast_expr(tmp, &value, arena);
5447                         if (res != 0) goto failed;
5448                         Py_XDECREF(tmp);
5449                         tmp = NULL;
5450                 } else {
5451                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Repr");
5452                         return 1;
5453                 }
5454                 *out = Repr(value, lineno, col_offset, arena);
5455                 if (*out == NULL) goto failed;
5456                 return 0;
5457         }
5458         isinstance = PyObject_IsInstance(obj, (PyObject*)Num_type);
5459         if (isinstance == -1) {
5460                 return 1;
5461         }
5462         if (isinstance) {
5463                 object n;
5464
5465                 if (PyObject_HasAttrString(obj, "n")) {
5466                         int res;
5467                         tmp = PyObject_GetAttrString(obj, "n");
5468                         if (tmp == NULL) goto failed;
5469                         res = obj2ast_object(tmp, &n, arena);
5470                         if (res != 0) goto failed;
5471                         Py_XDECREF(tmp);
5472                         tmp = NULL;
5473                 } else {
5474                         PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
5475                         return 1;
5476                 }
5477                 *out = Num(n, lineno, col_offset, arena);
5478                 if (*out == NULL) goto failed;
5479                 return 0;
5480         }
5481         isinstance = PyObject_IsInstance(obj, (PyObject*)Str_type);
5482         if (isinstance == -1) {
5483                 return 1;
5484         }
5485         if (isinstance) {
5486                 string s;
5487
5488                 if (PyObject_HasAttrString(obj, "s")) {
5489                         int res;
5490                         tmp = PyObject_GetAttrString(obj, "s");
5491                         if (tmp == NULL) goto failed;
5492                         res = obj2ast_string(tmp, &s, arena);
5493                         if (res != 0) goto failed;
5494                         Py_XDECREF(tmp);
5495                         tmp = NULL;
5496                 } else {
5497                         PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
5498                         return 1;
5499                 }
5500                 *out = Str(s, lineno, col_offset, arena);
5501                 if (*out == NULL) goto failed;
5502                 return 0;
5503         }
5504         isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type);
5505         if (isinstance == -1) {
5506                 return 1;
5507         }
5508         if (isinstance) {
5509                 expr_ty value;
5510                 identifier attr;
5511                 expr_context_ty ctx;
5512
5513                 if (PyObject_HasAttrString(obj, "value")) {
5514                         int res;
5515                         tmp = PyObject_GetAttrString(obj, "value");
5516                         if (tmp == NULL) goto failed;
5517                         res = obj2ast_expr(tmp, &value, arena);
5518                         if (res != 0) goto failed;
5519                         Py_XDECREF(tmp);
5520                         tmp = NULL;
5521                 } else {
5522                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
5523                         return 1;
5524                 }
5525                 if (PyObject_HasAttrString(obj, "attr")) {
5526                         int res;
5527                         tmp = PyObject_GetAttrString(obj, "attr");
5528                         if (tmp == NULL) goto failed;
5529                         res = obj2ast_identifier(tmp, &attr, arena);
5530                         if (res != 0) goto failed;
5531                         Py_XDECREF(tmp);
5532                         tmp = NULL;
5533                 } else {
5534                         PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
5535                         return 1;
5536                 }
5537                 if (PyObject_HasAttrString(obj, "ctx")) {
5538                         int res;
5539                         tmp = PyObject_GetAttrString(obj, "ctx");
5540                         if (tmp == NULL) goto failed;
5541                         res = obj2ast_expr_context(tmp, &ctx, arena);
5542                         if (res != 0) goto failed;
5543                         Py_XDECREF(tmp);
5544                         tmp = NULL;
5545                 } else {
5546                         PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
5547                         return 1;
5548                 }
5549                 *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
5550                 if (*out == NULL) goto failed;
5551                 return 0;
5552         }
5553         isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type);
5554         if (isinstance == -1) {
5555                 return 1;
5556         }
5557         if (isinstance) {
5558                 expr_ty value;
5559                 slice_ty slice;
5560                 expr_context_ty ctx;
5561
5562                 if (PyObject_HasAttrString(obj, "value")) {
5563                         int res;
5564                         tmp = PyObject_GetAttrString(obj, "value");
5565                         if (tmp == NULL) goto failed;
5566                         res = obj2ast_expr(tmp, &value, arena);
5567                         if (res != 0) goto failed;
5568                         Py_XDECREF(tmp);
5569                         tmp = NULL;
5570                 } else {
5571                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
5572                         return 1;
5573                 }
5574                 if (PyObject_HasAttrString(obj, "slice")) {
5575                         int res;
5576                         tmp = PyObject_GetAttrString(obj, "slice");
5577                         if (tmp == NULL) goto failed;
5578                         res = obj2ast_slice(tmp, &slice, arena);
5579                         if (res != 0) goto failed;
5580                         Py_XDECREF(tmp);
5581                         tmp = NULL;
5582                 } else {
5583                         PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
5584                         return 1;
5585                 }
5586                 if (PyObject_HasAttrString(obj, "ctx")) {
5587                         int res;
5588                         tmp = PyObject_GetAttrString(obj, "ctx");
5589                         if (tmp == NULL) goto failed;
5590                         res = obj2ast_expr_context(tmp, &ctx, arena);
5591                         if (res != 0) goto failed;
5592                         Py_XDECREF(tmp);
5593                         tmp = NULL;
5594                 } else {
5595                         PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
5596                         return 1;
5597                 }
5598                 *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
5599                 if (*out == NULL) goto failed;
5600                 return 0;
5601         }
5602         isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type);
5603         if (isinstance == -1) {
5604                 return 1;
5605         }
5606         if (isinstance) {
5607                 identifier id;
5608                 expr_context_ty ctx;
5609
5610                 if (PyObject_HasAttrString(obj, "id")) {
5611                         int res;
5612                         tmp = PyObject_GetAttrString(obj, "id");
5613                         if (tmp == NULL) goto failed;
5614                         res = obj2ast_identifier(tmp, &id, arena);
5615                         if (res != 0) goto failed;
5616                         Py_XDECREF(tmp);
5617                         tmp = NULL;
5618                 } else {
5619                         PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
5620                         return 1;
5621                 }
5622                 if (PyObject_HasAttrString(obj, "ctx")) {
5623                         int res;
5624                         tmp = PyObject_GetAttrString(obj, "ctx");
5625                         if (tmp == NULL) goto failed;
5626                         res = obj2ast_expr_context(tmp, &ctx, arena);
5627                         if (res != 0) goto failed;
5628                         Py_XDECREF(tmp);
5629                         tmp = NULL;
5630                 } else {
5631                         PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
5632                         return 1;
5633                 }
5634                 *out = Name(id, ctx, lineno, col_offset, arena);
5635                 if (*out == NULL) goto failed;
5636                 return 0;
5637         }
5638         isinstance = PyObject_IsInstance(obj, (PyObject*)List_type);
5639         if (isinstance == -1) {
5640                 return 1;
5641         }
5642         if (isinstance) {
5643                 asdl_seq* elts;
5644                 expr_context_ty ctx;
5645
5646                 if (PyObject_HasAttrString(obj, "elts")) {
5647                         int res;
5648                         Py_ssize_t len;
5649                         Py_ssize_t i;
5650                         tmp = PyObject_GetAttrString(obj, "elts");
5651                         if (tmp == NULL) goto failed;
5652                         if (!PyList_Check(tmp)) {
5653                                 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5654                                 goto failed;
5655                         }
5656                         len = PyList_GET_SIZE(tmp);
5657                         elts = asdl_seq_new(len, arena);
5658                         if (elts == NULL) goto failed;
5659                         for (i = 0; i < len; i++) {
5660                                 expr_ty value;
5661                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5662                                 if (res != 0) goto failed;
5663                                 asdl_seq_SET(elts, i, value);
5664                         }
5665                         Py_XDECREF(tmp);
5666                         tmp = NULL;
5667                 } else {
5668                         PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
5669                         return 1;
5670                 }
5671                 if (PyObject_HasAttrString(obj, "ctx")) {
5672                         int res;
5673                         tmp = PyObject_GetAttrString(obj, "ctx");
5674                         if (tmp == NULL) goto failed;
5675                         res = obj2ast_expr_context(tmp, &ctx, arena);
5676                         if (res != 0) goto failed;
5677                         Py_XDECREF(tmp);
5678                         tmp = NULL;
5679                 } else {
5680                         PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
5681                         return 1;
5682                 }
5683                 *out = List(elts, ctx, lineno, col_offset, arena);
5684                 if (*out == NULL) goto failed;
5685                 return 0;
5686         }
5687         isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type);
5688         if (isinstance == -1) {
5689                 return 1;
5690         }
5691         if (isinstance) {
5692                 asdl_seq* elts;
5693                 expr_context_ty ctx;
5694
5695                 if (PyObject_HasAttrString(obj, "elts")) {
5696                         int res;
5697                         Py_ssize_t len;
5698                         Py_ssize_t i;
5699                         tmp = PyObject_GetAttrString(obj, "elts");
5700                         if (tmp == NULL) goto failed;
5701                         if (!PyList_Check(tmp)) {
5702                                 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5703                                 goto failed;
5704                         }
5705                         len = PyList_GET_SIZE(tmp);
5706                         elts = asdl_seq_new(len, arena);
5707                         if (elts == NULL) goto failed;
5708                         for (i = 0; i < len; i++) {
5709                                 expr_ty value;
5710                                 res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
5711                                 if (res != 0) goto failed;
5712                                 asdl_seq_SET(elts, i, value);
5713                         }
5714                         Py_XDECREF(tmp);
5715                         tmp = NULL;
5716                 } else {
5717                         PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
5718                         return 1;
5719                 }
5720                 if (PyObject_HasAttrString(obj, "ctx")) {
5721                         int res;
5722                         tmp = PyObject_GetAttrString(obj, "ctx");
5723                         if (tmp == NULL) goto failed;
5724                         res = obj2ast_expr_context(tmp, &ctx, arena);
5725                         if (res != 0) goto failed;
5726                         Py_XDECREF(tmp);
5727                         tmp = NULL;
5728                 } else {
5729                         PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
5730                         return 1;
5731                 }
5732                 *out = Tuple(elts, ctx, lineno, col_offset, arena);
5733                 if (*out == NULL) goto failed;
5734                 return 0;
5735         }
5736
5737         tmp = PyObject_Repr(obj);
5738         if (tmp == NULL) goto failed;
5739         PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %.400s", PyString_AS_STRING(tmp));
5740 failed:
5741         Py_XDECREF(tmp);
5742         return 1;
5743 }
5744
5745 int
5746 obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
5747 {
5748         PyObject* tmp = NULL;
5749         int isinstance;
5750
5751         isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type);
5752         if (isinstance == -1) {
5753                 return 1;
5754         }
5755         if (isinstance) {
5756                 *out = Load;
5757                 return 0;
5758         }
5759         isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type);
5760         if (isinstance == -1) {
5761                 return 1;
5762         }
5763         if (isinstance) {
5764                 *out = Store;
5765                 return 0;
5766         }
5767         isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type);
5768         if (isinstance == -1) {
5769                 return 1;
5770         }
5771         if (isinstance) {
5772                 *out = Del;
5773                 return 0;
5774         }
5775         isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type);
5776         if (isinstance == -1) {
5777                 return 1;
5778         }
5779         if (isinstance) {
5780                 *out = AugLoad;
5781                 return 0;
5782         }
5783         isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type);
5784         if (isinstance == -1) {
5785                 return 1;
5786         }
5787         if (isinstance) {
5788                 *out = AugStore;
5789                 return 0;
5790         }
5791         isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type);
5792         if (isinstance == -1) {
5793                 return 1;
5794         }
5795         if (isinstance) {
5796                 *out = Param;
5797                 return 0;
5798         }
5799
5800         tmp = PyObject_Repr(obj);
5801         if (tmp == NULL) goto failed;
5802         PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %.400s", PyString_AS_STRING(tmp));
5803 failed:
5804         Py_XDECREF(tmp);
5805         return 1;
5806 }
5807
5808 int
5809 obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
5810 {
5811         PyObject* tmp = NULL;
5812         int isinstance;
5813
5814
5815         if (obj == Py_None) {
5816                 *out = NULL;
5817                 return 0;
5818         }
5819         isinstance = PyObject_IsInstance(obj, (PyObject*)Ellipsis_type);
5820         if (isinstance == -1) {
5821                 return 1;
5822         }
5823         if (isinstance) {
5824
5825                 *out = Ellipsis(arena);
5826                 if (*out == NULL) goto failed;
5827                 return 0;
5828         }
5829         isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type);
5830         if (isinstance == -1) {
5831                 return 1;
5832         }
5833         if (isinstance) {
5834                 expr_ty lower;
5835                 expr_ty upper;
5836                 expr_ty step;
5837
5838                 if (PyObject_HasAttrString(obj, "lower")) {
5839                         int res;
5840                         tmp = PyObject_GetAttrString(obj, "lower");
5841                         if (tmp == NULL) goto failed;
5842                         res = obj2ast_expr(tmp, &lower, arena);
5843                         if (res != 0) goto failed;
5844                         Py_XDECREF(tmp);
5845                         tmp = NULL;
5846                 } else {
5847                         lower = NULL;
5848                 }
5849                 if (PyObject_HasAttrString(obj, "upper")) {
5850                         int res;
5851                         tmp = PyObject_GetAttrString(obj, "upper");
5852                         if (tmp == NULL) goto failed;
5853                         res = obj2ast_expr(tmp, &upper, arena);
5854                         if (res != 0) goto failed;
5855                         Py_XDECREF(tmp);
5856                         tmp = NULL;
5857                 } else {
5858                         upper = NULL;
5859                 }
5860                 if (PyObject_HasAttrString(obj, "step")) {
5861                         int res;
5862                         tmp = PyObject_GetAttrString(obj, "step");
5863                         if (tmp == NULL) goto failed;
5864                         res = obj2ast_expr(tmp, &step, arena);
5865                         if (res != 0) goto failed;
5866                         Py_XDECREF(tmp);
5867                         tmp = NULL;
5868                 } else {
5869                         step = NULL;
5870                 }
5871                 *out = Slice(lower, upper, step, arena);
5872                 if (*out == NULL) goto failed;
5873                 return 0;
5874         }
5875         isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type);
5876         if (isinstance == -1) {
5877                 return 1;
5878         }
5879         if (isinstance) {
5880                 asdl_seq* dims;
5881
5882                 if (PyObject_HasAttrString(obj, "dims")) {
5883                         int res;
5884                         Py_ssize_t len;
5885                         Py_ssize_t i;
5886                         tmp = PyObject_GetAttrString(obj, "dims");
5887                         if (tmp == NULL) goto failed;
5888                         if (!PyList_Check(tmp)) {
5889                                 PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
5890                                 goto failed;
5891                         }
5892                         len = PyList_GET_SIZE(tmp);
5893                         dims = asdl_seq_new(len, arena);
5894                         if (dims == NULL) goto failed;
5895                         for (i = 0; i < len; i++) {
5896                                 slice_ty value;
5897                                 res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &value, arena);
5898                                 if (res != 0) goto failed;
5899                                 asdl_seq_SET(dims, i, value);
5900                         }
5901                         Py_XDECREF(tmp);
5902                         tmp = NULL;
5903                 } else {
5904                         PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
5905                         return 1;
5906                 }
5907                 *out = ExtSlice(dims, arena);
5908                 if (*out == NULL) goto failed;
5909                 return 0;
5910         }
5911         isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type);
5912         if (isinstance == -1) {
5913                 return 1;
5914         }
5915         if (isinstance) {
5916                 expr_ty value;
5917
5918                 if (PyObject_HasAttrString(obj, "value")) {
5919                         int res;
5920                         tmp = PyObject_GetAttrString(obj, "value");
5921                         if (tmp == NULL) goto failed;
5922                         res = obj2ast_expr(tmp, &value, arena);
5923                         if (res != 0) goto failed;
5924                         Py_XDECREF(tmp);
5925                         tmp = NULL;
5926                 } else {
5927                         PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
5928                         return 1;
5929                 }
5930                 *out = Index(value, arena);
5931                 if (*out == NULL) goto failed;
5932                 return 0;
5933         }
5934
5935         tmp = PyObject_Repr(obj);
5936         if (tmp == NULL) goto failed;
5937         PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %.400s", PyString_AS_STRING(tmp));
5938 failed:
5939         Py_XDECREF(tmp);
5940         return 1;
5941 }
5942
5943 int
5944 obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
5945 {
5946         PyObject* tmp = NULL;
5947         int isinstance;
5948
5949         isinstance = PyObject_IsInstance(obj, (PyObject *)And_type);
5950         if (isinstance == -1) {
5951                 return 1;
5952         }
5953         if (isinstance) {
5954                 *out = And;
5955                 return 0;
5956         }
5957         isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type);
5958         if (isinstance == -1) {
5959                 return 1;
5960         }
5961         if (isinstance) {
5962                 *out = Or;
5963                 return 0;
5964         }
5965
5966         tmp = PyObject_Repr(obj);
5967         if (tmp == NULL) goto failed;
5968         PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %.400s", PyString_AS_STRING(tmp));
5969 failed:
5970         Py_XDECREF(tmp);
5971         return 1;
5972 }
5973
5974 int
5975 obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
5976 {
5977         PyObject* tmp = NULL;
5978         int isinstance;
5979
5980         isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type);
5981         if (isinstance == -1) {
5982                 return 1;
5983         }
5984         if (isinstance) {
5985                 *out = Add;
5986                 return 0;
5987         }
5988         isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type);
5989         if (isinstance == -1) {
5990                 return 1;
5991         }
5992         if (isinstance) {
5993                 *out = Sub;
5994                 return 0;
5995         }
5996         isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type);
5997         if (isinstance == -1) {
5998                 return 1;
5999         }
6000         if (isinstance) {
6001                 *out = Mult;
6002                 return 0;
6003         }
6004         isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type);
6005         if (isinstance == -1) {
6006                 return 1;
6007         }
6008         if (isinstance) {
6009                 *out = Div;
6010                 return 0;
6011         }
6012         isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type);
6013         if (isinstance == -1) {
6014                 return 1;
6015         }
6016         if (isinstance) {
6017                 *out = Mod;
6018                 return 0;
6019         }
6020         isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type);
6021         if (isinstance == -1) {
6022                 return 1;
6023         }
6024         if (isinstance) {
6025                 *out = Pow;
6026                 return 0;
6027         }
6028         isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type);
6029         if (isinstance == -1) {
6030                 return 1;
6031         }
6032         if (isinstance) {
6033                 *out = LShift;
6034                 return 0;
6035         }
6036         isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type);
6037         if (isinstance == -1) {
6038                 return 1;
6039         }
6040         if (isinstance) {
6041                 *out = RShift;
6042                 return 0;
6043         }
6044         isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type);
6045         if (isinstance == -1) {
6046                 return 1;
6047         }
6048         if (isinstance) {
6049                 *out = BitOr;
6050                 return 0;
6051         }
6052         isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type);
6053         if (isinstance == -1) {
6054                 return 1;
6055         }
6056         if (isinstance) {
6057                 *out = BitXor;
6058                 return 0;
6059         }
6060         isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type);
6061         if (isinstance == -1) {
6062                 return 1;
6063         }
6064         if (isinstance) {
6065                 *out = BitAnd;
6066                 return 0;
6067         }
6068         isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type);
6069         if (isinstance == -1) {
6070                 return 1;
6071         }
6072         if (isinstance) {
6073                 *out = FloorDiv;
6074                 return 0;
6075         }
6076
6077         tmp = PyObject_Repr(obj);
6078         if (tmp == NULL) goto failed;
6079         PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %.400s", PyString_AS_STRING(tmp));
6080 failed:
6081         Py_XDECREF(tmp);
6082         return 1;
6083 }
6084
6085 int
6086 obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
6087 {
6088         PyObject* tmp = NULL;
6089         int isinstance;
6090
6091         isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type);
6092         if (isinstance == -1) {
6093                 return 1;
6094         }
6095         if (isinstance) {
6096                 *out = Invert;
6097                 return 0;
6098         }
6099         isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type);
6100         if (isinstance == -1) {
6101                 return 1;
6102         }
6103         if (isinstance) {
6104                 *out = Not;
6105                 return 0;
6106         }
6107         isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type);
6108         if (isinstance == -1) {
6109                 return 1;
6110         }
6111         if (isinstance) {
6112                 *out = UAdd;
6113                 return 0;
6114         }
6115         isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type);
6116         if (isinstance == -1) {
6117                 return 1;
6118         }
6119         if (isinstance) {
6120                 *out = USub;
6121                 return 0;
6122         }
6123
6124         tmp = PyObject_Repr(obj);
6125         if (tmp == NULL) goto failed;
6126         PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %.400s", PyString_AS_STRING(tmp));
6127 failed:
6128         Py_XDECREF(tmp);
6129         return 1;
6130 }
6131
6132 int
6133 obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
6134 {
6135         PyObject* tmp = NULL;
6136         int isinstance;
6137
6138         isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type);
6139         if (isinstance == -1) {
6140                 return 1;
6141         }
6142         if (isinstance) {
6143                 *out = Eq;
6144                 return 0;
6145         }
6146         isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type);
6147         if (isinstance == -1) {
6148                 return 1;
6149         }
6150         if (isinstance) {
6151                 *out = NotEq;
6152                 return 0;
6153         }
6154         isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type);
6155         if (isinstance == -1) {
6156                 return 1;
6157         }
6158         if (isinstance) {
6159                 *out = Lt;
6160                 return 0;
6161         }
6162         isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type);
6163         if (isinstance == -1) {
6164                 return 1;
6165         }
6166         if (isinstance) {
6167                 *out = LtE;
6168                 return 0;
6169         }
6170         isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type);
6171         if (isinstance == -1) {
6172                 return 1;
6173         }
6174         if (isinstance) {
6175                 *out = Gt;
6176                 return 0;
6177         }
6178         isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type);
6179         if (isinstance == -1) {
6180                 return 1;
6181         }
6182         if (isinstance) {
6183                 *out = GtE;
6184                 return 0;
6185         }
6186         isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type);
6187         if (isinstance == -1) {
6188                 return 1;
6189         }
6190         if (isinstance) {
6191                 *out = Is;
6192                 return 0;
6193         }
6194         isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type);
6195         if (isinstance == -1) {
6196                 return 1;
6197         }
6198         if (isinstance) {
6199                 *out = IsNot;
6200                 return 0;
6201         }
6202         isinstance = PyObject_IsInstance(obj, (PyObject *)In_type);
6203         if (isinstance == -1) {
6204                 return 1;
6205         }
6206         if (isinstance) {
6207                 *out = In;
6208                 return 0;
6209         }
6210         isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type);
6211         if (isinstance == -1) {
6212                 return 1;
6213         }
6214         if (isinstance) {
6215                 *out = NotIn;
6216                 return 0;
6217         }
6218
6219         tmp = PyObject_Repr(obj);
6220         if (tmp == NULL) goto failed;
6221         PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %.400s", PyString_AS_STRING(tmp));
6222 failed:
6223         Py_XDECREF(tmp);
6224         return 1;
6225 }
6226
6227 int
6228 obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
6229 {
6230         PyObject* tmp = NULL;
6231         expr_ty target;
6232         expr_ty iter;
6233         asdl_seq* ifs;
6234
6235         if (PyObject_HasAttrString(obj, "target")) {
6236                 int res;
6237                 tmp = PyObject_GetAttrString(obj, "target");
6238                 if (tmp == NULL) goto failed;
6239                 res = obj2ast_expr(tmp, &target, arena);
6240                 if (res != 0) goto failed;
6241                 Py_XDECREF(tmp);
6242                 tmp = NULL;
6243         } else {
6244                 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
6245                 return 1;
6246         }
6247         if (PyObject_HasAttrString(obj, "iter")) {
6248                 int res;
6249                 tmp = PyObject_GetAttrString(obj, "iter");
6250                 if (tmp == NULL) goto failed;
6251                 res = obj2ast_expr(tmp, &iter, arena);
6252                 if (res != 0) goto failed;
6253                 Py_XDECREF(tmp);
6254                 tmp = NULL;
6255         } else {
6256                 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
6257                 return 1;
6258         }
6259         if (PyObject_HasAttrString(obj, "ifs")) {
6260                 int res;
6261                 Py_ssize_t len;
6262                 Py_ssize_t i;
6263                 tmp = PyObject_GetAttrString(obj, "ifs");
6264                 if (tmp == NULL) goto failed;
6265                 if (!PyList_Check(tmp)) {
6266                         PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6267                         goto failed;
6268                 }
6269                 len = PyList_GET_SIZE(tmp);
6270                 ifs = asdl_seq_new(len, arena);
6271                 if (ifs == NULL) goto failed;
6272                 for (i = 0; i < len; i++) {
6273                         expr_ty value;
6274                         res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6275                         if (res != 0) goto failed;
6276                         asdl_seq_SET(ifs, i, value);
6277                 }
6278                 Py_XDECREF(tmp);
6279                 tmp = NULL;
6280         } else {
6281                 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
6282                 return 1;
6283         }
6284         *out = comprehension(target, iter, ifs, arena);
6285         return 0;
6286 failed:
6287         Py_XDECREF(tmp);
6288         return 1;
6289 }
6290
6291 int
6292 obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
6293 {
6294         PyObject* tmp = NULL;
6295         int isinstance;
6296
6297         int lineno;
6298         int col_offset;
6299
6300         if (obj == Py_None) {
6301                 *out = NULL;
6302                 return 0;
6303         }
6304         if (PyObject_HasAttrString(obj, "lineno")) {
6305                 int res;
6306                 tmp = PyObject_GetAttrString(obj, "lineno");
6307                 if (tmp == NULL) goto failed;
6308                 res = obj2ast_int(tmp, &lineno, arena);
6309                 if (res != 0) goto failed;
6310                 Py_XDECREF(tmp);
6311                 tmp = NULL;
6312         } else {
6313                 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
6314                 return 1;
6315         }
6316         if (PyObject_HasAttrString(obj, "col_offset")) {
6317                 int res;
6318                 tmp = PyObject_GetAttrString(obj, "col_offset");
6319                 if (tmp == NULL) goto failed;
6320                 res = obj2ast_int(tmp, &col_offset, arena);
6321                 if (res != 0) goto failed;
6322                 Py_XDECREF(tmp);
6323                 tmp = NULL;
6324         } else {
6325                 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
6326                 return 1;
6327         }
6328         isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type);
6329         if (isinstance == -1) {
6330                 return 1;
6331         }
6332         if (isinstance) {
6333                 expr_ty type;
6334                 expr_ty name;
6335                 asdl_seq* body;
6336
6337                 if (PyObject_HasAttrString(obj, "type")) {
6338                         int res;
6339                         tmp = PyObject_GetAttrString(obj, "type");
6340                         if (tmp == NULL) goto failed;
6341                         res = obj2ast_expr(tmp, &type, arena);
6342                         if (res != 0) goto failed;
6343                         Py_XDECREF(tmp);
6344                         tmp = NULL;
6345                 } else {
6346                         type = NULL;
6347                 }
6348                 if (PyObject_HasAttrString(obj, "name")) {
6349                         int res;
6350                         tmp = PyObject_GetAttrString(obj, "name");
6351                         if (tmp == NULL) goto failed;
6352                         res = obj2ast_expr(tmp, &name, arena);
6353                         if (res != 0) goto failed;
6354                         Py_XDECREF(tmp);
6355                         tmp = NULL;
6356                 } else {
6357                         name = NULL;
6358                 }
6359                 if (PyObject_HasAttrString(obj, "body")) {
6360                         int res;
6361                         Py_ssize_t len;
6362                         Py_ssize_t i;
6363                         tmp = PyObject_GetAttrString(obj, "body");
6364                         if (tmp == NULL) goto failed;
6365                         if (!PyList_Check(tmp)) {
6366                                 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6367                                 goto failed;
6368                         }
6369                         len = PyList_GET_SIZE(tmp);
6370                         body = asdl_seq_new(len, arena);
6371                         if (body == NULL) goto failed;
6372                         for (i = 0; i < len; i++) {
6373                                 stmt_ty value;
6374                                 res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
6375                                 if (res != 0) goto failed;
6376                                 asdl_seq_SET(body, i, value);
6377                         }
6378                         Py_XDECREF(tmp);
6379                         tmp = NULL;
6380                 } else {
6381                         PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
6382                         return 1;
6383                 }
6384                 *out = ExceptHandler(type, name, body, lineno, col_offset,
6385                                      arena);
6386                 if (*out == NULL) goto failed;
6387                 return 0;
6388         }
6389
6390         tmp = PyObject_Repr(obj);
6391         if (tmp == NULL) goto failed;
6392         PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %.400s", PyString_AS_STRING(tmp));
6393 failed:
6394         Py_XDECREF(tmp);
6395         return 1;
6396 }
6397
6398 int
6399 obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
6400 {
6401         PyObject* tmp = NULL;
6402         asdl_seq* args;
6403         identifier vararg;
6404         identifier kwarg;
6405         asdl_seq* defaults;
6406
6407         if (PyObject_HasAttrString(obj, "args")) {
6408                 int res;
6409                 Py_ssize_t len;
6410                 Py_ssize_t i;
6411                 tmp = PyObject_GetAttrString(obj, "args");
6412                 if (tmp == NULL) goto failed;
6413                 if (!PyList_Check(tmp)) {
6414                         PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6415                         goto failed;
6416                 }
6417                 len = PyList_GET_SIZE(tmp);
6418                 args = asdl_seq_new(len, arena);
6419                 if (args == NULL) goto failed;
6420                 for (i = 0; i < len; i++) {
6421                         expr_ty value;
6422                         res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6423                         if (res != 0) goto failed;
6424                         asdl_seq_SET(args, i, value);
6425                 }
6426                 Py_XDECREF(tmp);
6427                 tmp = NULL;
6428         } else {
6429                 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
6430                 return 1;
6431         }
6432         if (PyObject_HasAttrString(obj, "vararg")) {
6433                 int res;
6434                 tmp = PyObject_GetAttrString(obj, "vararg");
6435                 if (tmp == NULL) goto failed;
6436                 res = obj2ast_identifier(tmp, &vararg, arena);
6437                 if (res != 0) goto failed;
6438                 Py_XDECREF(tmp);
6439                 tmp = NULL;
6440         } else {
6441                 vararg = NULL;
6442         }
6443         if (PyObject_HasAttrString(obj, "kwarg")) {
6444                 int res;
6445                 tmp = PyObject_GetAttrString(obj, "kwarg");
6446                 if (tmp == NULL) goto failed;
6447                 res = obj2ast_identifier(tmp, &kwarg, arena);
6448                 if (res != 0) goto failed;
6449                 Py_XDECREF(tmp);
6450                 tmp = NULL;
6451         } else {
6452                 kwarg = NULL;
6453         }
6454         if (PyObject_HasAttrString(obj, "defaults")) {
6455                 int res;
6456                 Py_ssize_t len;
6457                 Py_ssize_t i;
6458                 tmp = PyObject_GetAttrString(obj, "defaults");
6459                 if (tmp == NULL) goto failed;
6460                 if (!PyList_Check(tmp)) {
6461                         PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
6462                         goto failed;
6463                 }
6464                 len = PyList_GET_SIZE(tmp);
6465                 defaults = asdl_seq_new(len, arena);
6466                 if (defaults == NULL) goto failed;
6467                 for (i = 0; i < len; i++) {
6468                         expr_ty value;
6469                         res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
6470                         if (res != 0) goto failed;
6471                         asdl_seq_SET(defaults, i, value);
6472                 }
6473                 Py_XDECREF(tmp);
6474                 tmp = NULL;
6475         } else {
6476                 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
6477                 return 1;
6478         }
6479         *out = arguments(args, vararg, kwarg, defaults, arena);
6480         return 0;
6481 failed:
6482         Py_XDECREF(tmp);
6483         return 1;
6484 }
6485
6486 int
6487 obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
6488 {
6489         PyObject* tmp = NULL;
6490         identifier arg;
6491         expr_ty value;
6492
6493         if (PyObject_HasAttrString(obj, "arg")) {
6494                 int res;
6495                 tmp = PyObject_GetAttrString(obj, "arg");
6496                 if (tmp == NULL) goto failed;
6497                 res = obj2ast_identifier(tmp, &arg, arena);
6498                 if (res != 0) goto failed;
6499                 Py_XDECREF(tmp);
6500                 tmp = NULL;
6501         } else {
6502                 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword");
6503                 return 1;
6504         }
6505         if (PyObject_HasAttrString(obj, "value")) {
6506                 int res;
6507                 tmp = PyObject_GetAttrString(obj, "value");
6508                 if (tmp == NULL) goto failed;
6509                 res = obj2ast_expr(tmp, &value, arena);
6510                 if (res != 0) goto failed;
6511                 Py_XDECREF(tmp);
6512                 tmp = NULL;
6513         } else {
6514                 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
6515                 return 1;
6516         }
6517         *out = keyword(arg, value, arena);
6518         return 0;
6519 failed:
6520         Py_XDECREF(tmp);
6521         return 1;
6522 }
6523
6524 int
6525 obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
6526 {
6527         PyObject* tmp = NULL;
6528         identifier name;
6529         identifier asname;
6530
6531         if (PyObject_HasAttrString(obj, "name")) {
6532                 int res;
6533                 tmp = PyObject_GetAttrString(obj, "name");
6534                 if (tmp == NULL) goto failed;
6535                 res = obj2ast_identifier(tmp, &name, arena);
6536                 if (res != 0) goto failed;
6537                 Py_XDECREF(tmp);
6538                 tmp = NULL;
6539         } else {
6540                 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
6541                 return 1;
6542         }
6543         if (PyObject_HasAttrString(obj, "asname")) {
6544                 int res;
6545                 tmp = PyObject_GetAttrString(obj, "asname");
6546                 if (tmp == NULL) goto failed;
6547                 res = obj2ast_identifier(tmp, &asname, arena);
6548                 if (res != 0) goto failed;
6549                 Py_XDECREF(tmp);
6550                 tmp = NULL;
6551         } else {
6552                 asname = NULL;
6553         }
6554         *out = alias(name, asname, arena);
6555         return 0;
6556 failed:
6557         Py_XDECREF(tmp);
6558         return 1;
6559 }
6560
6561
6562 PyMODINIT_FUNC
6563 init_ast(void)
6564 {
6565         PyObject *m, *d;
6566         if (!init_types()) return;
6567         m = Py_InitModule3("_ast", NULL, NULL);
6568         if (!m) return;
6569         d = PyModule_GetDict(m);
6570         if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return;
6571         if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
6572                 return;
6573         if (PyModule_AddStringConstant(m, "__version__", "82160") < 0)
6574                 return;
6575         if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return;
6576         if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
6577             return;
6578         if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type)
6579             < 0) return;
6580         if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) <
6581             0) return;
6582         if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return;
6583         if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return;
6584         if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type)
6585             < 0) return;
6586         if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
6587             return;
6588         if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0)
6589             return;
6590         if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0)
6591             return;
6592         if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0)
6593             return;
6594         if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) <
6595             0) return;
6596         if (PyDict_SetItemString(d, "Print", (PyObject*)Print_type) < 0) return;
6597         if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return;
6598         if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return;
6599         if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return;
6600         if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return;
6601         if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return;
6602         if (PyDict_SetItemString(d, "TryExcept", (PyObject*)TryExcept_type) <
6603             0) return;
6604         if (PyDict_SetItemString(d, "TryFinally", (PyObject*)TryFinally_type) <
6605             0) return;
6606         if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0)
6607             return;
6608         if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0)
6609             return;
6610         if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) <
6611             0) return;
6612         if (PyDict_SetItemString(d, "Exec", (PyObject*)Exec_type) < 0) return;
6613         if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0)
6614             return;
6615         if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return;
6616         if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return;
6617         if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return;
6618         if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
6619             return;
6620         if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return;
6621         if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0)
6622             return;
6623         if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return;
6624         if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0)
6625             return;
6626         if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0)
6627             return;
6628         if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return;
6629         if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return;
6630         if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return;
6631         if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
6632             return;
6633         if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0)
6634             return;
6635         if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
6636             return;
6637         if (PyDict_SetItemString(d, "GeneratorExp",
6638             (PyObject*)GeneratorExp_type) < 0) return;
6639         if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return;
6640         if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0)
6641             return;
6642         if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return;
6643         if (PyDict_SetItemString(d, "Repr", (PyObject*)Repr_type) < 0) return;
6644         if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return;
6645         if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return;
6646         if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) <
6647             0) return;
6648         if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) <
6649             0) return;
6650         if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return;
6651         if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return;
6652         if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return;
6653         if (PyDict_SetItemString(d, "expr_context",
6654             (PyObject*)expr_context_type) < 0) return;
6655         if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return;
6656         if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return;
6657         if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return;
6658         if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0)
6659             return;
6660         if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
6661             return;
6662         if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return;
6663         if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return;
6664         if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
6665             return;
6666         if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return;
6667         if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
6668             return;
6669         if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return;
6670         if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0)
6671             return;
6672         if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return;
6673         if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return;
6674         if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
6675             return;
6676         if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return;
6677         if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return;
6678         if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return;
6679         if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return;
6680         if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return;
6681         if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return;
6682         if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0)
6683             return;
6684         if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0)
6685             return;
6686         if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return;
6687         if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0)
6688             return;
6689         if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0)
6690             return;
6691         if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
6692             return;
6693         if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0)
6694             return;
6695         if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0)
6696             return;
6697         if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return;
6698         if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return;
6699         if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return;
6700         if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return;
6701         if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return;
6702         if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return;
6703         if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return;
6704         if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return;
6705         if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return;
6706         if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return;
6707         if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return;
6708         if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return;
6709         if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return;
6710         if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return;
6711         if (PyDict_SetItemString(d, "comprehension",
6712             (PyObject*)comprehension_type) < 0) return;
6713         if (PyDict_SetItemString(d, "excepthandler",
6714             (PyObject*)excepthandler_type) < 0) return;
6715         if (PyDict_SetItemString(d, "ExceptHandler",
6716             (PyObject*)ExceptHandler_type) < 0) return;
6717         if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) <
6718             0) return;
6719         if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0)
6720             return;
6721         if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return;
6722 }
6723
6724
6725 PyObject* PyAST_mod2obj(mod_ty t)
6726 {
6727     init_types();
6728     return ast2obj_mod(t);
6729 }
6730
6731 /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
6732 mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
6733 {
6734     mod_ty res;
6735     PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
6736                             (PyObject*)Interactive_type};
6737     char *req_name[] = {"Module", "Expression", "Interactive"};
6738     int isinstance;
6739     assert(0 <= mode && mode <= 2);
6740
6741     init_types();
6742
6743     isinstance = PyObject_IsInstance(ast, req_type[mode]);
6744     if (isinstance == -1)
6745         return NULL;
6746     if (!isinstance) {
6747         PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
6748                      req_name[mode], Py_TYPE(ast)->tp_name);
6749         return NULL;
6750     }
6751     if (obj2ast_mod(ast, &res, arena) != 0)
6752         return NULL;
6753     else
6754         return res;
6755 }
6756
6757 int PyAST_Check(PyObject* obj)
6758 {
6759     init_types();
6760     return PyObject_IsInstance(obj, (PyObject*)&AST_type);
6761 }
6762
6763