/* File automatically generated by ./Parser/asdl_c.py */

#include "Python.h"
#include "Python-ast.h"

mod_ty
Module(asdl_seq * body)
{
        mod_ty p;
        p = (mod_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Module_kind;
        p->v.Module.body = body;
        return p;
}

mod_ty
Interactive(asdl_seq * body)
{
        mod_ty p;
        p = (mod_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Interactive_kind;
        p->v.Interactive.body = body;
        return p;
}

mod_ty
Expression(expr_ty body)
{
        mod_ty p;
        if (!body) {
                PyErr_SetString(PyExc_ValueError,
                                "field body is required for Expression");
                return NULL;
        }
        p = (mod_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Expression_kind;
        p->v.Expression.body = body;
        return p;
}

mod_ty
Suite(asdl_seq * body)
{
        mod_ty p;
        p = (mod_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Suite_kind;
        p->v.Suite.body = body;
        return p;
}

stmt_ty
FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
            decorators, int lineno)
{
        stmt_ty p;
        if (!name) {
                PyErr_SetString(PyExc_ValueError,
                                "field name is required for FunctionDef");
                return NULL;
        }
        if (!args) {
                PyErr_SetString(PyExc_ValueError,
                                "field args is required for FunctionDef");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = FunctionDef_kind;
        p->v.FunctionDef.name = name;
        p->v.FunctionDef.args = args;
        p->v.FunctionDef.body = body;
        p->v.FunctionDef.decorators = decorators;
        p->lineno = lineno;
        return p;
}

stmt_ty
ClassDef(identifier name, asdl_seq * bases, asdl_seq * body, int lineno)
{
        stmt_ty p;
        if (!name) {
                PyErr_SetString(PyExc_ValueError,
                                "field name is required for ClassDef");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = ClassDef_kind;
        p->v.ClassDef.name = name;
        p->v.ClassDef.bases = bases;
        p->v.ClassDef.body = body;
        p->lineno = lineno;
        return p;
}

stmt_ty
Return(expr_ty value, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Return_kind;
        p->v.Return.value = value;
        p->lineno = lineno;
        return p;
}

stmt_ty
Delete(asdl_seq * targets, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Delete_kind;
        p->v.Delete.targets = targets;
        p->lineno = lineno;
        return p;
}

stmt_ty
Assign(asdl_seq * targets, expr_ty value, int lineno)
{
        stmt_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Assign");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Assign_kind;
        p->v.Assign.targets = targets;
        p->v.Assign.value = value;
        p->lineno = lineno;
        return p;
}

stmt_ty
AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno)
{
        stmt_ty p;
        if (!target) {
                PyErr_SetString(PyExc_ValueError,
                                "field target is required for AugAssign");
                return NULL;
        }
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for AugAssign");
                return NULL;
        }
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for AugAssign");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = AugAssign_kind;
        p->v.AugAssign.target = target;
        p->v.AugAssign.op = op;
        p->v.AugAssign.value = value;
        p->lineno = lineno;
        return p;
}

stmt_ty
Print(expr_ty dest, asdl_seq * values, bool nl, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Print_kind;
        p->v.Print.dest = dest;
        p->v.Print.values = values;
        p->v.Print.nl = nl;
        p->lineno = lineno;
        return p;
}

stmt_ty
For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
    lineno)
{
        stmt_ty p;
        if (!target) {
                PyErr_SetString(PyExc_ValueError,
                                "field target is required for For");
                return NULL;
        }
        if (!iter) {
                PyErr_SetString(PyExc_ValueError,
                                "field iter is required for For");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = For_kind;
        p->v.For.target = target;
        p->v.For.iter = iter;
        p->v.For.body = body;
        p->v.For.orelse = orelse;
        p->lineno = lineno;
        return p;
}

stmt_ty
While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno)
{
        stmt_ty p;
        if (!test) {
                PyErr_SetString(PyExc_ValueError,
                                "field test is required for While");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = While_kind;
        p->v.While.test = test;
        p->v.While.body = body;
        p->v.While.orelse = orelse;
        p->lineno = lineno;
        return p;
}

stmt_ty
If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno)
{
        stmt_ty p;
        if (!test) {
                PyErr_SetString(PyExc_ValueError,
                                "field test is required for If");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = If_kind;
        p->v.If.test = test;
        p->v.If.body = body;
        p->v.If.orelse = orelse;
        p->lineno = lineno;
        return p;
}

stmt_ty
Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Raise_kind;
        p->v.Raise.type = type;
        p->v.Raise.inst = inst;
        p->v.Raise.tback = tback;
        p->lineno = lineno;
        return p;
}

stmt_ty
TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = TryExcept_kind;
        p->v.TryExcept.body = body;
        p->v.TryExcept.handlers = handlers;
        p->v.TryExcept.orelse = orelse;
        p->lineno = lineno;
        return p;
}

stmt_ty
TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = TryFinally_kind;
        p->v.TryFinally.body = body;
        p->v.TryFinally.finalbody = finalbody;
        p->lineno = lineno;
        return p;
}

