| // Copyright 2023 The IREE Authors | |
| // | |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // Nanobind removed buffer protocol interop in favor of a new and improved | |
| // ndarray thingy. This thingy is mostly better for a subset of cases but is | |
| // not great for just generically accessing chunks of memory. For cases where | |
| // we do the latter (mapping files, etc), we just have some helpers over the | |
| // low level Python buffer protocol to ease the transition. | |
| #ifndef IREE_BINDINGS_PYTHON_IREE_BUFFER_INTEROP_H_ | |
| #define IREE_BINDINGS_PYTHON_IREE_BUFFER_INTEROP_H_ | |
| #include "./binding.h" | |
| namespace iree::python { | |
| // Represents a Py_buffer obtained via PyObject_GetBuffer() and terminated via | |
| // PyBuffer_Release(). | |
| class PyBufferRequest { | |
| public: | |
| PyBufferRequest(py::object &exporter, int flags) { | |
| int rc = PyObject_GetBuffer(exporter.ptr(), &view_, flags); | |
| if (rc != 0) { | |
| throw py::python_error(); | |
| } | |
| } | |
| ~PyBufferRequest() { PyBuffer_Release(&view_); } | |
| PyBufferRequest(const PyBufferRequest &) = delete; | |
| void operator=(const PyBufferRequest &) = delete; | |
| Py_buffer &view() { return view_; } | |
| private: | |
| Py_buffer view_; | |
| }; | |
| } // namespace iree::python | |
| #endif // IREE_BINDINGS_PYTHON_IREE_BUFFER_INTEROP_H_ |