@@ -87,43 +87,55 @@ Type& DrgnParser::enumerateType(struct drgn_type* type) {
87
87
if (auto it = drgn_types_.find (type); it != drgn_types_.end ())
88
88
return it->second ;
89
89
90
- if (!drgn_utils::isSizeComplete (type) &&
91
- drgn_type_kind (type) != DRGN_TYPE_VOID) {
92
- return makeType<Primitive>(nullptr , Primitive::Kind::Incomplete);
93
- }
90
+ bool isTypeIncomplete = !drgn_utils::isSizeComplete (type) &&
91
+ drgn_type_kind (type) != DRGN_TYPE_VOID;
94
92
95
93
enum drgn_type_kind kind = drgn_type_kind (type);
96
94
Type* t = nullptr ;
97
95
depth_++;
98
- switch (kind) {
99
- case DRGN_TYPE_CLASS:
100
- case DRGN_TYPE_STRUCT:
101
- case DRGN_TYPE_UNION:
102
- t = &enumerateClass (type);
103
- break ;
104
- case DRGN_TYPE_ENUM:
105
- t = &enumerateEnum (type);
106
- break ;
107
- case DRGN_TYPE_TYPEDEF:
108
- t = &enumerateTypedef (type);
109
- break ;
110
- case DRGN_TYPE_POINTER:
111
- t = &enumeratePointer (type);
112
- break ;
113
- case DRGN_TYPE_ARRAY:
114
- t = &enumerateArray (type);
115
- break ;
116
- case DRGN_TYPE_INT:
117
- case DRGN_TYPE_BOOL:
118
- case DRGN_TYPE_FLOAT:
119
- case DRGN_TYPE_VOID:
120
- t = &enumeratePrimitive (type);
121
- break ;
122
- default :
123
- throw DrgnParserError{" Unknown drgn type kind: " + std::to_string (kind)};
96
+ try {
97
+ switch (kind) {
98
+ case DRGN_TYPE_CLASS:
99
+ case DRGN_TYPE_STRUCT:
100
+ case DRGN_TYPE_UNION:
101
+ t = &enumerateClass (type);
102
+ break ;
103
+ case DRGN_TYPE_ENUM:
104
+ t = &enumerateEnum (type);
105
+ break ;
106
+ case DRGN_TYPE_TYPEDEF:
107
+ t = &enumerateTypedef (type);
108
+ break ;
109
+ case DRGN_TYPE_POINTER:
110
+ t = &enumeratePointer (type);
111
+ break ;
112
+ case DRGN_TYPE_ARRAY:
113
+ t = &enumerateArray (type);
114
+ break ;
115
+ case DRGN_TYPE_INT:
116
+ case DRGN_TYPE_BOOL:
117
+ case DRGN_TYPE_FLOAT:
118
+ case DRGN_TYPE_VOID:
119
+ t = &enumeratePrimitive (type);
120
+ break ;
121
+ default :
122
+ throw DrgnParserError{" Unknown drgn type kind: " +
123
+ std::to_string (kind)};
124
+ }
125
+ } catch (const DrgnParserError& e) {
126
+ if (isTypeIncomplete) {
127
+ t = &makeType<Primitive>(type, Primitive::Kind::Incomplete);
128
+ } else {
129
+ depth_--;
130
+ throw e;
131
+ }
124
132
}
125
133
depth_--;
126
134
135
+ if (isTypeIncomplete) {
136
+ return makeType<Incomplete>(nullptr , *t);
137
+ }
138
+
127
139
return *t;
128
140
}
129
141
0 commit comments