stmt_ty
Assert(expr_ty test, expr_ty msg, int lineno)
{
        stmt_ty p;
        if (!test) {
                PyErr_SetString(PyExc_ValueError,
                                "field test is required for Assert");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Assert_kind;
        p->v.Assert.test = test;
        p->v.Assert.msg = msg;
        p->lineno = lineno;
        return p;
}

stmt_ty
Import(asdl_seq * names, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Import_kind;
        p->v.Import.names = names;
        p->lineno = lineno;
        return p;
}

stmt_ty
ImportFrom(identifier module, asdl_seq * names, int lineno)
{
        stmt_ty p;
        if (!module) {
                PyErr_SetString(PyExc_ValueError,
                                "field module is required for ImportFrom");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = ImportFrom_kind;
        p->v.ImportFrom.module = module;
        p->v.ImportFrom.names = names;
        p->lineno = lineno;
        return p;
}

stmt_ty
Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno)
{
        stmt_ty p;
        if (!body) {
                PyErr_SetString(PyExc_ValueError,
                                "field body is required for Exec");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Exec_kind;
        p->v.Exec.body = body;
        p->v.Exec.globals = globals;
        p->v.Exec.locals = locals;
        p->lineno = lineno;
        return p;
}

stmt_ty
Global(asdl_seq * names, int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Global_kind;
        p->v.Global.names = names;
        p->lineno = lineno;
        return p;
}

stmt_ty
Expr(expr_ty value, int lineno)
{
        stmt_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Expr");
                return NULL;
        }
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Expr_kind;
        p->v.Expr.value = value;
        p->lineno = lineno;
        return p;
}

stmt_ty
Pass(int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Pass_kind;
        p->lineno = lineno;
        return p;
}

stmt_ty
Break(int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Break_kind;
        p->lineno = lineno;
        return p;
}

stmt_ty
Continue(int lineno)
{
        stmt_ty p;
        p = (stmt_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Continue_kind;
        p->lineno = lineno;
        return p;
}

expr_ty
BoolOp(boolop_ty op, asdl_seq * values, int lineno)
{
        expr_ty p;
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for BoolOp");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = BoolOp_kind;
        p->v.BoolOp.op = op;
        p->v.BoolOp.values = values;
        p->lineno = lineno;
        return p;
}

expr_ty
BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno)
{
        expr_ty p;
        if (!left) {
                PyErr_SetString(PyExc_ValueError,
                                "field left is required for BinOp");
                return NULL;
        }
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for BinOp");
                return NULL;
        }
        if (!right) {
                PyErr_SetString(PyExc_ValueError,
                                "field right is required for BinOp");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = BinOp_kind;
        p->v.BinOp.left = left;
        p->v.BinOp.op = op;
        p->v.BinOp.right = right;
        p->lineno = lineno;
        return p;
}

expr_ty
UnaryOp(unaryop_ty op, expr_ty operand, int lineno)
{
        expr_ty p;
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for UnaryOp");
                return NULL;
        }
        if (!operand) {
                PyErr_SetString(PyExc_ValueError,
                                "field operand is required for UnaryOp");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = UnaryOp_kind;
        p->v.UnaryOp.op = op;
        p->v.UnaryOp.operand = operand;
        p->lineno = lineno;
        return p;
}

expr_ty
Lambda(arguments_ty args, expr_ty body, int lineno)
{
        expr_ty p;
        if (!args) {
                PyErr_SetString(PyExc_ValueError,
                                "field args is required for Lambda");
                return NULL;
        }
        if (!body) {
                PyErr_SetString(PyExc_ValueError,
                                "field body is required for Lambda");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Lambda_kind;
        p->v.Lambda.args = args;
        p->v.Lambda.body = body;
        p->lineno = lineno;
        return p;
}

expr_ty
Dict(asdl_seq * keys, asdl_seq * values, int lineno)
{
        expr_ty p;
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Dict_kind;
        p->v.Dict.keys = keys;
        p->v.Dict.values = values;
        p->lineno = lineno;
        return p;
}

expr_ty
ListComp(expr_ty elt, asdl_seq * generators, int lineno)
{
        expr_ty p;
        if (!elt) {
                PyErr_SetString(PyExc_ValueError,
                                "field elt is required for ListComp");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = ListComp_kind;
        p->v.ListComp.elt = elt;
        p->v.ListComp.generators = generators;
        p->lineno = lineno;
        return p;
}

expr_ty
GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno)
{
        expr_ty p;
        if (!elt) {
                PyErr_SetString(PyExc_ValueError,
                                "field elt is required for GeneratorExp");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = GeneratorExp_kind;
        p->v.GeneratorExp.elt = elt;
        p->v.GeneratorExp.generators = generators;
        p->lineno = lineno;
        return p;
}

expr_ty
Yield(expr_ty value, int lineno)
{
        expr_ty p;
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Yield_kind;
        p->v.Yield.value = value;
        p->lineno = lineno;
        return p;
}

expr_ty
Compare(expr_ty left, asdl_seq * ops, asdl_seq * comparators, int lineno)
{
        expr_ty p;
        if (!left) {
                PyErr_SetString(PyExc_ValueError,
                                "field left is required for Compare");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Compare_kind;
        p->v.Compare.left = left;
        p->v.Compare.ops = ops;
        p->v.Compare.comparators = comparators;
        p->lineno = lineno;
        return p;
}

expr_ty
Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs,
     expr_ty kwargs, int lineno)
{
        expr_ty p;
        if (!func) {
                PyErr_SetString(PyExc_ValueError,
                                "field func is required for Call");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Call_kind;
        p->v.Call.func = func;
        p->v.Call.args = args;
        p->v.Call.keywords = keywords;
        p->v.Call.starargs = starargs;
        p->v.Call.kwargs = kwargs;
        p->lineno = lineno;
        return p;
}

expr_ty
Repr(expr_ty value, int lineno)
{
        expr_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Repr");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Repr_kind;
        p->v.Repr.value = value;
        p->lineno = lineno;
        return p;
}

expr_ty
Num(object n, int lineno)
{
        expr_ty p;
        if (!n) {
                PyErr_SetString(PyExc_ValueError,
                                "field n is required for Num");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Num_kind;
        p->v.Num.n = n;
        p->lineno = lineno;
        return p;
}

expr_ty
Str(string s, int lineno)
{
        expr_ty p;
        if (!s) {
                PyErr_SetString(PyExc_ValueError,
                                "field s is required for Str");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Str_kind;
        p->v.Str.s = s;
        p->lineno = lineno;
        return p;
}

expr_ty
Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno)
{
        expr_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Attribute");
                return NULL;
        }
        if (!attr) {
                PyErr_SetString(PyExc_ValueError,
                                "field attr is required for Attribute");
                return NULL;
        }
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Attribute");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Attribute_kind;
        p->v.Attribute.value = value;
        p->v.Attribute.attr = attr;
        p->v.Attribute.ctx = ctx;
        p->lineno = lineno;
        return p;
}

expr_ty
Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno)
{
        expr_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Subscript");
                return NULL;
        }
        if (!slice) {
                PyErr_SetString(PyExc_ValueError,
                                "field slice is required for Subscript");
                return NULL;
        }
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Subscript");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Subscript_kind;
        p->v.Subscript.value = value;
        p->v.Subscript.slice = slice;
        p->v.Subscript.ctx = ctx;
        p->lineno = lineno;
        return p;
}

expr_ty
Name(identifier id, expr_context_ty ctx, int lineno)
{
        expr_ty p;
        if (!id) {
                PyErr_SetString(PyExc_ValueError,
                                "field id is required for Name");
                return NULL;
        }
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Name");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Name_kind;
        p->v.Name.id = id;
        p->v.Name.ctx = ctx;
        p->lineno = lineno;
        return p;
}

expr_ty
List(asdl_seq * elts, expr_context_ty ctx, int lineno)
{
        expr_ty p;
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for List");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = List_kind;
        p->v.List.elts = elts;
        p->v.List.ctx = ctx;
        p->lineno = lineno;
        return p;
}

expr_ty
Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno)
{
        expr_ty p;
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Tuple");
                return NULL;
        }
        p = (expr_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Tuple_kind;
        p->v.Tuple.elts = elts;
        p->v.Tuple.ctx = ctx;
        p->lineno = lineno;
        return p;
}

slice_ty
Ellipsis()
{
        slice_ty p;
        p = (slice_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Ellipsis_kind;
        return p;
}

slice_ty
Slice(expr_ty lower, expr_ty upper, expr_ty step)
{
        slice_ty p;
        p = (slice_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Slice_kind;
        p->v.Slice.lower = lower;
        p->v.Slice.upper = upper;
        p->v.Slice.step = step;
        return p;
}

slice_ty
ExtSlice(asdl_seq * dims)
{
        slice_ty p;
        p = (slice_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = ExtSlice_kind;
        p->v.ExtSlice.dims = dims;
        return p;
}

slice_ty
Index(expr_ty value)
{
        slice_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Index");
                return NULL;
        }
        p = (slice_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->kind = Index_kind;
        p->v.Index.value = value;
        return p;
}

comprehension_ty
comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs)
{
        comprehension_ty p;
        if (!target) {
                PyErr_SetString(PyExc_ValueError,
                                "field target is required for comprehension");
                return NULL;
        }
        if (!iter) {
                PyErr_SetString(PyExc_ValueError,
                                "field iter is required for comprehension");
                return NULL;
        }
        p = (comprehension_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->target = target;
        p->iter = iter;
        p->ifs = ifs;
        return p;
}

excepthandler_ty
excepthandler(expr_ty type, expr_ty name, asdl_seq * body)
{
        excepthandler_ty p;
        p = (excepthandler_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->type = type;
        p->name = name;
        p->body = body;
        return p;
}

arguments_ty
arguments(asdl_seq * args, identifier vararg, identifier kwarg, asdl_seq *
          defaults)
{
        arguments_ty p;
        p = (arguments_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->args = args;
        p->vararg = vararg;
        p->kwarg = kwarg;
        p->defaults = defaults;
        return p;
}

keyword_ty
keyword(identifier arg, expr_ty value)
{
        keyword_ty p;
        if (!arg) {
                PyErr_SetString(PyExc_ValueError,
                                "field arg is required for keyword");
                return NULL;
        }
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for keyword");
                return NULL;
        }
        p = (keyword_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->arg = arg;
        p->value = value;
        return p;
}

alias_ty
alias(identifier name, identifier asname)
{
        alias_ty p;
        if (!name) {
                PyErr_SetString(PyExc_ValueError,
                                "field name is required for alias");
                return NULL;
        }
        p = (alias_ty)malloc(sizeof(*p));
        if (!p) {
                PyErr_NoMemory();
                return NULL;
        }
        p->name = name;
        p->asname = asname;
        return p;
}

static void
free_seq_exprs(asdl_seq *seq)
{
        int i, n;
        n = asdl_seq_LEN(seq);
        for (i = 0; i < n; i++)
                free_expr((expr_ty)asdl_seq_GET(seq, i));
        asdl_seq_free(seq);
}

static void
free_seq_stmts(asdl_seq *seq)
{
        int i, n;
        n = asdl_seq_LEN(seq);
        for (i = 0; i < n; i++)
                free_stmt((stmt_ty)asdl_seq_GET(seq, i));
        asdl_seq_free(seq);
}

void
free_mod(mod_ty o)
{
        if (!o)
                return;

        switch (o->kind) {
        case Module_kind:
                free_seq_stmts(o->v.Module.body);
                break;
        case Interactive_kind:
                free_seq_stmts(o->v.Interactive.body);
                break;
        case Expression_kind:
                free_expr((expr_ty)o->v.Expression.body);
                break;
        case Suite_kind:
                free_seq_stmts(o->v.Suite.body);
                break;
        }

        free(o);
}

void
free_stmt(stmt_ty o)
{
        int i, n;
        asdl_seq *seq;

        if (!o)
                return;

        switch (o->kind) {
        case FunctionDef_kind:
                Py_DECREF((identifier)o->v.FunctionDef.name);
                free_arguments((arguments_ty)o->v.FunctionDef.args);
                free_seq_stmts(o->v.FunctionDef.body);
                free_seq_exprs(o->v.FunctionDef.decorators);
                break;
        case ClassDef_kind:
                Py_DECREF((identifier)o->v.ClassDef.name);
                free_seq_exprs(o->v.ClassDef.bases);
                free_seq_stmts(o->v.ClassDef.body);
                break;
        case Return_kind:
                if (o->v.Return.value) {
                        free_expr((expr_ty)o->v.Return.value);
                }
                break;
        case Delete_kind:
                free_seq_exprs(o->v.Delete.targets);
                break;
        case Assign_kind:
                free_seq_exprs(o->v.Assign.targets);
                free_expr((expr_ty)o->v.Assign.value);
                break;
        case AugAssign_kind:
                free_expr((expr_ty)o->v.AugAssign.target);
                free_operator((operator_ty)o->v.AugAssign.op);
                free_expr((expr_ty)o->v.AugAssign.value);
                break;
        case Print_kind:
                if (o->v.Print.dest) {
                        free_expr((expr_ty)o->v.Print.dest);
                }
                free_seq_exprs(o->v.Print.values);
                break;
        case For_kind:
                free_expr((expr_ty)o->v.For.target);
                free_expr((expr_ty)o->v.For.iter);
                free_seq_stmts(o->v.For.body);
                free_seq_stmts(o->v.For.orelse);
                break;
        case While_kind:
                free_expr((expr_ty)o->v.While.test);
                free_seq_stmts(o->v.While.body);
                free_seq_stmts(o->v.While.orelse);
                break;
        case If_kind:
                free_expr((expr_ty)o->v.If.test);
                free_seq_stmts(o->v.If.body);
                free_seq_stmts(o->v.If.orelse);
                break;
        case Raise_kind:
                if (o->v.Raise.type) {
                        free_expr((expr_ty)o->v.Raise.type);
                }
                if (o->v.Raise.inst) {
                        free_expr((expr_ty)o->v.Raise.inst);
                }
                if (o->v.Raise.tback) {
                        free_expr((expr_ty)o->v.Raise.tback);
                }
                break;
        case TryExcept_kind:
                free_seq_stmts(o->v.TryExcept.body);
                seq = o->v.TryExcept.handlers;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_excepthandler((excepthandler_ty)asdl_seq_GET(seq,
                                           i));
                asdl_seq_free(seq);
                free_seq_stmts(o->v.TryExcept.orelse);
                break;
        case TryFinally_kind:
                free_seq_stmts(o->v.TryFinally.body);
                free_seq_stmts(o->v.TryFinally.finalbody);
                break;
        case Assert_kind:
                free_expr((expr_ty)o->v.Assert.test);
                if (o->v.Assert.msg) {
                        free_expr((expr_ty)o->v.Assert.msg);
                }
                break;
        case Import_kind:
                seq = o->v.Import.names;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_alias((alias_ty)asdl_seq_GET(seq, i));
                asdl_seq_free(seq);
                break;
        case ImportFrom_kind:
                Py_DECREF((identifier)o->v.ImportFrom.module);
                seq = o->v.ImportFrom.names;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_alias((alias_ty)asdl_seq_GET(seq, i));
                asdl_seq_free(seq);
                break;
        case Exec_kind:
                free_expr((expr_ty)o->v.Exec.body);
                if (o->v.Exec.globals) {
                        free_expr((expr_ty)o->v.Exec.globals);
                }
                if (o->v.Exec.locals) {
                        free_expr((expr_ty)o->v.Exec.locals);
                }
                break;
        case Global_kind:
                seq = o->v.Global.names;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        Py_DECREF((identifier)asdl_seq_GET(seq, i));
                asdl_seq_free(seq);
                break;
        case Expr_kind:
                free_expr((expr_ty)o->v.Expr.value);
                break;
        case Pass_kind:
                break;
        case Break_kind:
                break;
        case Continue_kind:
                break;
        }

        free(o);
}

void
free_expr(expr_ty o)
{
        int i, n;
        asdl_seq *seq;

        if (!o)
                return;

        switch (o->kind) {
        case BoolOp_kind:
                free_boolop((boolop_ty)o->v.BoolOp.op);
                free_seq_exprs(o->v.BoolOp.values);
                break;
        case BinOp_kind:
                free_expr((expr_ty)o->v.BinOp.left);
                free_operator((operator_ty)o->v.BinOp.op);
                free_expr((expr_ty)o->v.BinOp.right);
                break;
        case UnaryOp_kind:
                free_unaryop((unaryop_ty)o->v.UnaryOp.op);
                free_expr((expr_ty)o->v.UnaryOp.operand);
                break;
        case Lambda_kind:
                free_arguments((arguments_ty)o->v.Lambda.args);
                free_expr((expr_ty)o->v.Lambda.body);
                break;
        case Dict_kind:
                free_seq_exprs(o->v.Dict.keys);
                free_seq_exprs(o->v.Dict.values);
                break;
        case ListComp_kind:
                free_expr((expr_ty)o->v.ListComp.elt);
                seq = o->v.ListComp.generators;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_comprehension((comprehension_ty)asdl_seq_GET(seq,
                                           i));
                asdl_seq_free(seq);
                break;
        case GeneratorExp_kind:
                free_expr((expr_ty)o->v.GeneratorExp.elt);
                seq = o->v.GeneratorExp.generators;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_comprehension((comprehension_ty)asdl_seq_GET(seq,
                                           i));
                asdl_seq_free(seq);
                break;
        case Yield_kind:
                if (o->v.Yield.value) {
                        free_expr((expr_ty)o->v.Yield.value);
                }
                break;
        case Compare_kind:
                free_expr((expr_ty)o->v.Compare.left);
                seq = o->v.Compare.ops;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_cmpop((cmpop_ty)asdl_seq_GET(seq, i));
                asdl_seq_free(seq);
                free_seq_exprs(o->v.Compare.comparators);
                break;
        case Call_kind:
                free_expr((expr_ty)o->v.Call.func);
                free_seq_exprs(o->v.Call.args);
                seq = o->v.Call.keywords;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_keyword((keyword_ty)asdl_seq_GET(seq, i));
                asdl_seq_free(seq);
                if (o->v.Call.starargs) {
                        free_expr((expr_ty)o->v.Call.starargs);
                }
                if (o->v.Call.kwargs) {
                        free_expr((expr_ty)o->v.Call.kwargs);
                }
                break;
        case Repr_kind:
                free_expr((expr_ty)o->v.Repr.value);
                break;
        case Num_kind:
                Py_DECREF((object)o->v.Num.n);
                break;
        case Str_kind:
                Py_DECREF((string)o->v.Str.s);
                break;
        case Attribute_kind:
                free_expr((expr_ty)o->v.Attribute.value);
                Py_DECREF((identifier)o->v.Attribute.attr);
                free_expr_context((expr_context_ty)o->v.Attribute.ctx);
                break;
        case Subscript_kind:
                free_expr((expr_ty)o->v.Subscript.value);
                free_slice((slice_ty)o->v.Subscript.slice);
                free_expr_context((expr_context_ty)o->v.Subscript.ctx);
                break;
        case Name_kind:
                Py_DECREF((identifier)o->v.Name.id);
                free_expr_context((expr_context_ty)o->v.Name.ctx);
                break;
        case List_kind:
                free_seq_exprs(o->v.List.elts);
                free_expr_context((expr_context_ty)o->v.List.ctx);
                break;
        case Tuple_kind:
                free_seq_exprs(o->v.Tuple.elts);
                free_expr_context((expr_context_ty)o->v.Tuple.ctx);
                break;
        }

        free(o);
}

void
free_expr_context(expr_context_ty o)
{
        if (!o)
                return;

}

void
free_slice(slice_ty o)
{
        int i, n;
        asdl_seq *seq;

        if (!o)
                return;

        switch (o->kind) {
        case Ellipsis_kind:
                break;
        case Slice_kind:
                if (o->v.Slice.lower) {
                        free_expr((expr_ty)o->v.Slice.lower);
                }
                if (o->v.Slice.upper) {
                        free_expr((expr_ty)o->v.Slice.upper);
                }
                if (o->v.Slice.step) {
                        free_expr((expr_ty)o->v.Slice.step);
                }
                break;
        case ExtSlice_kind:
                seq = o->v.ExtSlice.dims;
                n = asdl_seq_LEN(seq);
                for (i = 0; i < n; i++)
                        free_slice((slice_ty)asdl_seq_GET(seq, i));
                asdl_seq_free(seq);
                break;
        case Index_kind:
                free_expr((expr_ty)o->v.Index.value);
                break;
        }

        free(o);
}

void
free_boolop(boolop_ty o)
{
        if (!o)
                return;

}

void
free_operator(operator_ty o)
{
        if (!o)
                return;

}

void
free_unaryop(unaryop_ty o)
{
        if (!o)
                return;

}

void
free_cmpop(cmpop_ty o)
{
        if (!o)
                return;

}

void
free_comprehension(comprehension_ty o)
{
        if (!o)
                return;

        free_expr((expr_ty)o->target);
        free_expr((expr_ty)o->iter);
        free_seq_exprs(o->ifs);

        free(o);
}

void
free_excepthandler(excepthandler_ty o)
{
        if (!o)
                return;

        if (o->type) {
                free_expr((expr_ty)o->type);
        }
        if (o->name) {
                free_expr((expr_ty)o->name);
        }
        free_seq_stmts(o->body);

        free(o);
}

void
free_arguments(arguments_ty o)
{
        if (!o)
                return;

        free_seq_exprs(o->args);
        if (o->vararg) {
                Py_DECREF((identifier)o->vararg);
        }
        if (o->kwarg) {
                Py_DECREF((identifier)o->kwarg);
        }
        free_seq_exprs(o->defaults);

        free(o);
}

void
free_keyword(keyword_ty o)
{
        if (!o)
                return;

        Py_DECREF((identifier)o->arg);
        free_expr((expr_ty)o->value);

        free(o);
}

void
free_alias(alias_ty o)
{
        if (!o)
                return;

        Py_DECREF((identifier)o->name);
        if (o->asname) {
                Py_DECREF((identifier)o->asname);
        }

        free(o);
}

int
marshal_write_mod(PyObject **buf, int *off, mod_ty o)
{
        int i;
        switch (o->kind) {
        case Module_kind:
                marshal_write_int(buf, off, 1);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Module.body));
                for (i = 0; i < asdl_seq_LEN(o->v.Module.body); i++) {
                        void *elt = asdl_seq_GET(o->v.Module.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case Interactive_kind:
                marshal_write_int(buf, off, 2);
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.Interactive.body));
                for (i = 0; i < asdl_seq_LEN(o->v.Interactive.body); i++) {
                        void *elt = asdl_seq_GET(o->v.Interactive.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case Expression_kind:
                marshal_write_int(buf, off, 3);
                marshal_write_expr(buf, off, o->v.Expression.body);
                break;
        case Suite_kind:
                marshal_write_int(buf, off, 4);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Suite.body));
                for (i = 0; i < asdl_seq_LEN(o->v.Suite.body); i++) {
                        void *elt = asdl_seq_GET(o->v.Suite.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        }
        return 1;
}

int
marshal_write_stmt(PyObject **buf, int *off, stmt_ty o)
{
        int i;
        switch (o->kind) {
        case FunctionDef_kind:
                marshal_write_int(buf, off, 1);
                marshal_write_identifier(buf, off, o->v.FunctionDef.name);
                marshal_write_arguments(buf, off, o->v.FunctionDef.args);
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.FunctionDef.body));
                for (i = 0; i < asdl_seq_LEN(o->v.FunctionDef.body); i++) {
                        void *elt = asdl_seq_GET(o->v.FunctionDef.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.FunctionDef.decorators));
                for (i = 0; i < asdl_seq_LEN(o->v.FunctionDef.decorators); i++)
                     {
                        void *elt = asdl_seq_GET(o->v.FunctionDef.decorators,
                                                 i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                break;
        case ClassDef_kind:
                marshal_write_int(buf, off, 2);
                marshal_write_identifier(buf, off, o->v.ClassDef.name);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.ClassDef.bases));
                for (i = 0; i < asdl_seq_LEN(o->v.ClassDef.bases); i++) {
                        void *elt = asdl_seq_GET(o->v.ClassDef.bases, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.ClassDef.body));
                for (i = 0; i < asdl_seq_LEN(o->v.ClassDef.body); i++) {
                        void *elt = asdl_seq_GET(o->v.ClassDef.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case Return_kind:
                marshal_write_int(buf, off, 3);
                if (o->v.Return.value) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Return.value);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                break;
        case Delete_kind:
                marshal_write_int(buf, off, 4);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Delete.targets));
                for (i = 0; i < asdl_seq_LEN(o->v.Delete.targets); i++) {
                        void *elt = asdl_seq_GET(o->v.Delete.targets, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                break;
        case Assign_kind:
                marshal_write_int(buf, off, 5);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Assign.targets));
                for (i = 0; i < asdl_seq_LEN(o->v.Assign.targets); i++) {
                        void *elt = asdl_seq_GET(o->v.Assign.targets, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                marshal_write_expr(buf, off, o->v.Assign.value);
                break;
        case AugAssign_kind:
                marshal_write_int(buf, off, 6);
                marshal_write_expr(buf, off, o->v.AugAssign.target);
                marshal_write_operator(buf, off, o->v.AugAssign.op);
                marshal_write_expr(buf, off, o->v.AugAssign.value);
                break;
        case Print_kind:
                marshal_write_int(buf, off, 7);
                if (o->v.Print.dest) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Print.dest);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Print.values));
                for (i = 0; i < asdl_seq_LEN(o->v.Print.values); i++) {
                        void *elt = asdl_seq_GET(o->v.Print.values, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                marshal_write_bool(buf, off, o->v.Print.nl);
                break;
        case For_kind:
                marshal_write_int(buf, off, 8);
                marshal_write_expr(buf, off, o->v.For.target);
                marshal_write_expr(buf, off, o->v.For.iter);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.For.body));
                for (i = 0; i < asdl_seq_LEN(o->v.For.body); i++) {
                        void *elt = asdl_seq_GET(o->v.For.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.For.orelse));
                for (i = 0; i < asdl_seq_LEN(o->v.For.orelse); i++) {
                        void *elt = asdl_seq_GET(o->v.For.orelse, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case While_kind:
                marshal_write_int(buf, off, 9);
                marshal_write_expr(buf, off, o->v.While.test);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.While.body));
                for (i = 0; i < asdl_seq_LEN(o->v.While.body); i++) {
                        void *elt = asdl_seq_GET(o->v.While.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.While.orelse));
                for (i = 0; i < asdl_seq_LEN(o->v.While.orelse); i++) {
                        void *elt = asdl_seq_GET(o->v.While.orelse, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case If_kind:
                marshal_write_int(buf, off, 10);
                marshal_write_expr(buf, off, o->v.If.test);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.If.body));
                for (i = 0; i < asdl_seq_LEN(o->v.If.body); i++) {
                        void *elt = asdl_seq_GET(o->v.If.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.If.orelse));
                for (i = 0; i < asdl_seq_LEN(o->v.If.orelse); i++) {
                        void *elt = asdl_seq_GET(o->v.If.orelse, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case Raise_kind:
                marshal_write_int(buf, off, 11);
                if (o->v.Raise.type) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Raise.type);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                if (o->v.Raise.inst) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Raise.inst);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                if (o->v.Raise.tback) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Raise.tback);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                break;
        case TryExcept_kind:
                marshal_write_int(buf, off, 12);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.TryExcept.body));
                for (i = 0; i < asdl_seq_LEN(o->v.TryExcept.body); i++) {
                        void *elt = asdl_seq_GET(o->v.TryExcept.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.TryExcept.handlers));
                for (i = 0; i < asdl_seq_LEN(o->v.TryExcept.handlers); i++) {
                        void *elt = asdl_seq_GET(o->v.TryExcept.handlers, i);
                        marshal_write_excepthandler(buf, off,
                                                    (excepthandler_ty)elt);
                }
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.TryExcept.orelse));
                for (i = 0; i < asdl_seq_LEN(o->v.TryExcept.orelse); i++) {
                        void *elt = asdl_seq_GET(o->v.TryExcept.orelse, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case TryFinally_kind:
                marshal_write_int(buf, off, 13);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.TryFinally.body));
                for (i = 0; i < asdl_seq_LEN(o->v.TryFinally.body); i++) {
                        void *elt = asdl_seq_GET(o->v.TryFinally.body, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.TryFinally.finalbody));
                for (i = 0; i < asdl_seq_LEN(o->v.TryFinally.finalbody); i++) {
                        void *elt = asdl_seq_GET(o->v.TryFinally.finalbody, i);
                        marshal_write_stmt(buf, off, (stmt_ty)elt);
                }
                break;
        case Assert_kind:
                marshal_write_int(buf, off, 14);
                marshal_write_expr(buf, off, o->v.Assert.test);
                if (o->v.Assert.msg) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Assert.msg);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                break;
        case Import_kind:
                marshal_write_int(buf, off, 15);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Import.names));
                for (i = 0; i < asdl_seq_LEN(o->v.Import.names); i++) {
                        void *elt = asdl_seq_GET(o->v.Import.names, i);
                        marshal_write_alias(buf, off, (alias_ty)elt);
                }
                break;
        case ImportFrom_kind:
                marshal_write_int(buf, off, 16);
                marshal_write_identifier(buf, off, o->v.ImportFrom.module);
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.ImportFrom.names));
                for (i = 0; i < asdl_seq_LEN(o->v.ImportFrom.names); i++) {
                        void *elt = asdl_seq_GET(o->v.ImportFrom.names, i);
                        marshal_write_alias(buf, off, (alias_ty)elt);
                }
                break;
        case Exec_kind:
                marshal_write_int(buf, off, 17);
                marshal_write_expr(buf, off, o->v.Exec.body);
                if (o->v.Exec.globals) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Exec.globals);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                if (o->v.Exec.locals) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Exec.locals);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                break;
        case Global_kind:
                marshal_write_int(buf, off, 18);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Global.names));
                for (i = 0; i < asdl_seq_LEN(o->v.Global.names); i++) {
                        void *elt = asdl_seq_GET(o->v.Global.names, i);
                        marshal_write_identifier(buf, off, (identifier)elt);
                }
                break;
        case Expr_kind:
                marshal_write_int(buf, off, 19);
                marshal_write_expr(buf, off, o->v.Expr.value);
                break;
        case Pass_kind:
                marshal_write_int(buf, off, 20);
                break;
        case Break_kind:
                marshal_write_int(buf, off, 21);
                break;
        case Continue_kind:
                marshal_write_int(buf, off, 22);
                break;
        }
        return 1;
}

