Skip to content

Commit

Permalink
MAINT: Help boost::python libraries at least not crash
Browse files Browse the repository at this point in the history
This adds an almost random "sanity check" to `PyArray_EquivTypes`
for the sole purpose of allowing boost::python compiled libs to
_not crash_.
boost::python is buggy, it needs to be fixed.  This may break them
(I am unsure), because some conversions which used to work may fail
here (if they worked, they only worked because random type data may
have matched up correctly for our scalar types).

We could error, or warn or... but I hope boost::python will just fix
this soon enough and future us can just delete the whole branch.

Replaces numpygh-20507
  • Loading branch information
seberg authored and charris committed Dec 17, 2021
1 parent 58cbe90 commit fae64e3
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions numpy/core/src/multiarray/multiarraymodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1478,6 +1478,24 @@ PyArray_EquivTypes(PyArray_Descr *type1, PyArray_Descr *type2)
if (type1 == type2) {
return 1;
}

if (Py_TYPE(Py_TYPE(type1)) == &PyType_Type) {
/*
* 2021-12-17: This case is nonsense and should be removed eventually!
*
* boost::python has/had a bug effectively using EquivTypes with
* `type(arbitrary_obj)`. That is clearly wrong as that cannot be a
* `PyArray_Descr *`. We assume that `type(type(type(arbitrary_obj))`
* is always in practice `type` (this is the type of the metaclass),
* but for our descriptors, `type(type(descr))` is DTypeMeta.
*
* In that case, we just return False. There is a possibility that
* this actually _worked_ effectively (returning 1 sometimes).
* We ignore that possibility for simplicity; it really is not our bug.
*/
return 0;
}

/*
* Do not use PyArray_CanCastTypeTo because it supports legacy flexible
* dtypes as input.
Expand Down

0 comments on commit fae64e3

Please sign in to comment.