Skip to content

Commit 3580278

Browse files
Merge pull request swiftlang#8674 from augusto2112/rec-desc-finder
[lldb] Guard SetDescriptorFinderAndClearOnExit against recursion
2 parents b8ce84d + 28101fa commit 3580278

File tree

1 file changed

+30
-25
lines changed

1 file changed

+30
-25
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/ReflectionContext.cpp

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,30 +32,34 @@ struct DescriptorFinderForwarder : public swift::reflection::DescriptorFinder {
3232

3333
std::unique_ptr<swift::reflection::BuiltinTypeDescriptorBase>
3434
getBuiltinTypeDescriptor(const swift::reflection::TypeRef *TR) override {
35-
if (m_descriptor_finder && shouldConsultDescriptorFinder())
36-
return m_descriptor_finder->getBuiltinTypeDescriptor(TR);
35+
if (!m_descriptor_finders.empty() && shouldConsultDescriptorFinder())
36+
return m_descriptor_finders.back()->getBuiltinTypeDescriptor(TR);
3737
return nullptr;
3838
}
3939

4040
std::unique_ptr<swift::reflection::FieldDescriptorBase>
4141
getFieldDescriptor(const swift::reflection::TypeRef *TR) override {
42-
if (m_descriptor_finder && shouldConsultDescriptorFinder())
43-
return m_descriptor_finder->getFieldDescriptor(TR);
42+
if (!m_descriptor_finders.empty() && shouldConsultDescriptorFinder())
43+
return m_descriptor_finders.back()->getFieldDescriptor(TR);
4444
return nullptr;
4545
}
4646

4747
std::unique_ptr<swift::reflection::MultiPayloadEnumDescriptorBase>
4848
getMultiPayloadEnumDescriptor(const swift::reflection::TypeRef *TR) override {
49-
if (m_descriptor_finder && shouldConsultDescriptorFinder())
50-
return m_descriptor_finder->getMultiPayloadEnumDescriptor(TR);
49+
if (!m_descriptor_finders.empty() && shouldConsultDescriptorFinder())
50+
return m_descriptor_finders.back()->getMultiPayloadEnumDescriptor(TR);
5151
return nullptr;
5252
}
53-
void SetExternalDescriptorFinder(
54-
swift::reflection::DescriptorFinder *desciptor_finder) {
55-
m_descriptor_finder = desciptor_finder;
53+
54+
void PushExternalDescriptorFinder(
55+
swift::reflection::DescriptorFinder *descriptor_finder) {
56+
m_descriptor_finders.push_back(descriptor_finder);
5657
}
5758

58-
void ClearExternalDescriptorFinder() { m_descriptor_finder = nullptr; }
59+
void PopExternalDescriptorFinder() {
60+
assert(!m_descriptor_finders.empty() && "m_descriptor_finders is empty!");
61+
m_descriptor_finders.pop_back();
62+
}
5963

6064
void SetImageAdded(bool image_added) {
6165
m_image_added |= image_added;
@@ -76,7 +80,8 @@ struct DescriptorFinderForwarder : public swift::reflection::DescriptorFinder {
7680
}
7781
}
7882

79-
swift::reflection::DescriptorFinder *m_descriptor_finder = nullptr;
83+
llvm::SmallVector<swift::reflection::DescriptorFinder *, 1>
84+
m_descriptor_finders;
8085
bool m_image_added = false;
8186
};
8287

@@ -138,17 +143,17 @@ class TargetReflectionContext : public ReflectionContextInterface {
138143
}
139144

140145
/// Sets the descriptor finder, and on scope exit clears it out.
141-
auto SetDescriptorFinderAndClearOnExit(
146+
auto PushDescriptorFinderAndPopOnExit(
142147
swift::reflection::DescriptorFinder *descriptor_finder) {
143-
m_forwader.SetExternalDescriptorFinder(descriptor_finder);
148+
m_forwader.PushExternalDescriptorFinder(descriptor_finder);
144149
return llvm::make_scope_exit(
145-
[&]() { m_forwader.ClearExternalDescriptorFinder(); });
150+
[&]() { m_forwader.PopExternalDescriptorFinder(); });
146151
}
147152

148153
const swift::reflection::TypeRef *GetTypeRefOrNull(
149154
swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
150155
swift::reflection::DescriptorFinder *descriptor_finder) override {
151-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
156+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
152157
auto type_ref_or_err =
153158
swift::Demangle::decodeMangledType(m_reflection_ctx.getBuilder(), node);
154159
if (type_ref_or_err.isError()) {
@@ -164,7 +169,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
164169
const swift::reflection::TypeRef *type_ref,
165170
swift::remote::TypeInfoProvider *provider,
166171
swift::reflection::DescriptorFinder *descriptor_finder) override {
167-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
172+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
168173
if (!type_ref)
169174
return nullptr;
170175

@@ -188,7 +193,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
188193
GetTypeInfo(const swift::reflection::TypeRef *type_ref,
189194
swift::remote::TypeInfoProvider *provider,
190195
swift::reflection::DescriptorFinder *descriptor_finder) override {
191-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
196+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
192197
if (!type_ref)
193198
return nullptr;
194199

@@ -226,7 +231,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
226231
const swift::reflection::TypeInfo *GetTypeInfoFromInstance(
227232
lldb::addr_t instance, swift::remote::TypeInfoProvider *provider,
228233
swift::reflection::DescriptorFinder *descriptor_finder) override {
229-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
234+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
230235
return m_reflection_ctx.getInstanceTypeInfo(instance, provider);
231236
}
232237

@@ -237,7 +242,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
237242
const swift::reflection::TypeRef *LookupSuperclass(
238243
const swift::reflection::TypeRef *tr,
239244
swift::reflection::DescriptorFinder *descriptor_finder) override {
240-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
245+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
241246
return m_reflection_ctx.getBuilder().lookupSuperclass(tr);
242247
}
243248

@@ -263,7 +268,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
263268
swift::reflection::DescriptorFinder *descriptor_finder,
264269
lldb::addr_t pointer,
265270
std::function<bool(SuperClassType)> fn) override {
266-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
271+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
267272
// Guard against faulty self-referential metadata.
268273
unsigned limit = 256;
269274
auto md_ptr = m_reflection_ctx.readMetadataFromInstance(pointer);
@@ -298,7 +303,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
298303
const swift::reflection::TypeRef *enum_type_ref,
299304
swift::remote::TypeInfoProvider *provider,
300305
swift::reflection::DescriptorFinder *descriptor_finder) override {
301-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
306+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
302307
int32_t case_idx;
303308
if (m_reflection_ctx.projectEnumValue(enum_addr, enum_type_ref, &case_idx,
304309
provider))
@@ -312,7 +317,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
312317
swift::reflection::RemoteAddress existential_address,
313318
const swift::reflection::TypeRef &existential_tr,
314319
swift::reflection::DescriptorFinder *descriptor_finder) override {
315-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
320+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
316321
return m_reflection_ctx.projectExistentialAndUnwrapClass(
317322
existential_address, existential_tr);
318323
}
@@ -321,7 +326,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
321326
ReadTypeFromMetadata(lldb::addr_t metadata_address,
322327
swift::reflection::DescriptorFinder *descriptor_finder,
323328
bool skip_artificial_subclasses) override {
324-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
329+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
325330
return m_reflection_ctx.readTypeFromMetadata(metadata_address,
326331
skip_artificial_subclasses);
327332
}
@@ -330,7 +335,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
330335
ReadTypeFromInstance(lldb::addr_t instance_address,
331336
swift::reflection::DescriptorFinder *descriptor_finder,
332337
bool skip_artificial_subclasses) override {
333-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
338+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
334339
auto metadata_address =
335340
m_reflection_ctx.readMetadataFromInstance(instance_address);
336341
if (!metadata_address) {
@@ -354,7 +359,7 @@ class TargetReflectionContext : public ReflectionContextInterface {
354359
const swift::reflection::TypeRef *type_ref,
355360
swift::reflection::GenericArgumentMap substitutions,
356361
swift::reflection::DescriptorFinder *descriptor_finder) override {
357-
auto on_exit = SetDescriptorFinderAndClearOnExit(descriptor_finder);
362+
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
358363
return type_ref->subst(m_reflection_ctx.getBuilder(), substitutions);
359364
}
360365

0 commit comments

Comments
 (0)