int
marshal_write_expr(PyObject **buf, int *off, expr_ty o)
{
        int i;
        switch (o->kind) {
        case BoolOp_kind:
                marshal_write_int(buf, off, 1);
                marshal_write_boolop(buf, off, o->v.BoolOp.op);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.BoolOp.values));
                for (i = 0; i < asdl_seq_LEN(o->v.BoolOp.values); i++) {
                        void *elt = asdl_seq_GET(o->v.BoolOp.values, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                break;
        case BinOp_kind:
                marshal_write_int(buf, off, 2);
                marshal_write_expr(buf, off, o->v.BinOp.left);
                marshal_write_operator(buf, off, o->v.BinOp.op);
                marshal_write_expr(buf, off, o->v.BinOp.right);
                break;
        case UnaryOp_kind:
                marshal_write_int(buf, off, 3);
                marshal_write_unaryop(buf, off, o->v.UnaryOp.op);
                marshal_write_expr(buf, off, o->v.UnaryOp.operand);
                break;
        case Lambda_kind:
                marshal_write_int(buf, off, 4);
                marshal_write_arguments(buf, off, o->v.Lambda.args);
                marshal_write_expr(buf, off, o->v.Lambda.body);
                break;
        case Dict_kind:
                marshal_write_int(buf, off, 5);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Dict.keys));
                for (i = 0; i < asdl_seq_LEN(o->v.Dict.keys); i++) {
                        void *elt = asdl_seq_GET(o->v.Dict.keys, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Dict.values));
                for (i = 0; i < asdl_seq_LEN(o->v.Dict.values); i++) {
                        void *elt = asdl_seq_GET(o->v.Dict.values, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                break;
        case ListComp_kind:
                marshal_write_int(buf, off, 6);
                marshal_write_expr(buf, off, o->v.ListComp.elt);
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.ListComp.generators));
                for (i = 0; i < asdl_seq_LEN(o->v.ListComp.generators); i++) {
                        void *elt = asdl_seq_GET(o->v.ListComp.generators, i);
                        marshal_write_comprehension(buf, off,
                                                    (comprehension_ty)elt);
                }
                break;
        case GeneratorExp_kind:
                marshal_write_int(buf, off, 7);
                marshal_write_expr(buf, off, o->v.GeneratorExp.elt);
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.GeneratorExp.generators));
                for (i = 0; i < asdl_seq_LEN(o->v.GeneratorExp.generators);
                     i++) {
                        void *elt = asdl_seq_GET(o->v.GeneratorExp.generators,
                                                 i);
                        marshal_write_comprehension(buf, off,
                                                    (comprehension_ty)elt);
                }
                break;
        case Yield_kind:
                marshal_write_int(buf, off, 8);
                if (o->v.Yield.value) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Yield.value);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                break;
        case Compare_kind:
                marshal_write_int(buf, off, 9);
                marshal_write_expr(buf, off, o->v.Compare.left);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Compare.ops));
                for (i = 0; i < asdl_seq_LEN(o->v.Compare.ops); i++) {
                        void *elt = asdl_seq_GET(o->v.Compare.ops, i);
                        marshal_write_cmpop(buf, off, (cmpop_ty)elt);
                }
                marshal_write_int(buf, off,
                                  asdl_seq_LEN(o->v.Compare.comparators));
                for (i = 0; i < asdl_seq_LEN(o->v.Compare.comparators); i++) {
                        void *elt = asdl_seq_GET(o->v.Compare.comparators, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                break;
        case Call_kind:
                marshal_write_int(buf, off, 10);
                marshal_write_expr(buf, off, o->v.Call.func);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Call.args));
                for (i = 0; i < asdl_seq_LEN(o->v.Call.args); i++) {
                        void *elt = asdl_seq_GET(o->v.Call.args, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Call.keywords));
                for (i = 0; i < asdl_seq_LEN(o->v.Call.keywords); i++) {
                        void *elt = asdl_seq_GET(o->v.Call.keywords, i);
                        marshal_write_keyword(buf, off, (keyword_ty)elt);
                }
                if (o->v.Call.starargs) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Call.starargs);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                if (o->v.Call.kwargs) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Call.kwargs);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                break;
        case Repr_kind:
                marshal_write_int(buf, off, 11);
                marshal_write_expr(buf, off, o->v.Repr.value);
                break;
        case Num_kind:
                marshal_write_int(buf, off, 12);
                marshal_write_object(buf, off, o->v.Num.n);
                break;
        case Str_kind:
                marshal_write_int(buf, off, 13);
                marshal_write_string(buf, off, o->v.Str.s);
                break;
        case Attribute_kind:
                marshal_write_int(buf, off, 14);
                marshal_write_expr(buf, off, o->v.Attribute.value);
                marshal_write_identifier(buf, off, o->v.Attribute.attr);
                marshal_write_expr_context(buf, off, o->v.Attribute.ctx);
                break;
        case Subscript_kind:
                marshal_write_int(buf, off, 15);
                marshal_write_expr(buf, off, o->v.Subscript.value);
                marshal_write_slice(buf, off, o->v.Subscript.slice);
                marshal_write_expr_context(buf, off, o->v.Subscript.ctx);
                break;
        case Name_kind:
                marshal_write_int(buf, off, 16);
                marshal_write_identifier(buf, off, o->v.Name.id);
                marshal_write_expr_context(buf, off, o->v.Name.ctx);
                break;
        case List_kind:
                marshal_write_int(buf, off, 17);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.List.elts));
                for (i = 0; i < asdl_seq_LEN(o->v.List.elts); i++) {
                        void *elt = asdl_seq_GET(o->v.List.elts, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                marshal_write_expr_context(buf, off, o->v.List.ctx);
                break;
        case Tuple_kind:
                marshal_write_int(buf, off, 18);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.Tuple.elts));
                for (i = 0; i < asdl_seq_LEN(o->v.Tuple.elts); i++) {
                        void *elt = asdl_seq_GET(o->v.Tuple.elts, i);
                        marshal_write_expr(buf, off, (expr_ty)elt);
                }
                marshal_write_expr_context(buf, off, o->v.Tuple.ctx);
                break;
        }
        return 1;
}

