From 5c119a7d68a3c6197a6890192b99b0967fa8eed1 Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Fri, 3 Dec 2010 16:53:26 -0200 Subject: Add subtype init hook. The hook is invoked every time the user creates a sub-type inherited from a Shiboken based type. --- libshiboken/basewrapper.cpp | 22 ++++++++++++++++++++-- libshiboken/basewrapper.h | 14 +++++++++++++- libshiboken/basewrapper_p.h | 1 + 3 files changed, 34 insertions(+), 3 deletions(-) (limited to 'libshiboken') diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp index 0d9439849..6c7d222ed 100644 --- a/libshiboken/basewrapper.cpp +++ b/libshiboken/basewrapper.cpp @@ -239,6 +239,13 @@ PyObject* SbkObjectTypeTpNew(PyTypeObject* metatype, PyObject* args, PyObject* k d->d_func = 0; d->is_user_type = 1; newType->d = d; + + std::list::const_iterator it = bases.begin(); + for (; it != bases.end(); ++it) { + if ((*it)->d->subtype_init) + (*it)->d->subtype_init(newType, args, kwds); + } + return reinterpret_cast(newType); } @@ -549,9 +556,20 @@ void initPrivateData(SbkObjectType* self) memset(self->d, 0, sizeof(SbkObjectTypePrivate)); } -void* getTypeUserData(SbkObjectType* type) +void setSubTypeInitHook(SbkObjectType* self, SubTypeInitHook func) +{ + self->d->subtype_init = func; +} + +void* getTypeUserData(SbkObjectType* self) +{ + return self->d->user_data; +} + +void setTypeUserData(SbkObjectType* self, void* userData, DeleteUserDataFunc d_func) { - return type->d->user_data; + self->d->user_data = userData; + self->d->d_func = d_func; } } // namespace ObjectType diff --git a/libshiboken/basewrapper.h b/libshiboken/basewrapper.h index 0f836079a..46bc641d9 100644 --- a/libshiboken/basewrapper.h +++ b/libshiboken/basewrapper.h @@ -72,6 +72,8 @@ typedef void (*DeleteUserDataFunc)(void*); typedef void (*ObjectDestructor)(void*); +typedef void (*SubTypeInitHook)(SbkObjectType*, PyObject*, PyObject*); + extern LIBSHIBOKEN_API PyTypeObject SbkObjectType_Type; extern LIBSHIBOKEN_API SbkObjectType SbkObject_Type; @@ -149,10 +151,20 @@ LIBSHIBOKEN_API void setDestructorFunction(SbkObjectType* self, ObjectDes LIBSHIBOKEN_API void initPrivateData(SbkObjectType* self); +/** + * Set the subtype init hook for a type. + * + * This hook will be invoked every time the user creates a sub-type inherited from a Shiboken based type. + * The hook gets 3 params, they are: The new type being created, args and kwds. The last two are the very + * same got from tp_new. + */ +LIBSHIBOKEN_API void setSubTypeInitHook(SbkObjectType* self, SubTypeInitHook func); + /** * Get the user data previously set by Shiboken::Object::setTypeUserData */ -LIBSHIBOKEN_API void* getTypeUserData(SbkObjectType* type); +LIBSHIBOKEN_API void* getTypeUserData(SbkObjectType* self); +LIBSHIBOKEN_API void setTypeUserData(SbkObjectType* self, void* userData, DeleteUserDataFunc d_func); } namespace Object { diff --git a/libshiboken/basewrapper_p.h b/libshiboken/basewrapper_p.h index d2814cf73..d738dac5c 100644 --- a/libshiboken/basewrapper_p.h +++ b/libshiboken/basewrapper_p.h @@ -104,6 +104,7 @@ struct SbkObjectTypePrivate /// Type user data void *user_data; DeleteUserDataFunc d_func; + void (*subtype_init)(SbkObjectType*, PyObject*, PyObject*); }; -- cgit v1.2.3