blob: 46d293c8943700e13830b4d9b05d6e3d0662a666 [file] [log] [blame]
// 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