int
marshal_write_expr_context(PyObject **buf, int *off, expr_context_ty o)
{
        switch (o) {
        case Load:
                marshal_write_int(buf, off, 1);
                break;
        case Store:
                marshal_write_int(buf, off, 2);
                break;
        case Del:
                marshal_write_int(buf, off, 3);
                break;
        case AugLoad:
                marshal_write_int(buf, off, 4);
                break;
        case AugStore:
                marshal_write_int(buf, off, 5);
                break;
        case Param:
                marshal_write_int(buf, off, 6);
                break;
        }
        return 1;
}

int
marshal_write_slice(PyObject **buf, int *off, slice_ty o)
{
        int i;
        switch (o->kind) {
        case Ellipsis_kind:
                marshal_write_int(buf, off, 1);
                break;
        case Slice_kind:
                marshal_write_int(buf, off, 2);
                if (o->v.Slice.lower) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Slice.lower);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                if (o->v.Slice.upper) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Slice.upper);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                if (o->v.Slice.step) {
                        marshal_write_int(buf, off, 1);
                        marshal_write_expr(buf, off, o->v.Slice.step);
                }
                else {
                        marshal_write_int(buf, off, 0);
                }
                break;
        case ExtSlice_kind:
                marshal_write_int(buf, off, 3);
                marshal_write_int(buf, off, asdl_seq_LEN(o->v.ExtSlice.dims));
                for (i = 0; i < asdl_seq_LEN(o->v.ExtSlice.dims); i++) {
                        void *elt = asdl_seq_GET(o->v.ExtSlice.dims, i);
                        marshal_write_slice(buf, off, (slice_ty)elt);
                }
                break;
        case Index_kind:
                marshal_write_int(buf, off, 4);
                marshal_write_expr(buf, off, o->v.Index.value);
                break;
        }
        return 1;
}

