/* these are not real typedefs: they are there only to make pycparser happy */
typedef int HPy;
typedef int HPyContext;
typedef int HPyModuleDef;
typedef int HPyType_Spec;
typedef int HPyType_SpecParam;
typedef int HPyCFunction;
typedef int HPy_ssize_t;
typedef int HPy_hash_t;
typedef int wchar_t;
typedef int size_t;
typedef int HPyFunc_Signature;
typedef int cpy_PyObject;
typedef int HPyListBuilder;
typedef int HPyTupleBuilder;
typedef int HPyTracker;
typedef int HPy_RichCmpOp;
typedef int HPy_buffer;

/* HPy public API */

/* Constants */
HPy h_None;
HPy h_True;
HPy h_False;
HPy h_NotImplemented;
HPy h_Ellipsis;

/* Exceptions */
HPy h_BaseException;
HPy h_Exception;
HPy h_StopAsyncIteration;
HPy h_StopIteration;
HPy h_GeneratorExit;
HPy h_ArithmeticError;
HPy h_LookupError;
HPy h_AssertionError;
HPy h_AttributeError;
HPy h_BufferError;
HPy h_EOFError;
HPy h_FloatingPointError;
HPy h_OSError;
HPy h_ImportError;
HPy h_ModuleNotFoundError;
HPy h_IndexError;
HPy h_KeyError;
HPy h_KeyboardInterrupt;
HPy h_MemoryError;
HPy h_NameError;
HPy h_OverflowError;
HPy h_RuntimeError;
HPy h_RecursionError;
HPy h_NotImplementedError;
HPy h_SyntaxError;
HPy h_IndentationError;
HPy h_TabError;
HPy h_ReferenceError;
HPy h_SystemError;
HPy h_SystemExit;
HPy h_TypeError;
HPy h_UnboundLocalError;
HPy h_UnicodeError;
HPy h_UnicodeEncodeError;
HPy h_UnicodeDecodeError;
HPy h_UnicodeTranslateError;
HPy h_ValueError;
HPy h_ZeroDivisionError;
HPy h_BlockingIOError;
HPy h_BrokenPipeError;
HPy h_ChildProcessError;
HPy h_ConnectionError;
HPy h_ConnectionAbortedError;
HPy h_ConnectionRefusedError;
HPy h_ConnectionResetError;
HPy h_FileExistsError;
HPy h_FileNotFoundError;
HPy h_InterruptedError;
HPy h_IsADirectoryError;
HPy h_NotADirectoryError;
HPy h_PermissionError;
HPy h_ProcessLookupError;
HPy h_TimeoutError;
// EnvironmentError, IOError and WindowsError are intentionally omitted (they
// are all aliases of OSError since Python 3.3).

/* Warnings */
HPy h_Warning;
HPy h_UserWarning;
HPy h_DeprecationWarning;
HPy h_PendingDeprecationWarning;
HPy h_SyntaxWarning;
HPy h_RuntimeWarning;
HPy h_FutureWarning;
HPy h_ImportWarning;
HPy h_UnicodeWarning;
HPy h_BytesWarning;
HPy h_ResourceWarning;

/* Types */
HPy h_BaseObjectType;   /* built-in 'object' */
HPy h_TypeType;         /* built-in 'type' */
HPy h_LongType;         /* built-in 'int' */
HPy h_UnicodeType;      /* built-in 'str' */
HPy h_TupleType;        /* built-in 'tuple' */
HPy h_ListType;         /* built-in 'list' */

HPy HPyModule_Create(HPyContext ctx, HPyModuleDef *def);
HPy HPy_Dup(HPyContext ctx, HPy h);
void HPy_Close(HPyContext ctx, HPy h);

HPy HPyLong_FromLong(HPyContext ctx, long value);
HPy HPyLong_FromUnsignedLong(HPyContext ctx, unsigned long value);
HPy HPyLong_FromLongLong(HPyContext ctx, long long v);
HPy HPyLong_FromUnsignedLongLong(HPyContext ctx, unsigned long long v);
HPy HPyLong_FromSize_t(HPyContext ctx, size_t value);
HPy HPyLong_FromSsize_t(HPyContext ctx, HPy_ssize_t value);

