Skip to content

Instantly share code, notes, and snippets.

@steve-s
Created February 23, 2022 17:12
Show Gist options
  • Save steve-s/903de0cb5e5b456aa70bf43103e65f61 to your computer and use it in GitHub Desktop.
Save steve-s/903de0cb5e5b456aa70bf43103e65f61 to your computer and use it in GitHub Desktop.
metaclass-wo-basicsize-issue
#include <Python.h>
#include <structmember.h>
typedef struct {
PyHeapTypeObject super;
int meta_magic;
int meta_member;
char some_more[64];
} DummyMeta;
static PyTypeObject DummyMetaType = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
.tp_base = &PyType_Type,
.tp_name = "mytest.DummyMeta",
.tp_basicsize = sizeof(DummyMeta),
.tp_flags = Py_TPFLAGS_DEFAULT,
};
typedef struct {
PyObject_HEAD
int member;
} DummyData;
static PyMemberDef members[] = {
{"member", T_INT, offsetof(DummyData, member), 0, NULL},
{NULL, 0, 0, 0, NULL},
};
static PyTypeObject DummyType = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
.tp_base = &PyType_Type,
.tp_name = "mytest.Dummy",
.tp_basicsize = sizeof(DummyData),
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_members = members,
};
// ...
// In module initialization:
if (PyType_Ready(&DummyMetaType))
return;
Py_TYPE(&DummyType) = &DummyMetaType;
if (PyType_Ready(&DummyType))
return;
// fails on Assertion `t_size >= b_size' failed on Python 3.8.5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment