diff options
Diffstat (limited to 'libshiboken/sbkenum.cpp')
-rw-r--r-- | libshiboken/sbkenum.cpp | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/libshiboken/sbkenum.cpp b/libshiboken/sbkenum.cpp index 7aea88ad..5ae95ad7 100644 --- a/libshiboken/sbkenum.cpp +++ b/libshiboken/sbkenum.cpp @@ -149,21 +149,44 @@ private: namespace Enum { +PyObject* getEnumItemFromValue(PyTypeObject* enumType, long itemValue) +{ + PyObject *key, *value; + Py_ssize_t pos = 0; + PyObject* values = PyDict_GetItemString(enumType->tp_dict, const_cast<char*>("values")); + + while (PyDict_Next(values, &pos, &key, &value)) { + SbkEnumObject* obj = (SbkEnumObject*)value; + if (obj->ob_ival == itemValue) { + Py_INCREF(obj); + return reinterpret_cast<PyObject*>(obj); + } + } + return 0; +} + PyObject* newItem(PyTypeObject* enumType, long itemValue, const char* itemName) { - if (!itemName) - itemName = ""; - PyObject* pyItemName = PyString_FromString(itemName); + bool newValue = true; + SbkEnumObject* enumObj; + if (!itemName) { + enumObj = reinterpret_cast<SbkEnumObject*>(getEnumItemFromValue(enumType, itemValue)); + if (enumObj) + return reinterpret_cast<PyObject*>(enumObj); + + newValue = false; + if (!enumObj) + itemName = "#out of bounds#"; + } - SbkEnumObject* enumObj = PyObject_New(SbkEnumObject, enumType); - if (!enumObj) { - Py_XDECREF(pyItemName); + enumObj = PyObject_New(SbkEnumObject, enumType); + if (!enumObj) return 0; - } - enumObj->ob_name = pyItemName; + enumObj->ob_name = PyString_FromString(itemName); enumObj->ob_ival = itemValue; - if (itemName) { + + if (newValue) { PyObject* values = PyDict_GetItemString(enumType->tp_dict, const_cast<char*>("values")); if (!values) { values = PyDict_New(); |