Fix ref leak in mx.save/load with file like object (#3187)

This commit is contained in:
AN Long
2026-03-02 16:55:29 -08:00
committed by GitHub
parent 72e04f7fb7
commit 1ce7118303
+12 -5
View File
@@ -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<nb::object>(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<size_t>(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<char*>(data), n, PyBUF_READ);
nb::object bytes_written = write_func_(nb::handle(memview));
nb::object memview = nb::steal<nb::object>(
PyMemoryView_FromMemory(const_cast<char*>(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<size_t>(bytes_written) < n) {
throw std::runtime_error("[load] Failed to write to python stream");