From: Mark Wooding Date: Thu, 26 May 2016 08:26:09 +0000 (+0100) Subject: catacomb-python.h, util.c: Support for declaring types with weird metatypes. X-Git-Url: https://git.distorted.org.uk/~mdw/pyke/commitdiff_plain/017d5f6583ba31e9971dd05c6b4eb0b9ef1eadfa catacomb-python.h, util.c: Support for declaring types with weird metatypes. --- diff --git a/catacomb-python.h b/catacomb-python.h index 5c012ef..ecdbc30 100644 --- a/catacomb-python.h +++ b/catacomb-python.h @@ -155,10 +155,11 @@ #define root_pytype 0 #define type_pytype &PyType_Type -#define INITTYPE(ty, base) do { \ +#define INITTYPE_META(ty, base, meta) do { \ ty##_pytype_skel.tp_base = base##_pytype; \ - ty##_pytype = inittype(&ty##_pytype_skel); \ + ty##_pytype = inittype(&ty##_pytype_skel, meta##_pytype); \ } while (0) +#define INITTYPE(ty, base) INITTYPE_META(ty, base, type) #define INSERT(name, ob) do { \ PyObject *_o = (PyObject *)(ob); \ @@ -246,7 +247,7 @@ extern void *newtype(PyTypeObject *, const PyTypeObject *, const char *); extern PyObject *mkexc(PyObject *, PyObject *, const char *, PyMethodDef *); extern void typeready(PyTypeObject *); -extern PyTypeObject *inittype(PyTypeObject *); +extern PyTypeObject *inittype(PyTypeObject *, PyTypeObject *); extern void addmethods(const PyMethodDef *); extern PyMethodDef *donemethods(void); diff --git a/util.c b/util.c index 4e82ed6..58d2fe7 100644 --- a/util.c +++ b/util.c @@ -223,9 +223,9 @@ void typeready(PyTypeObject *ty) PyDict_SetItemString(ty->tp_dict, "__module__", modname); } -PyTypeObject *inittype(PyTypeObject *tyskel) +PyTypeObject *inittype(PyTypeObject *tyskel, PyTypeObject *meta) { - PyTypeObject *ty = newtype(&PyType_Type, tyskel, 0); + PyTypeObject *ty = newtype(meta, tyskel, 0); ty->tp_flags |= Py_TPFLAGS_HEAPTYPE; typeready(ty); return (ty);