/* 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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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_SetString(PyExc_MemoryError, "no memory");
                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)
{
        int i;
        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)
{
        int i;
        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)
{
        int i;
        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)
{
        int i;
        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)
{
        int i;
        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)
{
        int i;
        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)
{
        int i;
        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;
}

