diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2010-04-01 18:10:37 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2010-04-05 18:39:52 -0300 |
commit | 319e5f2467e8682865f1206ae4ce4b3e2bdff147 (patch) | |
tree | 32ec9d4d6ba9c0b4e509db1e24043386cdc496fe | |
parent | 9a5e72d08f908183d7bf8abcb3546cf509f9362d (diff) |
Added enum meta type, this will ease you to known if a PyObject is a Shiboken enum.
-rw-r--r-- | cppgenerator.cpp | 2 | ||||
-rw-r--r-- | libshiboken/basewrapper.cpp | 3 | ||||
-rw-r--r-- | libshiboken/pyenum.cpp | 49 | ||||
-rw-r--r-- | libshiboken/pyenum.h | 7 |
4 files changed, 60 insertions, 1 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index 388d45e96..c1881a44f 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -2441,7 +2441,7 @@ void CppGenerator::writeEnumDefinition(QTextStream& s, const AbstractMetaEnum* c s << "static PyObject* " << newFunc << "(PyTypeObject*, PyObject*, PyObject*);" << endl << endl; s << "static PyTypeObject " << cpythonName << "_Type = {" << endl; - s << INDENT << "PyObject_HEAD_INIT(&PyType_Type)" << endl; + s << INDENT << "PyObject_HEAD_INIT(&Shiboken::SbkEnumType_Type)" << endl; s << INDENT << "/*ob_size*/ 0," << endl; s << INDENT << "/*tp_name*/ \"" << cppEnum->name() << "\"," << endl; s << INDENT << "/*tp_basicsize*/ sizeof(Shiboken::SbkEnumObject)," << endl; diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp index 36e14b10f..92b6b1d3e 100644 --- a/libshiboken/basewrapper.cpp +++ b/libshiboken/basewrapper.cpp @@ -496,6 +496,9 @@ void initShiboken() PyEval_InitThreads(); #endif + if (PyType_Ready(&SbkEnumType_Type) < 0) + Py_FatalError("[libshiboken] Failed to initialise Shiboken.SbkEnumType metatype."); + if (PyType_Ready(&SbkBaseWrapperType_Type) < 0) Py_FatalError("[libshiboken] Failed to initialise Shiboken.BaseWrapperType metatype."); diff --git a/libshiboken/pyenum.cpp b/libshiboken/pyenum.cpp index b7bacc9e6..7b9d05d03 100644 --- a/libshiboken/pyenum.cpp +++ b/libshiboken/pyenum.cpp @@ -37,6 +37,55 @@ namespace Shiboken { +PyTypeObject SbkEnumType_Type = { + PyObject_HEAD_INIT(0) + /*ob_size*/ 0, + /*tp_name*/ "Shiboken.EnumType", + /*tp_basicsize*/ sizeof(PyTypeObject), + /*tp_itemsize*/ 0, + /*tp_dealloc*/ 0, + /*tp_print*/ 0, + /*tp_getattr*/ 0, + /*tp_setattr*/ 0, + /*tp_compare*/ 0, + /*tp_repr*/ 0, + /*tp_as_number*/ 0, + /*tp_as_sequence*/ 0, + /*tp_as_mapping*/ 0, + /*tp_hash*/ 0, + /*tp_call*/ 0, + /*tp_str*/ 0, + /*tp_getattro*/ 0, + /*tp_setattro*/ 0, + /*tp_as_buffer*/ 0, + /*tp_flags*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, + /*tp_doc*/ 0, + /*tp_traverse*/ 0, + /*tp_clear*/ 0, + /*tp_richcompare*/ 0, + /*tp_weaklistoffset*/ 0, + /*tp_iter*/ 0, + /*tp_iternext*/ 0, + /*tp_methods*/ 0, + /*tp_members*/ 0, + /*tp_getset*/ 0, + /*tp_base*/ &PyType_Type, + /*tp_dict*/ 0, + /*tp_descr_get*/ 0, + /*tp_descr_set*/ 0, + /*tp_dictoffset*/ 0, + /*tp_init*/ 0, + /*tp_alloc*/ 0, + /*tp_new*/ PyType_GenericNew, + /*tp_free*/ 0, + /*tp_is_gc*/ 0, + /*tp_bases*/ 0, + /*tp_mro*/ 0, + /*tp_cache*/ 0, + /*tp_subclasses*/ 0, + /*tp_weaklist*/ 0 +}; + PyObject* SbkEnumObject_New(PyTypeObject *type, long item_value, PyObject* item_name) { diff --git a/libshiboken/pyenum.h b/libshiboken/pyenum.h index cb8bb48fb..a29a7f1c5 100644 --- a/libshiboken/pyenum.h +++ b/libshiboken/pyenum.h @@ -50,11 +50,18 @@ typedef struct { PyObject* ob_name; } SbkEnumObject; +LIBSHIBOKEN_API PyAPI_DATA(PyTypeObject) SbkEnumType_Type; + LIBSHIBOKEN_API PyAPI_FUNC(PyObject*) SbkEnumObject_repr(PyObject* self); LIBSHIBOKEN_API PyAPI_FUNC(PyObject*) SbkEnumObject_name(PyObject* self); } // extern "C" +inline bool isShibokenEnum(PyObject* pyObj) +{ + return pyObj->ob_type->ob_type == &SbkEnumType_Type; +} + LIBSHIBOKEN_API PyObject* SbkEnumObject_New(PyTypeObject *instanceType, long item_value, const char* item_name); |