| // 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 |