diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp --- a/lldb/source/Commands/CommandObjectExpression.cpp +++ b/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); diff --git a/lldb/test/API/commands/expression/po_persistent_result/Makefile b/lldb/test/API/commands/expression/po_persistent_result/Makefile new file mode 100644 --- /dev/null +++ b/lldb/test/API/commands/expression/po_persistent_result/Makefile @@ -0,0 +1,3 @@ +OBJC_SOURCES := main.m + +include Makefile.rules diff --git a/lldb/test/API/commands/expression/po_persistent_result/TestPoPersistentResult.py b/lldb/test/API/commands/expression/po_persistent_result/TestPoPersistentResult.py new file mode 100644 --- /dev/null +++ b/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 = "]) diff --git a/lldb/test/API/commands/expression/po_persistent_result/main.m b/lldb/test/API/commands/expression/po_persistent_result/main.m new file mode 100644 --- /dev/null +++ b/lldb/test/API/commands/expression/po_persistent_result/main.m @@ -0,0 +1,6 @@ +#import + +int main() { + NSObject *obj = [NSObject new]; + return 0; // break here +}