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 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/main.mm =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/main.mm @@ -0,0 +1,11 @@ +#import +@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/util.mm =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/util.mm @@ -0,0 +1,16 @@ +#import + +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_obj_c/Makefile =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name_obj_c/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../make +OBJCXX_SOURCES := main.mm util.mm +include $(LEVEL)/Makefile.rules + +LDFLAGS += -framework Foundation Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name_obj_c/TestNamespaceLocalVarSameNameObjC.py =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name_obj_c/TestNamespaceLocalVarSameNameObjC.py @@ -0,0 +1,19 @@ +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TestNamespaceLocalVarSameNameObjC(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @skipUnlessDarwin + @add_test_categories(["gmodules"]) + def test_namespace_local_var_same_name_objc(self): + self.build() + + lldbutil.run_to_source_breakpoint(self, '// break here', + lldb.SBFileSpec("main.m", False)) + + self.expect("expr error", + substrs=['(NSError *) $0 =']) Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name_obj_c/main.m =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name_obj_c/main.m @@ -0,0 +1,13 @@ +#import +@interface Util : NSObject ++ (void)debugPrintError; +@end + +int main(int argc, const char * argv[]) { + [Util debugPrintError]; + NSError* error = [NSError errorWithDomain:NSURLErrorDomain code:-1 userInfo:nil]; + NSLog(@"xxx, error = %@", error); + + return 0; // break here +} + Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name_obj_c/util.mm =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name_obj_c/util.mm @@ -0,0 +1,16 @@ +#import + +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); +} +@end Index: source/Expression/ExpressionSourceCode.cpp =================================================================== --- source/Expression/ExpressionSourceCode.cpp +++ source/Expression/ExpressionSourceCode.cpp @@ -162,13 +162,23 @@ } static void AddLocalVariableDecls(const lldb::VariableListSP &var_list_sp, - StreamString &stream) { + StreamString &stream, + lldb::LanguageType wrapping_language) { for (size_t i = 0; i < var_list_sp->GetSize(); i++) { lldb::VariableSP var_sp = var_list_sp->GetVariableAtIndex(i); ConstString var_name = var_sp->GetName(); - if (!var_name || var_name == ConstString("this") || - var_name == ConstString(".block_descriptor")) + + // We can check for .block_descriptor w/o checking for langauge since this + // is not a valid identifier in either C or C++. + if (!var_name || var_name == ConstString(".block_descriptor")) + continue; + + if((var_name == ConstString("self") || var_name == ConstString("_cmd")) && + (wrapping_language == lldb::eLanguageTypeObjC || wrapping_language == lldb::eLanguageTypeObjC_plus_plus)) + continue; + + if (var_name == ConstString("this") && wrapping_language == lldb::eLanguageTypeC_plus_plus ) continue; stream.Printf("using $__lldb_local_vars::%s;\n", var_name.AsCString()); @@ -252,15 +262,12 @@ } } - if (add_locals) { - if (Language::LanguageIsCPlusPlus(frame->GetLanguage())) { + if (add_locals) if (target->GetInjectLocalVariables(&exe_ctx)) { lldb::VariableListSP var_list_sp = frame->GetInScopeVariableList(false, true); - AddLocalVariableDecls(var_list_sp, lldb_local_var_decls); + AddLocalVariableDecls(var_list_sp, lldb_local_var_decls, wrapping_language); } - } - } } if (m_wrap) { @@ -326,10 +333,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" @@ -338,10 +347,13 @@ "@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()); + //m_name.c_str(), m_name.c_str(), tagged_body.c_str()); } break; }