diff options
4 files changed, 69 insertions, 14 deletions
diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index edc5287919b..bcf840f93ed 100644 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -95,32 +95,51 @@ public: ResultSet &results) override; }; - template <typename TypeScavenger1, typename TypeScavenger2> + template <typename... ScavengerTypes> class EitherTypeScavenger : public TypeScavenger { + public: + EitherTypeScavenger() : TypeScavenger(), m_scavengers() { + for (std::shared_ptr<TypeScavenger> scavenger : { std::shared_ptr<TypeScavenger>(new ScavengerTypes())... }) { + if (scavenger) + m_scavengers.push_back(scavenger); + } + } + protected: bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, ResultSet &results) override { const bool append = false; - auto ts1 = TypeScavenger1(); - if (ts1.Find(exe_scope, key, results, append)) - return true; - auto ts2 = TypeScavenger2(); - if (ts2.Find(exe_scope, key, results, append)) - return true; + for (auto& scavenger : m_scavengers) { + if (scavenger && scavenger->Find(exe_scope, key, results, append)) + return true; + } return false; } + private: + std::vector<std::shared_ptr<TypeScavenger>> m_scavengers; }; - template <typename TypeScavenger1, typename TypeScavenger2> - class BothTypeScavenger : public TypeScavenger { + template <typename... ScavengerTypes> + class UnionTypeScavenger : public TypeScavenger { + public: + UnionTypeScavenger() : TypeScavenger(), m_scavengers() { + for (std::shared_ptr<TypeScavenger> scavenger : { std::shared_ptr<TypeScavenger>(new ScavengerTypes())... }) { + if (scavenger) + m_scavengers.push_back(scavenger); + } + } + protected: bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, ResultSet &results) override { const bool append = true; - auto ts1 = TypeScavenger1(); - bool success = ts1.Find(exe_scope, key, results, append); - auto ts2 = TypeScavenger2(); - success = ts2.Find(exe_scope, key, results, append) || success; + bool success = false; + for (auto& scavenger : m_scavengers) { + if (scavenger) + success = scavenger->Find(exe_scope, key, results, append) || success; + } return success; } + private: + std::vector<std::shared_ptr<TypeScavenger>> m_scavengers; }; enum class FunctionNameRepresentation { diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py index 62f7766604c..b0f52923cc1 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py @@ -52,3 +52,4 @@ class TypeLookupTestCase(TestBase): "no type was found matching 'PleaseDontBeARealTypeThatExists'"]) self.expect('type lookup MyCPPClass', substrs=['setF', 'float getF']) self.expect('type lookup MyClass', substrs=['setF', 'float getF']) + self.expect('type lookup MyObjCClass', substrs=['@interface MyObjCClass', 'int x', 'int y']) diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm index d522e0b16d7..f62e5cb5b8c 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm +++ b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm @@ -28,6 +28,28 @@ private: typedef MyCPPClass MyClass; +@interface MyObjCClass : NSObject { + int x; +} +- (id)init; +- (int)read; +@end + +@implementation MyObjCClass { + int y; +} +- (id)init { + if (self = [super init]) { + self->x = 12; + self->y = 24; + } + return self; +} +- (int)read { + return self->x + self->y; +} +@end + int main (int argc, const char * argv[]) { MyClass my_cpp(3.1415); diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp index 76a940ba4b7..526ace119d6 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp @@ -994,10 +994,23 @@ std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() { friend class lldb_private::ObjCLanguage; }; + + class ObjCDebugInfoScavenger : public Language::ImageListTypeScavenger { + public: + virtual CompilerType AdjustForInclusion(CompilerType &candidate) override { + LanguageType lang_type(candidate.GetMinimumLanguage()); + if (!Language::LanguageIsObjC(lang_type)) + return CompilerType(); + if (candidate.IsTypedefType()) + return candidate.GetTypedefedType(); + return candidate; + } + }; return std::unique_ptr<TypeScavenger>( new Language::EitherTypeScavenger<ObjCModulesScavenger, - ObjCRuntimeScavenger>()); + ObjCRuntimeScavenger, + ObjCDebugInfoScavenger>()); } bool ObjCLanguage::GetFormatterPrefixSuffix(ValueObject &valobj, |