int
marshal_write_boolop(PyObject **buf, int *off, boolop_ty o)
{
        switch (o) {
        case And:
                marshal_write_int(buf, off, 1);
                break;
        case Or:
                marshal_write_int(buf, off, 2);
                break;
        }
        return 1;
}

int
marshal_write_operator(PyObject **buf, int *off, operator_ty o)
{
        switch (o) {
        case Add:
                marshal_write_int(buf, off, 1);
                break;
        case Sub:
                marshal_write_int(buf, off, 2);
                break;
        case Mult:
                marshal_write_int(buf, off, 3);
                break;
        case Div:
                marshal_write_int(buf, off, 4);
                break;
        case Mod:
                marshal_write_int(buf, off, 5);
                break;
        case Pow:
                marshal_write_int(buf, off, 6);
                break;
        case LShift:
                marshal_write_int(buf, off, 7);
                break;
        case RShift:
                marshal_write_int(buf, off, 8);
                break;
        case BitOr:
                marshal_write_int(buf, off, 9);
                break;
        case BitXor:
                marshal_write_int(buf, off, 10);
                break;
        case BitAnd:
                marshal_write_int(buf, off, 11);
                break;
        case FloorDiv:
                marshal_write_int(buf, off, 12);
                break;
        }
        return 1;
}

