shafik created this revision.
shafik added reviewers: jingham, teemperor.
Herald added a subscriber: jdoerfert.
In an Objective-C context a local variable and namespace can cause an ambiguous
name lookup when used in an expression. The solution involves mimicking the
existing C++ solution which is to add local using declarations for local
variables. This causes a different type of lookup to be used which eliminates
the namespace during acceptable results filtering.
https://reviews.llvm.org/D59960
Files:
packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/Makefile
packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/TestNamespaceLocalVarSameName.py
packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/main.mm
packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/util.mm
source/Expression/ExpressionSourceCode.cpp
Index: source/Expression/ExpressionSourceCode.cpp
===================================================================
--- source/Expression/ExpressionSourceCode.cpp
+++ source/Expression/ExpressionSourceCode.cpp
@@ -168,6 +168,7 @@
ConstString var_name = var_sp->GetName();
if (!var_name || var_name == ConstString("this") ||
+ var_name == ConstString("self") || var_name == ConstString("_cmd") ||
var_name == ConstString(".block_descriptor"))
continue;
@@ -252,7 +253,7 @@
}
}
- if (add_locals) {
+ if (add_locals)
if (Language::LanguageIsCPlusPlus(frame->GetLanguage())) {
if (target->GetInjectLocalVariables(&exe_ctx)) {
lldb::VariableListSP var_list_sp =
@@ -260,7 +261,6 @@
AddLocalVariableDecls(var_list_sp, lldb_local_var_decls);
}
}
- }
}
if (m_wrap) {
@@ -326,10 +326,12 @@
"@implementation $__lldb_objc_class ($__lldb_category) \n"
"+(void)%s:(void *)$__lldb_arg \n"
"{ \n"
+ " %s; \n"
"%s"
"} \n"
"@end \n",
- m_name.c_str(), m_name.c_str(), tagged_body.c_str());
+ m_name.c_str(), m_name.c_str(), lldb_local_var_decls.GetData(),
+ tagged_body.c_str());
} else {
wrap_stream.Printf(
"@interface $__lldb_objc_class ($__lldb_category) \n"
Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/util.mm
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/util.mm
@@ -0,0 +1,16 @@
+#import <Foundation/Foundation.h>
+
+namespace error {
+int blah;
+}
+
+@interface Util : NSObject
++ (void)debugPrintError;
+@end
+
+@implementation Util
++ (void)debugPrintError {
+ NSError* error = [NSError errorWithDomain:NSURLErrorDomain code:-1 userInfo:nil];
+ NSLog(@"xxx, error = %@", error); // break here
+}
+@end
Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/main.mm
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/main.mm
@@ -0,0 +1,11 @@
+#import <Foundation/Foundation.h>
+@interface Util : NSObject
++ (void)debugPrintError;
+@end
+
+int main(int argc, const char * argv[]) {
+ [Util debugPrintError];
+
+ return 0;
+}
+
Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/TestNamespaceLocalVarSameName.py
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/TestNamespaceLocalVarSameName.py
@@ -0,0 +1,19 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestNamespaceLocalVarSameName(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipUnlessDarwin
+ @add_test_categories(["gmodules"])
+ def test_namespace_local_var_same_name(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self, '// break here',
+ lldb.SBFileSpec("util.mm", False))
+
+ self.expect("expr error",
+ substrs=['(NSError *) $0 ='])
Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/Makefile
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../make
+OBJCXX_SOURCES := main.mm util.mm
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits