Skip to content

Commit 1553714

Browse files
committed
Revert "[lldb] Change the implementation of Status to store an llvm::Error (NFC) (#106774)"
This reverts commit 104b249 because it has caused 2 test failures on Windows: https://lab.llvm.org/buildbot/#/builders/141/builds/2544 Failed Tests (2): lldb-api :: functionalities/gdb_remote_client/TestGDBRemotePlatformFile.py lldb-unit :: Utility/./UtilityTests.exe/StatusTest/ErrorWin32 I reckon the cause is the same, that we construct an error with the Win32 NO_ERROR value which means there was no error but we're assuming anything with an error code is a failure.
1 parent 9c5ad62 commit 1553714

File tree

4 files changed

+103
-269
lines changed

4 files changed

+103
-269
lines changed

lldb/include/lldb/Utility/Status.h

Lines changed: 9 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -28,67 +28,6 @@ namespace lldb_private {
2828

2929
const char *ExpressionResultAsCString(lldb::ExpressionResults result);
3030

31-
/// Going a bit against the spirit of llvm::Error,
32-
/// lldb_private::Status need to store errors long-term and sometimes
33-
/// copy them. This base class defines an interface for this
34-
/// operation.
35-
class CloneableError
36-
: public llvm::ErrorInfo<CloneableError, llvm::ErrorInfoBase> {
37-
public:
38-
using llvm::ErrorInfo<CloneableError, llvm::ErrorInfoBase>::ErrorInfo;
39-
CloneableError() : ErrorInfo() {}
40-
virtual std::unique_ptr<CloneableError> Clone() const = 0;
41-
static char ID;
42-
};
43-
44-
/// Common base class for all error-code errors.
45-
class CloneableECError
46-
: public llvm::ErrorInfo<CloneableECError, CloneableError> {
47-
public:
48-
using llvm::ErrorInfo<CloneableECError, CloneableError>::ErrorInfo;
49-
std::error_code convertToErrorCode() const override { return EC; }
50-
void log(llvm::raw_ostream &OS) const override { OS << EC.message(); }
51-
static char ID;
52-
53-
protected:
54-
CloneableECError() = delete;
55-
CloneableECError(std::error_code ec) : ErrorInfo(), EC(ec) {}
56-
std::error_code EC;
57-
};
58-
/// FIXME: Move these declarations closer to where they're used.
59-
class MachKernelError
60-
: public llvm::ErrorInfo<MachKernelError, CloneableECError> {
61-
public:
62-
using llvm::ErrorInfo<MachKernelError, CloneableECError>::ErrorInfo;
63-
MachKernelError(std::error_code ec) : ErrorInfo(ec) {}
64-
std::string message() const override;
65-
std::unique_ptr<CloneableError> Clone() const override;
66-
static char ID;
67-
};
68-
69-
class Win32Error : public llvm::ErrorInfo<Win32Error, CloneableECError> {
70-
public:
71-
using llvm::ErrorInfo<Win32Error, CloneableECError>::ErrorInfo;
72-
Win32Error(std::error_code ec, const llvm::Twine &msg = {}) : ErrorInfo(ec) {}
73-
std::string message() const override;
74-
std::unique_ptr<CloneableError> Clone() const override;
75-
static char ID;
76-
};
77-
78-
class ExpressionError
79-
: public llvm::ErrorInfo<ExpressionError, CloneableECError> {
80-
public:
81-
using llvm::ErrorInfo<ExpressionError, CloneableECError>::ErrorInfo;
82-
ExpressionError(std::error_code ec, std::string msg = {})
83-
: ErrorInfo(ec), m_string(msg) {}
84-
std::unique_ptr<CloneableError> Clone() const override;
85-
std::string message() const override { return m_string; }
86-
static char ID;
87-
88-
protected:
89-
std::string m_string;
90-
};
91-
9231
/// \class Status Status.h "lldb/Utility/Status.h" An error handling class.
9332
///
9433
/// This class is designed to be able to hold any error code that can be
@@ -161,7 +100,9 @@ class Status {
161100
}
162101

163102
static Status FromExpressionError(lldb::ExpressionResults result,
164-
std::string msg);
103+
std::string msg) {
104+
return Status(result, lldb::eErrorTypeExpression, msg);
105+
}
165106

