@@ -39,7 +39,7 @@ void CListenerManager::RegisterListener(PyObject* pCallable)
39
39
object oCallable = object (handle<>(borrowed (pCallable)));
40
40
41
41
// Is the callable already in the vector?
42
- if ( !m_vecCallables. HasElement (oCallable) )
42
+ if ( !IsRegistered (oCallable) )
43
43
{
44
44
m_vecCallables.AddToTail (oCallable);
45
45
}
@@ -57,7 +57,7 @@ void CListenerManager::UnregisterListener(PyObject* pCallable)
57
57
// Get the object instance of the callable
58
58
object oCallable = object (handle<>(borrowed (pCallable)));
59
59
60
- int index = m_vecCallables.Find (oCallable);
60
+ int index = FindCallback (oCallable); // m_vecCallables.Find(oCallable);
61
61
62
62
if (index == -1 ) {
63
63
BOOST_RAISE_EXCEPTION (PyExc_ValueError, " Callback not registered." )
@@ -96,7 +96,19 @@ int CListenerManager::GetCount()
96
96
// -----------------------------------------------------------------------------
97
97
bool CListenerManager::IsRegistered (object oCallback)
98
98
{
99
- return m_vecCallables.HasElement (oCallback);
99
+ return FindCallback (oCallback) != -1 ;
100
+ // return m_vecCallables.HasElement(oCallback);
101
+ }
102
+
103
+ int CListenerManager::FindCallback (object oCallback)
104
+ {
105
+ for (int i=0 ; i < m_vecCallables.Count (); ++i) {
106
+ object oCurrent = m_vecCallables[i];
107
+ if (is_same_func (oCallback, oCurrent)) {
108
+ return i;
109
+ }
110
+ }
111
+ return -1 ;
100
112
}
101
113
102
114
object CListenerManager::__getitem__ (unsigned int index)
@@ -111,3 +123,29 @@ void CListenerManager::clear()
111
123
{
112
124
m_vecCallables.RemoveAll ();
113
125
}
126
+
127
+
128
+ // -----------------------------------------------------------------------------
129
+ // Functions
130
+ // -----------------------------------------------------------------------------
131
+ bool is_same_func (object f1, object f2)
132
+ {
133
+ object self1, self2;
134
+ try {
135
+ self1 = f1.attr (" __self__" );
136
+ }
137
+ catch (...) {
138
+ PyErr_Clear ();
139
+ return f1 == f2;
140
+ }
141
+
142
+ try {
143
+ self2 = f2.attr (" __self__" );
144
+ }
145
+ catch (...) {
146
+ PyErr_Clear ();
147
+ return f1 == f2;
148
+ }
149
+
150
+ return self1.ptr () == self2.ptr () && f1.attr (" __func__" ) == f2.attr (" __func__" );
151
+ }
0 commit comments