================ @@ -96,16 +124,44 @@ Status Status::FromErrorStringWithFormat(const char *format, ...) { return Status(string); } -llvm::Error Status::ToError() const { - if (Success()) - return llvm::Error::success(); - if (m_type == ErrorType::eErrorTypePOSIX) - return llvm::errorCodeToError( - std::error_code(m_code, std::generic_category())); - return llvm::createStringError(AsCString()); +Status Status::FromExpressionError(lldb::ExpressionResults result, + std::string msg) { + return Status(llvm::make_error<ExpressionError>( + std::error_code(result, expression_category()), msg)); } -Status::~Status() = default; +/// Creates a deep copy of all known errors and converts all other +/// errors to a new llvm::StringError. +static llvm::Error cloneError(llvm::Error &error) { + llvm::Error result = llvm::Error::success(); + llvm::consumeError(std::move(result)); + llvm::visitErrors(error, [&](const llvm::ErrorInfoBase &error) { + if (error.isA<MachKernelError>()) + result = llvm::make_error<MachKernelError>(error.convertToErrorCode()); + else if (error.isA<Win32Error>()) + result = llvm::make_error<Win32Error>(error.convertToErrorCode()); + else if (error.isA<ExpressionError>()) + result = llvm::make_error<ExpressionError>(error.convertToErrorCode(), + error.message()); + else + result = + llvm::createStringError(error.convertToErrorCode(), error.message()); + }); + return result; +} + +Status Status::FromError(llvm::Error &&error) { + // Existing clients assume that the conversion to Status consumes + // and destroys the error. Use cloneError to convert all unnown + // errors to strings. + llvm::Error clone = cloneError(error); + llvm::consumeError(std::move(error)); ---------------- adrian-prantl wrote:
I was able to address this issue by adding calls to `Py_INCREF` to `PythonException::PythonException()`. @medismailben Can you review that code? I'm not sure that what I'm doing is correct, for all I know it might cause a leak that hides the problem. https://github.com/llvm/llvm-project/pull/106774 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits