[Lldb-commits] [lldb] 3328ee5 - [lldb] Suppress persistent result when running po
Dave Lee via lldb-commits
lldb-commits at lists.llvm.org
Thu Feb 16 21:05:32 PST 2023
Author: Dave Lee
Date: 2023-02-16T21:05:19-08:00
New Revision: 3328ee550c86458ade5b3daf5fb4ad97b6a99e6c
URL: https://github.com/llvm/llvm-project/commit/3328ee550c86458ade5b3daf5fb4ad97b6a99e6c
DIFF: https://github.com/llvm/llvm-project/commit/3328ee550c86458ade5b3daf5fb4ad97b6a99e6c.diff
LOG: [lldb] Suppress persistent result when running po
Remove the persistent result variable after executing `po`.
Without this change, the following behavior happens:
```
(lldb) p thing
(NSObject *) $0 = 0x600000008000
(lldb) po thing
<NSObject: 0x600000008000>
(lldb) p thing
(NSObject *) $2 = 0x600000008000
(lldb) p $1
(NSObject *) $1 = 0x600000008000
```
Even though `po` hides the persistent result variable, it's still created - as $1 in
this example. It can be accessed even though its existence is not evident.
With this change, the persistent result is removed after the object description has
printed. Instead, this is the behavior:
```
(lldb) p thing
(NSObject *) $0 = 0x600000008000
(lldb) po thing
<NSObject: 0x600000008000>
(lldb) p thing
(NSObject *) $1 = 0x600000008000
```
The difference here is that the `po` doens't silently create a persistent result.
Differential Revision: https://reviews.llvm.org/D144044
Added:
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
Modified:
lldb/source/Commands/CommandObjectExpression.cpp
Removed:
################################################################################
diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp
index 9cce009f853e..9402000a4f32 100644
--- 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 @@ EvaluateExpressionOptions
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
index 000000000000..845553d5e3f2
--- /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
index 000000000000..3c3b863dc7da
--- /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
index 000000000000..dfd557ee160e
--- /dev/null
+++ b/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
+}
More information about the lldb-commits
mailing list