[Lldb-commits] [lldb] Add a ValueCheck construction method that takes an SBValue (PR #216208)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Aug 13 16:52:41 PDT 2026
https://github.com/jimingham updated https://github.com/llvm/llvm-project/pull/216208
>From e1c7fb9572327e4bb5c7503f72c0dd2746261a2c Mon Sep 17 00:00:00 2001
From: Jim Ingham <jingham at apple.com>
Date: Thu, 13 Aug 2026 16:10:04 -0700
Subject: [PATCH 1/2] Add a ValueCheck construction method that takes an
SBValue and constructs the reference check from it. Use it in an appropriate
test.
---
.../Python/lldbsuite/test/lldbtest.py | 45 ++++++++----
.../expr-result-var/TestCPPExprResult.py | 69 ++-----------------
.../expr-result-var/two-bases.cpp | 5 ++
3 files changed, 45 insertions(+), 74 deletions(-)
diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py
index 2503df89bd28e..4e7f4d6b27281 100644
--- a/lldb/packages/Python/lldbsuite/test/lldbtest.py
+++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py
@@ -302,12 +302,13 @@ def dump_value_obj(val: lldb.SBValue, max_children: int = 10000) -> str:
class ValueCheck:
def __init__(
self,
- name=None,
- value=None,
- type=None,
- summary=None,
- children=None,
- dereference=None,
+ name : string = None,
+ value : string = None,
+ type : string = None,
+ summary : string = None,
+ children : [ValueCheck] = None,
+ dereference : boolean = None,
+ valobj : lldb.SBValue = None,
):
"""
:param name: The name that the SBValue should have. None if the summary
@@ -325,13 +326,33 @@ def __init__(
children.
:param dereference: A ValueCheck for the SBValue returned by the
`Dereference` function.
+ :param valobj: If supplied, ignore the other arguments and build a
+ ValueCheck that matches valobj except for the name
+ of the toplevel valobj.
"""
- self.expect_name = name
- self.expect_value = value
- self.expect_type = type
- self.expect_summary = summary
- self.children = children
- self.dereference = dereference
+ if valobj:
+ # SBValues so we don't need to dereference
+ self.dereference = None
+ # We don't want to compare the top-level VO
+ # name as the reference object may come from
+ # a different source. So we pass that in in
+ # the recursive part by hand below.
+
+ self.expect_name = name
+ # Copy everything else from the incoming valobj:
+ self.expect_summary = valobj.GetSummary()
+ self.expect_type = valobj.GetDisplayTypeName()
+ self.expect_value = valobj.GetValue()
+ self.children : [ValueCheck] = []
+ for child in valobj.children:
+ self.children.append(ValueCheck(valobj=child, name = child.name))
+ else:
+ self.expect_name = name
+ self.expect_value = value
+ self.expect_type = type
+ self.expect_summary = summary
+ self.children = children
+ self.dereference = dereference
def check_value(self, test_base, val, error_msg=""):
"""
diff --git a/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py b/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py
index 63a53605aea2b..dd0b3d90a0ff4 100644
--- a/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py
+++ b/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py
@@ -20,74 +20,19 @@ def setUp(self):
self.main_source_file = lldb.SBFileSpec("two-bases.cpp")
def check_dereference(self, result_varname, frame, expr_options):
- deref_expr = "*{0}".format(result_varname)
- base_children = ValueCheck(
- name="Base", value="", children=[ValueCheck(name="base_int", value="100")]
- )
- base_1_arr_children = [
- ValueCheck(name="[0]", value="100"),
- ValueCheck(name="[1]", value="101"),
- ValueCheck(name="[2]", value="102"),
- ValueCheck(name="[3]", value="103"),
- ValueCheck(name="[4]", value="104"),
- ValueCheck(name="[5]", value="105"),
- ValueCheck(name="[6]", value="106"),
- ValueCheck(name="[7]", value="107"),
- ValueCheck(name="[8]", value="108"),
- ValueCheck(name="[9]", value="109"),
- ]
- base_2_arr_children = [
- ValueCheck(name="[0]", value="200"),
- ValueCheck(name="[1]", value="201"),
- ValueCheck(name="[2]", value="202"),
- ValueCheck(name="[3]", value="203"),
- ValueCheck(name="[4]", value="204"),
- ValueCheck(name="[5]", value="205"),
- ValueCheck(name="[6]", value="206"),
- ValueCheck(name="[7]", value="207"),
- ValueCheck(name="[8]", value="208"),
- ValueCheck(name="[9]", value="209"),
- ]
- deref_children = [
- ValueCheck(
- name="Base_1",
- value="",
- children=[
- base_children,
- ValueCheck(
- name="base_1_arr", value="", children=base_1_arr_children
- ),
- ],
- ),
- ValueCheck(
- name="Base_2",
- value="",
- children=[
- base_children,
- ValueCheck(
- name="base_2_arr", value="", children=base_2_arr_children
- ),
- ],
- ),
- ValueCheck(name="derived_int", value="1000"),
- ]
- result_var_deref = self.expect_expr(
- deref_expr,
- result_type="Derived",
- result_children=deref_children,
- options=expr_options,
- )
-
+ # All the variables we are comparing against are various ways to get
+ # pointers to my_derived. So use that to make our CheckValue:
+ my_derived = frame.FindVariable("my_derived")
+ self.assertSuccess(my_derived.error, "Got my_derived")
+ my_value_check = ValueCheck(valobj=my_derived)
+
direct_access_expr = "{0}->derived_int".format(result_varname)
self.expect_expr(direct_access_expr, result_type="int", result_value="1000")
# Also check this by directly accessing the result variable:
result_value = frame.FindValue(result_varname, lldb.eValueTypeConstResult, True)
self.assertTrue(result_value.error.success, "Found my result variable")
- value_check = ValueCheck(children=deref_children)
- value_check.check_value(
- self, result_value, f"{result_varname} children are correct"
- )
+ my_value_check.check_value(self, result_value.Dereference(), "children are correct")
# Make sure we can also call a function through the derived type:
method_result = self.expect_expr(
diff --git a/lldb/test/API/functionalities/expr-result-var/two-bases.cpp b/lldb/test/API/functionalities/expr-result-var/two-bases.cpp
index 55af757d02bd8..545bf7d77e21e 100644
--- a/lldb/test/API/functionalities/expr-result-var/two-bases.cpp
+++ b/lldb/test/API/functionalities/expr-result-var/two-bases.cpp
@@ -27,6 +27,10 @@ struct Derived : public Base_1, Base_2 {
Base *MakeADerivedReportABase() { return (Base *)((Base_1 *)new Derived()); }
+Base *ReportABase(Base *input) {
+ return input;
+}
+
int main() {
Derived my_derived;
int call_it = my_derived.method_of_derived();
@@ -40,6 +44,7 @@ int main() {
// Call this to make sure the compiler makes it.
Base *fake_base = MakeADerivedReportABase();
+ Base *reported_base = ReportABase(fake_base);
uint64_t base_through_1_addr = (uint64_t)base_through_1;
uint64_t base_through_2_addr = (uint64_t)base_through_2;
>From 4fe27e5d6440d1d66dd040c6bfb920a5b8960c9f Mon Sep 17 00:00:00 2001
From: Jim Ingham <jingham at apple.com>
Date: Thu, 13 Aug 2026 16:52:20 -0700
Subject: [PATCH 2/2] Formatting
---
.../Python/lldbsuite/test/lldbtest.py | 22 +++++++++----------
.../expr-result-var/TestCPPExprResult.py | 6 +++--
.../expr-result-var/two-bases.cpp | 4 +---
3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py
index 4e7f4d6b27281..1da5164b47f26 100644
--- a/lldb/packages/Python/lldbsuite/test/lldbtest.py
+++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py
@@ -302,13 +302,13 @@ def dump_value_obj(val: lldb.SBValue, max_children: int = 10000) -> str:
class ValueCheck:
def __init__(
self,
- name : string = None,
- value : string = None,
- type : string = None,
- summary : string = None,
- children : [ValueCheck] = None,
- dereference : boolean = None,
- valobj : lldb.SBValue = None,
+ name: string = None,
+ value: string = None,
+ type: string = None,
+ summary: string = None,
+ children: [ValueCheck] = None,
+ dereference: boolean = None,
+ valobj: lldb.SBValue = None,
):
"""
:param name: The name that the SBValue should have. None if the summary
@@ -326,7 +326,7 @@ def __init__(
children.
:param dereference: A ValueCheck for the SBValue returned by the
`Dereference` function.
- :param valobj: If supplied, ignore the other arguments and build a
+ :param valobj: If supplied, ignore the other arguments and build a
ValueCheck that matches valobj except for the name
of the toplevel valobj.
"""
@@ -337,15 +337,15 @@ def __init__(
# name as the reference object may come from
# a different source. So we pass that in in
# the recursive part by hand below.
-
+
self.expect_name = name
# Copy everything else from the incoming valobj:
self.expect_summary = valobj.GetSummary()
self.expect_type = valobj.GetDisplayTypeName()
self.expect_value = valobj.GetValue()
- self.children : [ValueCheck] = []
+ self.children: [ValueCheck] = []
for child in valobj.children:
- self.children.append(ValueCheck(valobj=child, name = child.name))
+ self.children.append(ValueCheck(valobj=child, name=child.name))
else:
self.expect_name = name
self.expect_value = value
diff --git a/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py b/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py
index dd0b3d90a0ff4..d921fa494b551 100644
--- a/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py
+++ b/lldb/test/API/functionalities/expr-result-var/TestCPPExprResult.py
@@ -25,14 +25,16 @@ def check_dereference(self, result_varname, frame, expr_options):
my_derived = frame.FindVariable("my_derived")
self.assertSuccess(my_derived.error, "Got my_derived")
my_value_check = ValueCheck(valobj=my_derived)
-
+
direct_access_expr = "{0}->derived_int".format(result_varname)
self.expect_expr(direct_access_expr, result_type="int", result_value="1000")
# Also check this by directly accessing the result variable:
result_value = frame.FindValue(result_varname, lldb.eValueTypeConstResult, True)
self.assertTrue(result_value.error.success, "Found my result variable")
- my_value_check.check_value(self, result_value.Dereference(), "children are correct")
+ my_value_check.check_value(
+ self, result_value.Dereference(), "children are correct"
+ )
# Make sure we can also call a function through the derived type:
method_result = self.expect_expr(
diff --git a/lldb/test/API/functionalities/expr-result-var/two-bases.cpp b/lldb/test/API/functionalities/expr-result-var/two-bases.cpp
index 545bf7d77e21e..628af0c4dd072 100644
--- a/lldb/test/API/functionalities/expr-result-var/two-bases.cpp
+++ b/lldb/test/API/functionalities/expr-result-var/two-bases.cpp
@@ -27,9 +27,7 @@ struct Derived : public Base_1, Base_2 {
Base *MakeADerivedReportABase() { return (Base *)((Base_1 *)new Derived()); }
-Base *ReportABase(Base *input) {
- return input;
-}
+Base *ReportABase(Base *input) { return input; }
int main() {
Derived my_derived;
More information about the lldb-commits
mailing list