[Lldb-commits] [lldb] [lldb] Fix dwim-print to not delete non-result persistent variables (PR #85152)
Dave Lee via lldb-commits
lldb-commits at lists.llvm.org
Wed Mar 13 16:34:11 PDT 2024
https://github.com/kastiglione created https://github.com/llvm/llvm-project/pull/85152
None
>From 970cf82fa3d64c5a4e1b3929c110b42974ef13cd Mon Sep 17 00:00:00 2001
From: Dave Lee <davelee.com at gmail.com>
Date: Wed, 13 Mar 2024 14:49:23 -0700
Subject: [PATCH] [lldb] Fix dwim-print to not delete non-result persistent
variables
---
lldb/source/Commands/CommandObjectDWIMPrint.cpp | 12 ++++++++++--
lldb/test/API/commands/dwim-print/TestDWIMPrint.py | 12 ++++++++++++
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/lldb/source/Commands/CommandObjectDWIMPrint.cpp b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
index b183cb423111fb..5c043dfd101be6 100644
--- a/lldb/source/Commands/CommandObjectDWIMPrint.cpp
+++ b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
@@ -170,6 +170,14 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
ExpressionResults expr_result = target.EvaluateExpression(
expr, exe_scope, valobj_sp, eval_options, &fixed_expression);
+ auto persistent_name = valobj_sp->GetName();
+ // EvaluateExpression doesn't generate a new persistent result (`$0`) when
+ // the expression is already just a persistent variable (`$var`). Instead,
+ // the same persistent variable is reused. Take note of when a persistent
+ // result is created, to prevent unintentional deletion of a user's
+ // persistent variable.
+ bool did_persist_result = persistent_name != expr;
+
// Only mention Fix-Its if the expression evaluator applied them.
// Compiler errors refer to the final expression after applying Fix-It(s).
if (!fixed_expression.empty() && target.GetEnableNotifyAboutFixIts()) {
@@ -199,9 +207,9 @@ void CommandObjectDWIMPrint::DoExecute(StringRef command,
}
}
- if (suppress_result)
+ if (did_persist_result && suppress_result)
if (auto result_var_sp =
- target.GetPersistentVariable(valobj_sp->GetName())) {
+ target.GetPersistentVariable(persistent_name)) {
auto language = valobj_sp->GetPreferredDisplayLanguage();
if (auto *persistent_state =
target.GetPersistentExpressionStateForLanguage(language))
diff --git a/lldb/test/API/commands/dwim-print/TestDWIMPrint.py b/lldb/test/API/commands/dwim-print/TestDWIMPrint.py
index 040632096c70e7..c650b1e3533e08 100644
--- a/lldb/test/API/commands/dwim-print/TestDWIMPrint.py
+++ b/lldb/test/API/commands/dwim-print/TestDWIMPrint.py
@@ -146,3 +146,15 @@ def test_void_result(self):
self, "// break here", lldb.SBFileSpec("main.c")
)
self.expect("dwim-print (void)15", matching=False, patterns=["(?i)error"])
+
+ def test_preserves_persistent_variables(self):
+ """Test dwim-print does not delete persistent variables."""
+ self.build()
+ lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.c")
+ )
+ self.expect("dwim-print int $i = 15")
+ # Run the same expression twice and verify success. This ensures the
+ # first command does not delete the persistent variable.
+ for _ in range(2):
+ self.expect("dwim-print $i", startstr="(int) 15")
More information about the lldb-commits
mailing list