int
marshal_write_unaryop(PyObject **buf, int *off, unaryop_ty o)
{
        switch (o) {
        case Invert:
                marshal_write_int(buf, off, 1);
                break;
        case Not:
                marshal_write_int(buf, off, 2);
                break;
        case UAdd:
                marshal_write_int(buf, off, 3);
                break;
        case USub:
                marshal_write_int(buf, off, 4);
                break;
        }
        return 1;
}

int
marshal_write_cmpop(PyObject **buf, int *off, cmpop_ty o)
{
        switch (o) {
        case Eq:
                marshal_write_int(buf, off, 1);
                break;
        case NotEq:
                marshal_write_int(buf, off, 2);
                break;
        case Lt:
                marshal_write_int(buf, off, 3);
                break;
        case LtE:
                marshal_write_int(buf, off, 4);
                break;
        case Gt:
                marshal_write_int(buf, off, 5);
                break;
        case GtE:
                marshal_write_int(buf, off, 6);
                break;
        case Is:
                marshal_write_int(buf, off, 7);
                break;
        case IsNot:
                marshal_write_int(buf, off, 8);
                break;
        case In:
                marshal_write_int(buf, off, 9);
                break;
        case NotIn:
                marshal_write_int(buf, off, 10);
                break;
        }
        return 1;
}

