kastiglione updated this revision to Diff 497466. kastiglione added a comment.
Add tests Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D144044/new/ https://reviews.llvm.org/D144044 Files: lldb/source/Commands/CommandObjectExpression.cpp lldb/test/API/commands/expression/po_persistent_result/Makefile lldb/test/API/commands/expression/po_persistent_result/TestPoPersistentResult.py lldb/test/API/commands/expression/po_persistent_result/main.m Index: lldb/test/API/commands/expression/po_persistent_result/main.m =================================================================== --- /dev/null +++ lldb/test/API/commands/expression/po_persistent_result/main.m @@ -0,0 +1,6 @@ +#import <objc/NSObject.h> + +int main() { + NSObject *obj = [NSObject new]; + return 0; // break here +} Index: lldb/test/API/commands/expression/po_persistent_result/TestPoPersistentResult.py =================================================================== --- /dev/null +++ lldb/test/API/commands/expression/po_persistent_result/TestPoPersistentResult.py @@ -0,0 +1,31 @@ +""" +Test behavior of `po` and persistent results. +""" + +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestCase(TestBase): + def setUp(self): + TestBase.setUp(self) + self.build() + lldbutil.run_to_source_breakpoint(self, "break here", lldb.SBFileSpec("main.m")) + + def test_po_does_not_print_persistent_result(self): + """Test `po` doesn't advertise a persistent result variable.""" + self.expect("po obj", matching=False, substrs=["$0 = "]) + + def test_po_does_not_keep_persistent_result(self): + """Test `po` doesn't leak a persistent result variable.""" + self.expect("po obj") + # Verify `po` used a temporary persistent result. In other words, there + # should be no $0 at this point. + self.expect("expression $0", error=True) + self.expect("expression obj", substrs=["$0 = "]) + + def test_expression_description_verbosity(self): + """Test printing object description _and_ opt-in to persistent results.""" + self.expect("expression -O -vfull -- obj", substrs=["$0 = "]) + self.expect("expression $0", substrs=["$0 = "]) Index: lldb/test/API/commands/expression/po_persistent_result/Makefile =================================================================== --- /dev/null +++ lldb/test/API/commands/expression/po_persistent_result/Makefile @@ -0,0 +1,3 @@ +OBJC_SOURCES := main.m + +include Makefile.rules Index: lldb/source/Commands/CommandObjectExpression.cpp =================================================================== --- lldb/source/Commands/CommandObjectExpression.cpp +++ lldb/source/Commands/CommandObjectExpression.cpp @@ -21,6 +21,7 @@ #include "lldb/Target/Process.h" #include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" +#include "lldb/lldb-private-enumerations.h" using namespace lldb; using namespace lldb_private; @@ -346,6 +347,9 @@ CommandObjectExpression::GetEvalOptions(const Target &target) { EvaluateExpressionOptions options; options.SetCoerceToId(m_varobj_options.use_objc); + if (m_command_options.m_verbosity == + eLanguageRuntimeDescriptionDisplayVerbosityCompact) + options.SetSuppressPersistentResult(m_varobj_options.use_objc); options.SetUnwindOnError(m_command_options.unwind_on_error); options.SetIgnoreBreakpoints(m_command_options.ignore_breakpoints); options.SetKeepInMemory(true);
Index: lldb/test/API/commands/expression/po_persistent_result/main.m =================================================================== --- /dev/null +++ lldb/test/API/commands/expression/po_persistent_result/main.m @@ -0,0 +1,6 @@ +#import <objc/NSObject.h> + +int main() { + NSObject *obj = [NSObject new]; + return 0; // break here +} Index: lldb/test/API/commands/expression/po_persistent_result/TestPoPersistentResult.py =================================================================== --- /dev/null +++ lldb/test/API/commands/expression/po_persistent_result/TestPoPersistentResult.py @@ -0,0 +1,31 @@ +""" +Test behavior of `po` and persistent results. +""" + +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestCase(TestBase): + def setUp(self): + TestBase.setUp(self) + self.build() + lldbutil.run_to_source_breakpoint(self, "break here", lldb.SBFileSpec("main.m")) + + def test_po_does_not_print_persistent_result(self): + """Test `po` doesn't advertise a persistent result variable.""" + self.expect("po obj", matching=False, substrs=["$0 = "]) + + def test_po_does_not_keep_persistent_result(self): + """Test `po` doesn't leak a persistent result variable.""" + self.expect("po obj") + # Verify `po` used a temporary persistent result. In other words, there + # should be no $0 at this point. + self.expect("expression $0", error=True) + self.expect("expression obj", substrs=["$0 = "]) + + def test_expression_description_verbosity(self): + """Test printing object description _and_ opt-in to persistent results.""" + self.expect("expression -O -vfull -- obj", substrs=["$0 = "]) + self.expect("expression $0", substrs=["$0 = "]) Index: lldb/test/API/commands/expression/po_persistent_result/Makefile =================================================================== --- /dev/null +++ lldb/test/API/commands/expression/po_persistent_result/Makefile @@ -0,0 +1,3 @@ +OBJC_SOURCES := main.m + +include Makefile.rules Index: lldb/source/Commands/CommandObjectExpression.cpp =================================================================== --- lldb/source/Commands/CommandObjectExpression.cpp +++ lldb/source/Commands/CommandObjectExpression.cpp @@ -21,6 +21,7 @@ #include "lldb/Target/Process.h" #include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" +#include "lldb/lldb-private-enumerations.h" using namespace lldb; using namespace lldb_private; @@ -346,6 +347,9 @@ CommandObjectExpression::GetEvalOptions(const Target &target) { EvaluateExpressionOptions options; options.SetCoerceToId(m_varobj_options.use_objc); + if (m_command_options.m_verbosity == + eLanguageRuntimeDescriptionDisplayVerbosityCompact) + options.SetSuppressPersistentResult(m_varobj_options.use_objc); options.SetUnwindOnError(m_command_options.unwind_on_error); options.SetIgnoreBreakpoints(m_command_options.ignore_breakpoints); options.SetKeepInMemory(true);
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits