summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libshiboken/sbkenum.cpp6
-rw-r--r--libshiboken/sbkpython.h2
-rw-r--r--tests/samplebinding/enum_test.py3
3 files changed, 10 insertions, 1 deletions
diff --git a/libshiboken/sbkenum.cpp b/libshiboken/sbkenum.cpp
index 0304a1a9..e6da02d7 100644
--- a/libshiboken/sbkenum.cpp
+++ b/libshiboken/sbkenum.cpp
@@ -230,7 +230,10 @@ enum_richcompare(PyObject *self, PyObject *other, int op)
Py_RETURN_FALSE;
}
-
+static Py_hash_t enum_hash(PyObject* pyObj)
+{
+ return PyObject_Hash(reinterpret_cast<SbkEnumObject*>(pyObj)->ob_name);
+}
static PyGetSetDef SbkEnumGetSetList[] = {
{const_cast<char*>("name"), &SbkEnumObject_name},
@@ -507,6 +510,7 @@ PyTypeObject* newTypeWithName(const char* name, const char* cppName)
type->tp_new = SbkEnum_tp_new;
type->tp_as_number = &enum_as_number;
type->tp_richcompare = &enum_richcompare;
+ type->tp_hash = &enum_hash;
DeclaredEnumTypes::instance().addEnumType(type, cppName);
return type;
diff --git a/libshiboken/sbkpython.h b/libshiboken/sbkpython.h
index d269c7e9..850f122f 100644
--- a/libshiboken/sbkpython.h
+++ b/libshiboken/sbkpython.h
@@ -49,6 +49,8 @@
#define SBK_NB_BOOL(x) (x).nb_nonzero
#define SBK_STR_NAME "str"
#define SBK_PyMethod_New(X, Y) PyMethod_New(X, Y, (PyObject*)Py_TYPE(Y))
+
+ #define Py_hash_t long
#endif
#endif
diff --git a/tests/samplebinding/enum_test.py b/tests/samplebinding/enum_test.py
index fefe75ce..6b3609a3 100644
--- a/tests/samplebinding/enum_test.py
+++ b/tests/samplebinding/enum_test.py
@@ -51,6 +51,9 @@ class EnumTest(unittest.TestCase):
enum = SampleNamespace.Option(999)
self.assertEqual(eval(repr(enum)), enum)
+ def testHashability(self):
+ '''Enums should be hashable and different enums with different values should have different hashes'''
+ self.assertNotEqual(hash(SampleNamespace.TwoIn), hash(SampleNamespace.TwoOut))
def testEnumValuesInsideEnum(self):
'''Enum values should be accessible inside the enum as well as outside.'''