diff options
author | Renato Araujo Oliveira Filho <renato.filho@openbossa.org> | 2011-01-28 11:57:21 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:13:51 -0300 |
commit | cf25d3b294c1e6497ce5f7a9644d98c9d460500c (patch) | |
tree | db35071ab8c510ef0f742fdcc0b773f1f70e6a6e /libshiboken | |
parent | fd8e28fa13c7424f0ebba60d90d025cf4ac3b7b9 (diff) |
Fixed enum __repr__ function.
fixes bug #617.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libshiboken')
-rw-r--r-- | libshiboken/sbkenum.cpp | 41 | ||||
-rw-r--r-- | libshiboken/sbkenum.h | 1 |
2 files changed, 33 insertions, 9 deletions
diff --git a/libshiboken/sbkenum.cpp b/libshiboken/sbkenum.cpp index 7aea88ad2..5ae95ad75 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(); diff --git a/libshiboken/sbkenum.h b/libshiboken/sbkenum.h index 50ac9220a..95b500ca4 100644 --- a/libshiboken/sbkenum.h +++ b/libshiboken/sbkenum.h @@ -46,6 +46,7 @@ namespace Enum LIBSHIBOKEN_API PyObject* newItem(PyTypeObject* enumType, long itemValue, const char* itemName = 0); LIBSHIBOKEN_API PyTypeObject* newType(const char* name); LIBSHIBOKEN_API long getValue(PyObject* enumItem); + LIBSHIBOKEN_API PyObject* getEnumItemFromValue(PyTypeObject* enumType, long itemValue); } } // namespace Shiboken |