int
marshal_write_comprehension(PyObject **buf, int *off, comprehension_ty o)
{
        int i;
        marshal_write_expr(buf, off, o->target);
        marshal_write_expr(buf, off, o->iter);
        marshal_write_int(buf, off, asdl_seq_LEN(o->ifs));
        for (i = 0; i < asdl_seq_LEN(o->ifs); i++) {
                void *elt = asdl_seq_GET(o->ifs, i);
                marshal_write_expr(buf, off, (expr_ty)elt);
        }
        return 1;
}

int
marshal_write_excepthandler(PyObject **buf, int *off, excepthandler_ty o)
{
        int i;
        if (o->type) {
                marshal_write_int(buf, off, 1);
                marshal_write_expr(buf, off, o->type);
        }
        else {
                marshal_write_int(buf, off, 0);
        }
        if (o->name) {
                marshal_write_int(buf, off, 1);
                marshal_write_expr(buf, off, o->name);
        }
        else {
                marshal_write_int(buf, off, 0);
        }
        marshal_write_int(buf, off, asdl_seq_LEN(o->body));
        for (i = 0; i < asdl_seq_LEN(o->body); i++) {
                void *elt = asdl_seq_GET(o->body, i);
                marshal_write_stmt(buf, off, (stmt_ty)elt);
        }
        return 1;
}

