diff --git a/python/src/load.cpp b/python/src/load.cpp index f98307f1..60504986 100644 --- a/python/src/load.cpp +++ b/python/src/load.cpp @@ -162,8 +162,12 @@ class PyFileReader : public mx::io::Reader { private: void _read(char* data, size_t n) { - auto memview = PyMemoryView_FromMemory(data, n, PyBUF_WRITE); - nb::object bytes_read = readinto_func_(nb::handle(memview)); + nb::object memview = + nb::steal(PyMemoryView_FromMemory(data, n, PyBUF_WRITE)); + if (!memview.is_valid()) { + throw std::runtime_error("[load] Failed to create memoryview for read"); + } + nb::object bytes_read = readinto_func_(memview); if (bytes_read.is_none() || nb::cast(bytes_read) < n) { throw std::runtime_error("[load] Failed to read from python stream"); @@ -374,9 +378,12 @@ class PyFileWriter : public mx::io::Writer { void write(const char* data, size_t n) override { nb::gil_scoped_acquire gil; - auto memview = - PyMemoryView_FromMemory(const_cast(data), n, PyBUF_READ); - nb::object bytes_written = write_func_(nb::handle(memview)); + nb::object memview = nb::steal( + PyMemoryView_FromMemory(const_cast(data), n, PyBUF_READ)); + if (!memview.is_valid()) { + throw std::runtime_error("[load] Failed to create memoryview for write"); + } + nb::object bytes_written = write_func_(memview); if (bytes_written.is_none() || nb::cast(bytes_written) < n) { throw std::runtime_error("[load] Failed to write to python stream");