Skip to content

Commit fb95686

Browse files
committed
First draft at handling Invalid type
1 parent ee02051 commit fb95686

File tree

1 file changed

+48
-37
lines changed

1 file changed

+48
-37
lines changed

oi/type_graph/LLDBParser.cpp

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,45 +43,56 @@ Type& LLDBParser::enumerateType(lldb::SBType& type) {
4343

4444
DepthGuard guard(depth_);
4545

46-
Type *t = nullptr;
47-
switch (auto kind = type.GetTypeClass()) {
48-
case lldb::eTypeClassClass:
49-
case lldb::eTypeClassStruct:
50-
case lldb::eTypeClassUnion:
51-
t = &enumerateClass(type);
52-
break;
53-
case lldb::eTypeClassEnumeration:
54-
t = &enumerateEnum(type);
55-
break;
56-
case lldb::eTypeClassTypedef:
57-
t = &enumerateTypedef(type);
58-
break;
59-
case lldb::eTypeClassPointer:
60-
case lldb::eTypeClassReference:
61-
t = &enumeratePointer(type);
62-
break;
63-
case lldb::eTypeClassBuiltin:
64-
t = &enumeratePrimitive(type);
65-
break;
66-
case lldb::eTypeClassArray:
67-
t = &enumerateArray(type);
68-
break;
69-
case lldb::eTypeClassInvalid:
70-
case lldb::eTypeClassBlockPointer:
71-
case lldb::eTypeClassComplexFloat:
72-
case lldb::eTypeClassComplexInteger:
73-
case lldb::eTypeClassFunction:
74-
case lldb::eTypeClassMemberPointer:
75-
case lldb::eTypeClassObjCObject:
76-
case lldb::eTypeClassObjCInterface:
77-
case lldb::eTypeClassObjCObjectPointer:
78-
case lldb::eTypeClassVector:
79-
case lldb::eTypeClassOther:
80-
case lldb::eTypeClassAny:
81-
throw LLDBParserError{"Unhandled type class: " + std::to_string(kind)};
46+
bool isTypeIncomplete = !type.IsTypeComplete();
47+
48+
std::optional<std::reference_wrapper<Type>> t;
49+
try {
50+
switch (auto kind = type.GetTypeClass()) {
51+
case lldb::eTypeClassClass:
52+
case lldb::eTypeClassStruct:
53+
case lldb::eTypeClassUnion:
54+
t = enumerateClass(type);
55+
break;
56+
case lldb::eTypeClassEnumeration:
57+
t = enumerateEnum(type);
58+
break;
59+
case lldb::eTypeClassTypedef:
60+
t = enumerateTypedef(type);
61+
break;
62+
case lldb::eTypeClassPointer:
63+
case lldb::eTypeClassReference:
64+
t = enumeratePointer(type);
65+
break;
66+
case lldb::eTypeClassBuiltin:
67+
t = enumeratePrimitive(type);
68+
break;
69+
case lldb::eTypeClassArray:
70+
t = enumerateArray(type);
71+
break;
72+
case lldb::eTypeClassInvalid:
73+
case lldb::eTypeClassBlockPointer:
74+
case lldb::eTypeClassComplexFloat:
75+
case lldb::eTypeClassComplexInteger:
76+
case lldb::eTypeClassFunction:
77+
case lldb::eTypeClassMemberPointer:
78+
case lldb::eTypeClassObjCObject:
79+
case lldb::eTypeClassObjCInterface:
80+
case lldb::eTypeClassObjCObjectPointer:
81+
case lldb::eTypeClassVector:
82+
case lldb::eTypeClassOther:
83+
case lldb::eTypeClassAny:
84+
throw LLDBParserError{"Unhandled type class: " + std::to_string(kind)};
85+
}
86+
} catch (const LLDBParserError& e) {
87+
if (!isTypeIncomplete)
88+
throw;
89+
}
90+
91+
if (isTypeIncomplete) {
92+
return makeType<Incomplete>(type, *t);
8293
}
8394

84-
return *t;
95+
return t.value();
8596
}
8697

8798
Class& LLDBParser::enumerateClass(lldb::SBType& type) {

0 commit comments

Comments
 (0)