int
marshal_write_arguments(PyObject **buf, int *off, arguments_ty o)
{
        int i;
        marshal_write_int(buf, off, asdl_seq_LEN(o->args));
        for (i = 0; i < asdl_seq_LEN(o->args); i++) {
                void *elt = asdl_seq_GET(o->args, i);
                marshal_write_expr(buf, off, (expr_ty)elt);
        }
        if (o->vararg) {
                marshal_write_int(buf, off, 1);
                marshal_write_identifier(buf, off, o->vararg);
        }
        else {
                marshal_write_int(buf, off, 0);
        }
        if (o->kwarg) {
                marshal_write_int(buf, off, 1);
                marshal_write_identifier(buf, off, o->kwarg);
        }
        else {
                marshal_write_int(buf, off, 0);
        }
        marshal_write_int(buf, off, asdl_seq_LEN(o->defaults));
        for (i = 0; i < asdl_seq_LEN(o->defaults); i++) {
                void *elt = asdl_seq_GET(o->defaults, i);
                marshal_write_expr(buf, off, (expr_ty)elt);
        }
        return 1;
}

int
marshal_write_keyword(PyObject **buf, int *off, keyword_ty o)
{
        marshal_write_identifier(buf, off, o->arg);
        marshal_write_expr(buf, off, o->value);
        return 1;
}

int
marshal_write_alias(PyObject **buf, int *off, alias_ty o)
{
        marshal_write_identifier(buf, off, o->name);
        if (o->asname) {
                marshal_write_int(buf, off, 1);
                marshal_write_identifier(buf, off, o->asname);
        }
        else {
                marshal_write_int(buf, off, 0);
        }
        return 1;
}