long HPyLong_AsLong(HPyContext ctx, HPy h);
unsigned long HPyLong_AsUnsignedLong(HPyContext ctx, HPy h);
unsigned long HPyLong_AsUnsignedLongMask(HPyContext ctx, HPy h);
long long HPyLong_AsLongLong(HPyContext ctx, HPy h);
unsigned long long HPyLong_AsUnsignedLongLong(HPyContext ctx, HPy h);
unsigned long long HPyLong_AsUnsignedLongLongMask(HPyContext ctx, HPy h);
size_t HPyLong_AsSize_t(HPyContext ctx, HPy h);
HPy_ssize_t HPyLong_AsSsize_t(HPyContext ctx, HPy h);

HPy HPyFloat_FromDouble(HPyContext ctx, double v);
double HPyFloat_AsDouble(HPyContext ctx, HPy h);

HPy HPyBool_FromLong(HPyContext ctx, long v);


/* abstract.h */
HPy_ssize_t HPy_Length(HPyContext ctx, HPy h);

int HPyNumber_Check(HPyContext ctx, HPy h);
HPy HPy_Add(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Subtract(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Multiply(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_MatrixMultiply(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_FloorDivide(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_TrueDivide(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Remainder(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Divmod(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Power(HPyContext ctx, HPy h1, HPy h2, HPy h3);
HPy HPy_Negative(HPyContext ctx, HPy h1);
HPy HPy_Positive(HPyContext ctx, HPy h1);
HPy HPy_Absolute(HPyContext ctx, HPy h1);
HPy HPy_Invert(HPyContext ctx, HPy h1);
HPy HPy_Lshift(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Rshift(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_And(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Xor(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Or(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_Index(HPyContext ctx, HPy h1);
HPy HPy_Long(HPyContext ctx, HPy h1);
HPy HPy_Float(HPyContext ctx, HPy h1);

HPy HPy_InPlaceAdd(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceSubtract(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceMultiply(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceMatrixMultiply(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceFloorDivide(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceTrueDivide(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceRemainder(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlacePower(HPyContext ctx, HPy h1, HPy h2, HPy h3);
HPy HPy_InPlaceLshift(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceRshift(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceAnd(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceXor(HPyContext ctx, HPy h1, HPy h2);
HPy HPy_InPlaceOr(HPyContext ctx, HPy h1, HPy h2);

int HPyCallable_Check(HPyContext ctx, HPy h);
HPy HPy_CallTupleDict(HPyContext ctx, HPy callable, HPy args, HPy kw);

/* pyerrors.h */
void HPy_FatalError(HPyContext ctx, const char *message);
void HPyErr_SetString(HPyContext ctx, HPy h_type, const char *message);
void HPyErr_SetObject(HPyContext ctx, HPy h_type, HPy h_value);
/* note: HPyErr_Occurred() returns a flag 0-or-1, instead of a 'PyObject *' */
int HPyErr_Occurred(HPyContext ctx);
HPy HPyErr_NoMemory(HPyContext ctx);
void HPyErr_Clear(HPyContext ctx);

/* object.h */
int HPy_IsTrue(HPyContext ctx, HPy h);
HPy HPyType_FromSpec(HPyContext ctx, HPyType_Spec *spec,
                     HPyType_SpecParam *params);
HPy HPyType_GenericNew(HPyContext ctx, HPy type, HPy *args, HPy_ssize_t nargs, HPy kw);

HPy HPy_GetAttr(HPyContext ctx, HPy obj, HPy name);
HPy HPy_GetAttr_s(HPyContext ctx, HPy obj, const char *name);

int HPy_HasAttr(HPyContext ctx, HPy obj, HPy name);
int HPy_HasAttr_s(HPyContext ctx, HPy obj, const char *name);

int HPy_SetAttr(HPyContext ctx, HPy obj, HPy name, HPy value);
int HPy_SetAttr_s(HPyContext ctx, HPy obj, const char *name, HPy value);

HPy HPy_GetItem(HPyContext ctx, HPy obj, HPy key);
HPy HPy_GetItem_i(HPyContext ctx, HPy obj, HPy_ssize_t idx);
HPy HPy_GetItem_s(HPyContext ctx, HPy obj, const char *key);

int HPy_SetItem(HPyContext ctx, HPy obj, HPy key, HPy value);
int HPy_SetItem_i(HPyContext ctx, HPy obj, HPy_ssize_t idx, HPy value);
int HPy_SetItem_s(HPyContext ctx, HPy obj, const char *key, HPy value);

HPy HPy_Type(HPyContext ctx, HPy obj);
// WARNING: HPy_TypeCheck could be tweaked/removed in the future, see issue #160
int HPy_TypeCheck(HPyContext ctx, HPy obj, HPy type);

void* _HPy_Cast(HPyContext ctx, HPy h);
HPy _HPy_New(HPyContext ctx, HPy h_type, void **data);

HPy HPy_Repr(HPyContext ctx, HPy obj);
HPy HPy_Str(HPyContext ctx, HPy obj);
HPy HPy_ASCII(HPyContext ctx, HPy obj);
HPy HPy_Bytes(HPyContext ctx, HPy obj);

HPy HPy_RichCompare(HPyContext ctx, HPy v, HPy w, int op);
int HPy_RichCompareBool(HPyContext ctx, HPy v, HPy w, int op);

HPy_hash_t HPy_Hash(HPyContext ctx, HPy obj);

/* bytesobject.h */
int HPyBytes_Check(HPyContext ctx, HPy h);
HPy_ssize_t HPyBytes_Size(HPyContext ctx, HPy h);
HPy_ssize_t HPyBytes_GET_SIZE(HPyContext ctx, HPy h);
char* HPyBytes_AsString(HPyContext ctx, HPy h);
char* HPyBytes_AS_STRING(HPyContext ctx, HPy h);
HPy HPyBytes_FromString(HPyContext ctx, const char *v);
HPy HPyBytes_FromStringAndSize(HPyContext ctx, const char *v, HPy_ssize_t len);

/* unicodeobject.h */
HPy HPyUnicode_FromString(HPyContext ctx, const char *utf8);
int HPyUnicode_Check(HPyContext ctx, HPy h);
HPy HPyUnicode_AsUTF8String(HPyContext ctx, HPy h);
HPy HPyUnicode_FromWideChar(HPyContext ctx, const wchar_t *w, HPy_ssize_t size);

/* listobject.h */
int HPyList_Check(HPyContext ctx, HPy h);
HPy HPyList_New(HPyContext ctx, HPy_ssize_t len);
int HPyList_Append(HPyContext ctx, HPy h_list, HPy h_item);

/* dictobject.h */
int HPyDict_Check(HPyContext ctx, HPy h);
HPy HPyDict_New(HPyContext ctx);

/* tupleobject.h */
int HPyTuple_Check(HPyContext ctx, HPy h);
HPy HPyTuple_FromArray(HPyContext ctx, HPy items[], HPy_ssize_t n);
// note: HPyTuple_Pack is implemented as a macro in common/macros.h


/* integration with the old CPython API */
HPy HPy_FromPyObject(HPyContext ctx, cpy_PyObject *obj);
cpy_PyObject *HPy_AsPyObject(HPyContext ctx, HPy h);

/* internal helpers which need to be exposed to modules for practical reasons :( */
void _HPy_CallRealFunctionFromTrampoline(HPyContext ctx,
                                         HPyFunc_Signature sig,
                                         void *func,
                                         void *args);
void _HPy_CallDestroyAndThenDealloc(HPyContext ctx,
                                    void *func,
                                    cpy_PyObject *self);


/* Builders */

HPyListBuilder HPyListBuilder_New(HPyContext ctx, HPy_ssize_t initial_size);
void HPyListBuilder_Set(HPyContext ctx, HPyListBuilder builder,
                        HPy_ssize_t index, HPy h_item);
HPy HPyListBuilder_Build(HPyContext ctx, HPyListBuilder builder);
void HPyListBuilder_Cancel(HPyContext ctx, HPyListBuilder builder);

HPyTupleBuilder HPyTupleBuilder_New(HPyContext ctx, HPy_ssize_t initial_size);
void HPyTupleBuilder_Set(HPyContext ctx, HPyTupleBuilder builder,
                         HPy_ssize_t index, HPy h_item);
HPy HPyTupleBuilder_Build(HPyContext ctx, HPyTupleBuilder builder);
void HPyTupleBuilder_Cancel(HPyContext ctx, HPyTupleBuilder builder);

/* Helper for correctly closing handles */

HPyTracker HPyTracker_New(HPyContext ctx, HPy_ssize_t size);
int HPyTracker_Add(HPyContext ctx, HPyTracker ht, HPy h);
void HPyTracker_ForgetAll(HPyContext ctx, HPyTracker ht);
void HPyTracker_Close(HPyContext ctx, HPyTracker ht);

/* Debugging helpers */
void _HPy_Dump(HPyContext ctx, HPy h);


/* *******
   hpyfunc
   *******

   These typedefs are used to generate the various macros used by
   include/common/hpyfunc.h
*/
typedef HPy (*HPyFunc_noargs)(HPyContext ctx, HPy self);
typedef HPy (*HPyFunc_o)(HPyContext ctx, HPy self, HPy arg);
typedef HPy (*HPyFunc_varargs)(HPyContext ctx, HPy self, HPy *args, HPy_ssize_t nargs);
typedef HPy (*HPyFunc_keywords)(HPyContext ctx, HPy self,
                                HPy *args, HPy_ssize_t nargs, HPy kw);

typedef HPy (*HPyFunc_unaryfunc)(HPyContext ctx, HPy);
typedef HPy (*HPyFunc_binaryfunc)(HPyContext ctx, HPy, HPy);
typedef HPy (*HPyFunc_ternaryfunc)(HPyContext ctx, HPy, HPy, HPy);
typedef int (*HPyFunc_inquiry)(HPyContext ctx, HPy);
typedef HPy_ssize_t (*HPyFunc_lenfunc)(HPyContext ctx, HPy);
typedef HPy (*HPyFunc_ssizeargfunc)(HPyContext ctx, HPy, HPy_ssize_t);
typedef HPy (*HPyFunc_ssizessizeargfunc)(HPyContext ctx, HPy, HPy_ssize_t, HPy_ssize_t);
typedef int (*HPyFunc_ssizeobjargproc)(HPyContext ctx, HPy, HPy_ssize_t, HPy);
typedef int (*HPyFunc_ssizessizeobjargproc)(HPyContext ctx, HPy, HPy_ssize_t, HPy_ssize_t, HPy);
typedef int (*HPyFunc_objobjargproc)(HPyContext ctx, HPy, HPy, HPy);
typedef void (*HPyFunc_freefunc)(HPyContext ctx, void *);
typedef HPy (*HPyFunc_getattrfunc)(HPyContext ctx, HPy, char *);
typedef HPy (*HPyFunc_getattrofunc)(HPyContext ctx, HPy, HPy);
typedef int (*HPyFunc_setattrfunc)(HPyContext ctx, HPy, char *, HPy);
typedef int (*HPyFunc_setattrofunc)(HPyContext ctx, HPy, HPy, HPy);
typedef HPy (*HPyFunc_reprfunc)(HPyContext ctx, HPy);
typedef HPy_hash_t (*HPyFunc_hashfunc)(HPyContext ctx, HPy);
typedef HPy (*HPyFunc_richcmpfunc)(HPyContext ctx, HPy, HPy, HPy_RichCmpOp);
typedef HPy (*HPyFunc_getiterfunc)(HPyContext ctx, HPy);
typedef HPy (*HPyFunc_iternextfunc)(HPyContext ctx, HPy);
typedef HPy (*HPyFunc_descrgetfunc)(HPyContext ctx, HPy, HPy, HPy);
typedef int (*HPyFunc_descrsetfunc)(HPyContext ctx, HPy, HPy, HPy);
typedef int (*HPyFunc_initproc)(HPyContext ctx, HPy self,
                                HPy *args, HPy_ssize_t nargs, HPy kw);
typedef HPy (*HPyFunc_getter)(HPyContext ctx, HPy, void *);
typedef int (*HPyFunc_setter)(HPyContext ctx, HPy, HPy, void *);
typedef int (*HPyFunc_objobjproc)(HPyContext ctx, HPy, HPy);
typedef int (*HPyFunc_getbufferproc)(HPyContext, HPy, HPy_buffer *, int);
typedef void (*HPyFunc_releasebufferproc)(HPyContext, HPy, HPy_buffer *);

typedef void (*HPyFunc_destroyfunc)(void *);


/* ~~~ HPySlot_Slot ~~~

   The following enum is used to generate autogen_hpyslot.h, which contains:

     - The real definition of the enum HPySlot_Slot

     - the macros #define _HPySlot_SIGNATURE_*

*/

// NOTE: if you uncomment/enable a slot below, make sure to write a corresponding
// test in test_slots.py

/* Note that the magic numbers are the same as CPython */
typedef enum {
    HPy_bf_getbuffer = SLOT(1, HPyFunc_GETBUFFERPROC),
    HPy_bf_releasebuffer = SLOT(2, HPyFunc_RELEASEBUFFERPROC),
    //HPy_mp_ass_subscript = SLOT(3, HPyFunc_X),
    //HPy_mp_length = SLOT(4, HPyFunc_X),
    //HPy_mp_subscript = SLOT(5, HPyFunc_X),
    HPy_nb_absolute = SLOT(6, HPyFunc_UNARYFUNC),
    HPy_nb_add = SLOT(7, HPyFunc_BINARYFUNC),
    HPy_nb_and = SLOT(8, HPyFunc_BINARYFUNC),
    HPy_nb_bool = SLOT(9, HPyFunc_INQUIRY),
    HPy_nb_divmod = SLOT(10, HPyFunc_BINARYFUNC),
    HPy_nb_float = SLOT(11, HPyFunc_UNARYFUNC),
    HPy_nb_floor_divide = SLOT(12, HPyFunc_BINARYFUNC),
    HPy_nb_index = SLOT(13, HPyFunc_UNARYFUNC),
    HPy_nb_inplace_add = SLOT(14, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_and = SLOT(15, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_floor_divide = SLOT(16, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_lshift = SLOT(17, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_multiply = SLOT(18, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_or = SLOT(19, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_power = SLOT(20, HPyFunc_TERNARYFUNC),
    HPy_nb_inplace_remainder = SLOT(21, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_rshift = SLOT(22, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_subtract = SLOT(23, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_true_divide = SLOT(24, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_xor = SLOT(25, HPyFunc_BINARYFUNC),
    HPy_nb_int = SLOT(26, HPyFunc_UNARYFUNC),
    HPy_nb_invert = SLOT(27, HPyFunc_UNARYFUNC),
    HPy_nb_lshift = SLOT(28, HPyFunc_BINARYFUNC),
    HPy_nb_multiply = SLOT(29, HPyFunc_BINARYFUNC),
    HPy_nb_negative = SLOT(30, HPyFunc_UNARYFUNC),
    HPy_nb_or = SLOT(31, HPyFunc_BINARYFUNC),
    HPy_nb_positive = SLOT(32, HPyFunc_UNARYFUNC),
    HPy_nb_power = SLOT(33, HPyFunc_TERNARYFUNC),
    HPy_nb_remainder = SLOT(34, HPyFunc_BINARYFUNC),
    HPy_nb_rshift = SLOT(35, HPyFunc_BINARYFUNC),
    HPy_nb_subtract = SLOT(36, HPyFunc_BINARYFUNC),
    HPy_nb_true_divide = SLOT(37, HPyFunc_BINARYFUNC),
    HPy_nb_xor = SLOT(38, HPyFunc_BINARYFUNC),
    HPy_sq_ass_item = SLOT(39, HPyFunc_SSIZEOBJARGPROC),
    HPy_sq_concat = SLOT(40, HPyFunc_BINARYFUNC),
    HPy_sq_contains = SLOT(41, HPyFunc_OBJOBJPROC),
    HPy_sq_inplace_concat = SLOT(42, HPyFunc_BINARYFUNC),
    HPy_sq_inplace_repeat = SLOT(43, HPyFunc_SSIZEARGFUNC),
    HPy_sq_item = SLOT(44, HPyFunc_SSIZEARGFUNC),
    HPy_sq_length = SLOT(45, HPyFunc_LENFUNC),
    HPy_sq_repeat = SLOT(46, HPyFunc_SSIZEARGFUNC),
    //HPy_tp_alloc = SLOT(47, HPyFunc_X),      NOT SUPPORTED
    //HPy_tp_base = SLOT(48, HPyFunc_X),
    //HPy_tp_bases = SLOT(49, HPyFunc_X),
    //HPy_tp_call = SLOT(50, HPyFunc_X),
    //HPy_tp_clear = SLOT(51, HPyFunc_X),
    //HPy_tp_dealloc = SLOT(52, HPyFunc_X),    NOT SUPPORTED
    //HPy_tp_del = SLOT(53, HPyFunc_X),
    //HPy_tp_descr_get = SLOT(54, HPyFunc_X),
    //HPy_tp_descr_set = SLOT(55, HPyFunc_X),
    //HPy_tp_doc = SLOT(56, HPyFunc_X),
    //HPy_tp_getattr = SLOT(57, HPyFunc_X),
    //HPy_tp_getattro = SLOT(58, HPyFunc_X),
    //HPy_tp_hash = SLOT(59, HPyFunc_X),
    HPy_tp_init = SLOT(60, HPyFunc_INITPROC),
    //HPy_tp_is_gc = SLOT(61, HPyFunc_X),
    //HPy_tp_iter = SLOT(62, HPyFunc_X),
    //HPy_tp_iternext = SLOT(63, HPyFunc_X),
    //HPy_tp_methods = SLOT(64, HPyFunc_X),    NOT SUPPORTED
    HPy_tp_new = SLOT(65, HPyFunc_KEYWORDS),
    HPy_tp_repr = SLOT(66, HPyFunc_REPRFUNC),
    HPy_tp_richcompare = SLOT(67, HPyFunc_RICHCMPFUNC),
    //HPy_tp_setattr = SLOT(68, HPyFunc_X),
    //HPy_tp_setattro = SLOT(69, HPyFunc_X),
    //HPy_tp_str = SLOT(70, HPyFunc_X),
    //HPy_tp_traverse = SLOT(71, HPyFunc_X),
    //HPy_tp_members = SLOT(72, HPyFunc_X),    NOT SUPPORTED
    //HPy_tp_getset = SLOT(73, HPyFunc_X),     NOT SUPPORTED
    //HPy_tp_free = SLOT(74, HPyFunc_X),       NOT SUPPORTED
    HPy_nb_matrix_multiply = SLOT(75, HPyFunc_BINARYFUNC),
    HPy_nb_inplace_matrix_multiply = SLOT(76, HPyFunc_BINARYFUNC),
    //HPy_am_await = SLOT(77, HPyFunc_X),
    //HPy_am_aiter = SLOT(78, HPyFunc_X),
    //HPy_am_anext = SLOT(79, HPyFunc_X),
    //HPy_tp_finalize = SLOT(80, HPyFunc_X),

    /* extra HPy slots */
    HPy_tp_destroy = SLOT(1000, HPyFunc_DESTROYFUNC),

} HPySlot_Slot;
