[Lldb-commits] [PATCH] D144044: [lldb] Suppress persistent result when running po

Dave Lee via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Feb 14 15:46:28 PST 2023


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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144044.497466.patch
Type: text/x-patch
Size: 3063 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20230214/0e64e7b0/attachment.bin>


More information about the lldb-commits mailing list