[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