| // Copyright 2019 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 |
| |
| #include "./status_utils.h" |
| |
| namespace iree { |
| namespace python { |
| |
| namespace { |
| |
| PyObject* ApiStatusToPyExcClass(iree_status_t status) { |
| switch (iree_status_code(status)) { |
| case IREE_STATUS_INVALID_ARGUMENT: |
| return PyExc_ValueError; |
| case IREE_STATUS_NOT_FOUND: |
| return PyExc_ValueError; |
| case IREE_STATUS_OUT_OF_RANGE: |
| return PyExc_IndexError; |
| case IREE_STATUS_UNIMPLEMENTED: |
| return PyExc_NotImplementedError; |
| default: |
| return PyExc_RuntimeError; |
| } |
| } |
| |
| } // namespace |
| |
| std::string ApiStatusToString(iree_status_t status) { |
| iree_host_size_t buffer_length = 0; |
| if (IREE_UNLIKELY(!iree_status_format(status, /*buffer_capacity=*/0, |
| /*buffer=*/NULL, &buffer_length))) { |
| return ""; |
| } |
| std::string result; |
| result.resize(buffer_length); |
| // NOTE: buffer capacity needs to be +1 for the NUL terminator in snprintf. |
| return iree_status_format(status, result.size() + 1, |
| const_cast<char*>(result.data()), &buffer_length) |
| ? result |
| : ""; |
| } |
| |
| nanobind::python_error ApiStatusToPyExc(iree_status_t status, |
| const char* message) { |
| assert(!iree_status_is_ok(status)); |
| std::string full_message; |
| |
| auto status_str = ApiStatusToString(status); |
| if (status_str.empty()) { |
| full_message = std::string(message) + ": " + |
| iree_status_code_string(iree_status_code(status)); |
| } else { |
| full_message = std::string(message) + ": " + status_str; |
| } |
| |
| PyErr_SetString(ApiStatusToPyExcClass(status), full_message.c_str()); |
| iree_status_ignore(status); |
| return nanobind::python_error(); |
| } |
| |
| nanobind::python_error RaisePyError(PyObject* exc_class, const char* message) { |
| PyErr_SetString(exc_class, message); |
| return nanobind::python_error(); |
| } |
| |
| } // namespace python |
| } // namespace iree |