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
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to