@@ -164,8 +164,12 @@ KHASH_MAP_INIT_COMPLEX128(complex128, size_t)
164
164
165
165
166
166
int PANDAS_INLINE floatobject_cmp (PyFloatObject * a , PyFloatObject * b ){
167
- return Py_IS_NAN (PyFloat_AS_DOUBLE (a )) &&
168
- Py_IS_NAN (PyFloat_AS_DOUBLE (b ));
167
+ return (
168
+ Py_IS_NAN (PyFloat_AS_DOUBLE (a )) &&
169
+ Py_IS_NAN (PyFloat_AS_DOUBLE (b ))
170
+ )
171
+ ||
172
+ ( PyFloat_AS_DOUBLE (a ) == PyFloat_AS_DOUBLE (b ) );
169
173
}
170
174
171
175
@@ -187,6 +191,11 @@ int PANDAS_INLINE complexobject_cmp(PyComplexObject* a, PyComplexObject* b){
187
191
a -> cval .real == b -> cval .real &&
188
192
Py_IS_NAN (a -> cval .imag ) &&
189
193
Py_IS_NAN (b -> cval .imag )
194
+ )
195
+ ||
196
+ (
197
+ a -> cval .real == b -> cval .real &&
198
+ a -> cval .imag == b -> cval .imag
190
199
);
191
200
}
192
201
@@ -210,15 +219,8 @@ int PANDAS_INLINE tupleobject_cmp(PyTupleObject* a, PyTupleObject* b){
210
219
211
220
212
221
int PANDAS_INLINE pyobject_cmp (PyObject * a , PyObject * b ) {
213
- int result = PyObject_RichCompareBool (a , b , Py_EQ );
214
- if (result < 0 ) {
215
- PyErr_Clear ();
216
- return 0 ;
217
- }
218
- if (result == 0 ) { // still could be built-ins with NaNs
219
- if (Py_TYPE (a ) != Py_TYPE (b )) {
220
- return 0 ;
221
- }
222
+ if (Py_TYPE (a ) == Py_TYPE (b )) {
223
+ // special handling for some built-in types which could have NaNs:
222
224
if (PyFloat_CheckExact (a )) {
223
225
return floatobject_cmp ((PyFloatObject * )a , (PyFloatObject * )b );
224
226
}
@@ -228,7 +230,14 @@ int PANDAS_INLINE pyobject_cmp(PyObject* a, PyObject* b) {
228
230
if (PyTuple_CheckExact (a )) {
229
231
return tupleobject_cmp ((PyTupleObject * )a , (PyTupleObject * )b );
230
232
}
233
+ // frozenset isn't yet supported
231
234
}
235
+
236
+ int result = PyObject_RichCompareBool (a , b , Py_EQ );
237
+ if (result < 0 ) {
238
+ PyErr_Clear ();
239
+ return 0 ;
240
+ }
232
241
return result ;
233
242
}
234
243
0 commit comments