166107
/// Set the current error to errno.
167108
///
@@ -174,7 +115,6 @@ class Status {
174115
const Status &operator=(Status &&);
175116
/// Avoid using this in new code. Migrate APIs to llvm::Expected instead.
176117
static Status FromError(llvm::Error error);
177-
178118
/// FIXME: Replace this with a takeError() method.
179119
llvm::Error ToError() const;
180120
/// Don't call this function in new code. Instead, redesign the API
@@ -209,20 +149,12 @@ class Status {
209149

210150
/// Access the error value.
211151
///
212-
/// If the internally stored \ref llvm::Error is an \ref
213-
/// llvm::ErrorList then this returns the error value of the first
214-
/// error.
215-
///
216152
/// \return
217153
/// The error value.
218154
ValueType GetError() const;
219155

220156
/// Access the error type.
221157
///
222-
/// If the internally stored \ref llvm::Error is an \ref
223-
/// llvm::ErrorList then this returns the error value of the first
224-
/// error.
225-
///
226158
/// \return
227159
/// The error type enumeration value.
228160
lldb::ErrorType GetType() const;
@@ -238,9 +170,12 @@ class Status {
238170
bool Success() const;
239171

240172
protected:
241-
Status(llvm::Error error) : m_error(std::move(error)) {}
242-
llvm::Error m_error;
243-
/// TODO: Replace this with just calling toString(m_error).
173+
Status(llvm::Error error);
174+
/// Status code as an integer value.
175+
ValueType m_code = 0;
176+
/// The type of the above error code.
177+
lldb::ErrorType m_type = lldb::eErrorTypeInvalid;
178+
/// A string representation of the error code.
244179
mutable std::string m_string;
245180
};
246181

lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,10 +1108,9 @@ template <typename Base> class OwnedPythonFile : public Base {
11081108
py_error = Status::FromError(r.takeError());
11091109
}
11101110
base_error = Base::Close();
1111-
// Cloning since the wrapped exception may still reference the PyThread.
11121111
if (py_error.Fail())
1113-
return py_error.Clone();
1114-
return base_error.Clone();
1112+
return py_error;
1113+
return base_error;
11151114
};
11161115

11171116
PyObject *GetPythonObject() const {
@@ -1197,17 +1196,15 @@ class PythonIOFile : public OwnedPythonFile<File> {
11971196
return Flush();
11981197
auto r = m_py_obj.CallMethod("close");
11991198
if (!r)
1200-
// Cloning since the wrapped exception may still reference the PyThread.
1201-
return Status::FromError(r.takeError()).Clone();
1199+
return Status::FromError(r.takeError());
12021200
return Status();
12031201
}
12041202

12051203
Status Flush() override {
12061204
GIL takeGIL;
12071205
auto r = m_py_obj.CallMethod("flush");
12081206
if (!r)
1209-
// Cloning since the wrapped exception may still reference the PyThread.
1210-
return Status::FromError(r.takeError()).Clone();
1207+
return Status::FromError(r.takeError());
12111208
return Status();
12121209
}
12131210

@@ -1243,8 +1240,7 @@ class BinaryPythonFile : public PythonIOFile {
12431240
PyObject *pybuffer_p = PyMemoryView_FromMemory(
12441241
const_cast<char *>((const char *)buf), num_bytes, PyBUF_READ);
12451242
if (!pybuffer_p)
1246-
// Cloning since the wrapped exception may still reference the PyThread.
1247-
return Status::FromError(llvm::make_error<PythonException>()).Clone();
1243+
return Status::FromError(llvm::make_error<PythonException>());
12481244
auto pybuffer = Take<PythonObject>(pybuffer_p);
12491245
num_bytes = 0;
12501246
auto bytes_written = As<long long>(m_py_obj.CallMethod("write", pybuffer));
@@ -1264,8 +1260,7 @@ class BinaryPythonFile : public PythonIOFile {
12641260
auto pybuffer_obj =
12651261
m_py_obj.CallMethod("read", (unsigned long long)num_bytes);
12661262
if (!pybuffer_obj)
1267-
// Cloning since the wrapped exception may still reference the PyThread.
1268-
return Status::FromError(pybuffer_obj.takeError()).Clone();
1263+
return Status::FromError(pybuffer_obj.takeError());
12691264
num_bytes = 0;
12701265
if (pybuffer_obj.get().IsNone()) {
12711266
// EOF
@@ -1274,8 +1269,7 @@ class BinaryPythonFile : public PythonIOFile {
12741269
}
12751270
auto pybuffer = PythonBuffer::Create(pybuffer_obj.get());
12761271
if (!pybuffer)
1277-
// Cloning since the wrapped exception may still reference the PyThread.
1278-
return Status::FromError(pybuffer.takeError()).Clone();
1272+
return Status::FromError(pybuffer.takeError());
12791273
memcpy(buf, pybuffer.get().get().buf, pybuffer.get().get().len);
12801274
num_bytes = pybuffer.get().get().len;
12811275
return Status();
@@ -1306,8 +1300,7 @@ class TextPythonFile : public PythonIOFile {
13061300
auto bytes_written =
13071301
As<long long>(m_py_obj.CallMethod("write", pystring.get()));
13081302
if (!bytes_written)
1309-
// Cloning since the wrapped exception may still reference the PyThread.
1310-
return Status::FromError(bytes_written.takeError()).Clone();
1303+
return Status::FromError(bytes_written.takeError());
13111304
if (bytes_written.get() < 0)
13121305
return Status::FromErrorString(
13131306
".write() method returned a negative number!");
@@ -1328,16 +1321,14 @@ class TextPythonFile : public PythonIOFile {
13281321
auto pystring = As<PythonString>(
13291322
m_py_obj.CallMethod("read", (unsigned long long)num_chars));
13301323
if (!pystring)
1331-
// Cloning since the wrapped exception may still reference the PyThread.
1332-
return Status::FromError(pystring.takeError()).Clone();
1324+
return Status::FromError(pystring.takeError());
13331325
if (pystring.get().IsNone()) {
13341326
// EOF
13351327
return Status();
13361328
}
13371329
auto stringref = pystring.get().AsUTF8();
13381330
if (!stringref)
1339-
// Cloning since the wrapped exception may still reference the PyThread.
1340-
return Status::FromError(stringref.takeError()).Clone();
1331+
return Status::FromError(stringref.takeError());
13411332
num_bytes = stringref.get().size();
13421333
memcpy(buf, stringref.get().begin(), num_bytes);
13431334
return Status();

0 commit comments

Comments
 (0)