[LLDB] Fixes summary formatter for libc++ map allowing modification of contained value
Reviewed By: clayborg Differential Revision: https://reviews.llvm.org/D140624
This commit is contained in:
@@ -397,18 +397,9 @@ lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex(
|
||||
// at this point we have a valid
|
||||
// we need to copy current_sp into a new object otherwise we will end up with
|
||||
// all items named __value_
|
||||
DataExtractor data;
|
||||
Status error;
|
||||
iterated_sp->GetData(data, error);
|
||||
if (error.Fail()) {
|
||||
m_tree = nullptr;
|
||||
return lldb::ValueObjectSP();
|
||||
}
|
||||
StreamString name;
|
||||
name.Printf("[%" PRIu64 "]", (uint64_t)idx);
|
||||
auto potential_child_sp = CreateValueObjectFromData(
|
||||
name.GetString(), data, m_backend.GetExecutionContextRef(),
|
||||
m_element_type);
|
||||
auto potential_child_sp = iterated_sp->Clone(ConstString(name.GetString()));
|
||||
if (potential_child_sp) {
|
||||
switch (potential_child_sp->GetNumChildren()) {
|
||||
case 1: {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
CXX_SOURCES := main.cpp
|
||||
|
||||
USE_LIBCPP := 1
|
||||
|
||||
CXXFLAGS_EXTRAS := -O0
|
||||
include Makefile.rules
|
||||
@@ -0,0 +1,51 @@
|
||||
"""
|
||||
Test change libc++ map values.
|
||||
"""
|
||||
|
||||
import lldb
|
||||
from lldbsuite.test.decorators import *
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
class LibcxxChangeValueTestCase(TestBase):
|
||||
|
||||
def setUp(self):
|
||||
# Call super's setUp().
|
||||
TestBase.setUp(self)
|
||||
|
||||
@add_test_categories(["libc++"])
|
||||
@expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24772")
|
||||
def test(self):
|
||||
"""Test that we can change values of libc++ map."""
|
||||
self.build()
|
||||
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
|
||||
|
||||
bkpt = self.target().FindBreakpointByID(
|
||||
lldbutil.run_break_set_by_source_regexp(
|
||||
self, "Set break point at this line."))
|
||||
|
||||
self.runCmd("run", RUN_SUCCEEDED)
|
||||
|
||||
# Get Frame #0.
|
||||
target = self.dbg.GetSelectedTarget()
|
||||
process = target.GetProcess()
|
||||
self.assertState(process.GetState(), lldb.eStateStopped)
|
||||
thread = lldbutil.get_stopped_thread(
|
||||
process, lldb.eStopReasonBreakpoint)
|
||||
self.assertTrue(
|
||||
thread.IsValid(),
|
||||
"There should be a thread stopped due to breakpoint condition")
|
||||
frame0 = thread.GetFrameAtIndex(0)
|
||||
self.assertTrue(frame0.IsValid(), "Got a valid frame.")
|
||||
|
||||
val_value = frame0.FindVariable("M")
|
||||
self.assertTrue(val_value.IsValid(), "Got the SBValue for val")
|
||||
pair0 = val_value.GetChildMemberWithName("[0]")
|
||||
self.assertTrue(pair0.IsValid(), "Got the SBValue for [0]")
|
||||
self.assertTrue(pair0.GetNumChildren() == 2, "Got 2 children")
|
||||
pair0_second = pair0.GetChildMemberWithName("second")
|
||||
self.assertTrue(pair0_second.IsValid(), "Got the SBValue for [0].second")
|
||||
result = pair0_second.SetValueFromCString("12345")
|
||||
self.assertTrue(result, "Setting val returned True.")
|
||||
result = pair0_second.GetValueAsUnsigned()
|
||||
self.assertTrue(result == 12345, "Got correct value (12345)")
|
||||
@@ -0,0 +1,7 @@
|
||||
#include <map>
|
||||
|
||||
int main()
|
||||
{
|
||||
std::map<int, int> M = {{1,1},{2,2}};
|
||||
return M[1]; // Set break point at this line.
|
||||
}
|
||||
Reference in New Issue
Block a user