Fix msan failure in __repr__ when upgraded to NumPy 1.24.

PiperOrigin-RevId: 505661236
Change-Id: I37ea339679870d23886e3c95f51451349fa1de2c
This commit is contained in:
Saran Tunyasuvunakool
2023-01-30 05:10:39 -08:00
committed by Copybara-Service
parent 929e09f84a
commit f1af86cf82
3 changed files with 41 additions and 2 deletions
+37
View File
@@ -808,6 +808,25 @@ using MjvFigureWrapper = MjWrapper<raw::MjvFigure>;
template <>
struct enable_if_mj_struct<raw::MjvFigure> { using type = void; };
#ifdef MEMORY_SANITIZER
template <typename T>
class ScopedMsanDisabler {
public:
ScopedMsanDisabler(T* mj)
: mj_(mj), shadow_(std::malloc(mj_->nbuffer)) {
__msan_copy_shadow(shadow_, mj_->buffer, mj_->nbuffer);
__msan_unpoison(mj_->buffer, mj_->nbuffer);
}
~ScopedMsanDisabler() {
__msan_copy_shadow(mj_->buffer, shadow_, mj_->nbuffer);
std::free(shadow_);
}
private:
T* mj_;
void* shadow_;
};
#endif
} // namespace _impl
template <typename T>
@@ -1078,6 +1097,24 @@ std::string StructRepr(pybind11::object self) {
return result.str();
}
template <typename T>
std::string MjModelStructRepr(pybind11::object self) {
#ifdef MEMORY_SANITIZER
_impl::ScopedMsanDisabler<raw::MjModel> msan_disabler(
pybind11::cast<T&>(self).ptr());
#endif
return StructRepr<T>(self);
}
template <typename T>
std::string MjDataStructRepr(pybind11::object self) {
#ifdef MEMORY_SANITIZER
_impl::ScopedMsanDisabler<raw::MjData> msan_disabler(
pybind11::cast<T&>(self).ptr());
#endif
return StructRepr<T>(self);
}
template <typename C, typename... O>
void DefineStructFunctions(pybind11::class_<C, O...> c) {
c.def("__eq__", StructsEqual<C>);