Skip to content

Commit 3d35807

Browse files
committed
[lldb] Check for ErrorType in SwiftASTContext::ReconstructType
rdar://150211941
1 parent 091662c commit 3d35807

File tree

5 files changed

+26
-23
lines changed

5 files changed

+26
-23
lines changed

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "Plugins/ExpressionParser/Swift/SwiftPersistentExpressionState.h"
1717

1818
#include "SwiftASTContext.h"
19+
#include "SwiftDemangle.h"
1920
#include "TypeSystemSwift.h"
2021
#include "TypeSystemSwiftTypeRef.h"
2122
#include "lldb/Utility/Log.h"
@@ -4694,6 +4695,12 @@ SwiftASTContext::ReconstructType(ConstString mangled_typename) {
46944695
"\" is not a valid Swift mangled name");
46954696
}
46964697

4698+
if (swift_demangle::ContainsError(mangled_typename)) {
4699+
LOG_PRINTF(GetLog(LLDBLog::Types),
4700+
"(\"%s\") -- cannot reconstruct ErrorType", mangled_cstr);
4701+
return llvm::createStringError("cannot reconstruct ErrorType");
4702+
}
4703+
46974704
LOG_VERBOSE_PRINTF(GetLog(LLDBLog::Types), "(\"%s\")", mangled_cstr);
46984705

46994706
ThreadSafeASTContext ast_ctx = GetASTContext();

lldb/source/Plugins/TypeSystem/Swift/SwiftDemangle.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,20 @@ GetMangledName(swift::Demangle::Demangler &dem,
224224
return mangleNode(global, flavor);
225225
}
226226

227+
/// Returns true if this type contains an error node anywhere.
228+
inline bool ContainsError(StringRef mangled_name) {
229+
using namespace swift::Demangle;
230+
Demangler dem;
231+
NodePointer node = GetDemangledType(dem, mangled_name);
232+
return swift_demangle::FindIf(node, [](NodePointer node) -> bool {
233+
// This node is an in-band error, not a Swift.Error type, which is a
234+
// protocol.
235+
if (node->getKind() == Node::Kind::ErrorType)
236+
return true;
237+
return false;
238+
});
239+
}
240+
227241
} // namespace swift_demangle
228242
} // namespace lldb_private
229243

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,7 +2301,7 @@ void *TypeSystemSwiftTypeRef::ReconstructType(opaque_compiler_type_t type,
23012301
return nullptr;
23022302

23032303
// This can crash SwiftASTContext.
2304-
if (ContainsError(type))
2304+
if (swift_demangle::ContainsError(AsMangledName(type)))
23052305
return nullptr;
23062306

23072307
auto swift_ast_context = GetSwiftASTContext(GetSymbolContext(exe_ctx));
@@ -2919,20 +2919,6 @@ bool TypeSystemSwiftTypeRef::IsExpressionEvaluatorDefined(
29192919
});
29202920
}
29212921

2922-
bool TypeSystemSwiftTypeRef::ContainsError(
2923-
lldb::opaque_compiler_type_t type) {
2924-
using namespace swift::Demangle;
2925-
const auto *mangled_name = AsMangledName(type);
2926-
Demangler dem;
2927-
NodePointer node = GetDemangledType(dem, mangled_name);
2928-
return swift_demangle::FindIf(node, [](NodePointer node) -> bool {
2929-
// This node is an in-band error, not a Swift.Error type, which is a protocol.
2930-
if (node->getKind() == Node::Kind::ErrorType)
2931-
return true;
2932-
return false;
2933-
});
2934-
}
2935-
29362922
CompilerType TypeSystemSwiftTypeRef::CreateGenericTypeParamType(
29372923
unsigned int depth, unsigned int index,
29382924
swift::Mangle::ManglingFlavor flavor) {

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,6 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
458458
swift::Mangle::ManglingFlavor
459459
GetManglingFlavor(ExecutionContext *exe_ctx = nullptr);
460460

461-
/// Returns true if this type contains an error node anywhere.
462-
bool ContainsError(lldb::opaque_compiler_type_t type);
463-
464461
protected:
465462
/// Determine whether the fallback is enabled via setting.
466463
bool UseSwiftASTContextFallback(const char *func_name,

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212

1313
#include "gtest/gtest.h"
1414

15-
#include "Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
1615
#include "Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.h"
17-
#include "llvm/ADT/StringRef.h"
16+
#include "Plugins/TypeSystem/Swift/SwiftDemangle.h"
17+
#include "Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
1818
#include "swift/Demangling/Demangle.h"
1919
#include "swift/Demangling/Demangler.h"
2020
#include "swift/Strings.h"
21+
#include "llvm/ADT/StringRef.h"
2122

2223
using namespace lldb;
2324
using namespace lldb_private;
@@ -1036,9 +1037,7 @@ TEST_F(TestTypeSystemSwiftTypeRef, Error) {
10361037
NodeBuilder b(dem);
10371038
{
10381039
NodePointer n = b.GlobalType(b.Node(Node::Kind::ErrorType, "Fatal Error"));
1039-
CompilerType t = GetCompilerType(b.Mangle(n));
1040-
lldb::opaque_compiler_type_t opaque = t.GetOpaqueQualType();
1041-
ASSERT_TRUE(m_swift_ts->ContainsError(opaque));
1040+
ASSERT_TRUE(swift_demangle::ContainsError(b.Mangle(n)));
10421041
}
10431042
}
10441043

0 commit comments

Comments
 (0)