Skip to content

Commit 1e3b45d

Browse files
committed
add MSVC slice providers
1 parent 84c9b70 commit 1e3b45d

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

src/etc/lldb_commands

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,6 @@ type summary add -F lldb_lookup.summary_lookup -e -x -h "^core::num::([a-z_]+::
4444
type summary add -F lldb_lookup.summary_lookup -e -x -h "^(std::([a-z_]+::)+)PathBuf$" --category Rust
4545
type summary add -F lldb_lookup.summary_lookup -e -x -h "^&(mut )?(std::([a-z_]+::)+)Path$" --category Rust
4646
type summary add -F lldb_lookup.TupleSummaryProvider -e -x -h "^tuple\$<.+>$" --category Rust
47+
type summary add -F lldb_lookup.StdSliceSummaryProvider -e -x -h "^ref(_mut)?\$<slice2\$<.+> >" --category Rust
48+
type synthetic add -l lldb_lookup.MSVCStdSliceSyntheticProvider -x "^ref(_mut)?\$<slice2\$<.+> >" --category Rust
4749
type category enable Rust

src/etc/lldb_providers.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,8 @@ def has_children(self) -> bool:
456456

457457

458458
class StdSliceSyntheticProvider:
459+
__slots__ = ["valobj", "length", "ptr", "element_type", "element_size"]
460+
459461
def __init__(self, valobj: SBValue, _dict: LLDBOpaque):
460462
self.valobj = valobj
461463
self.update()
@@ -472,7 +474,7 @@ def get_child_index(self, name: str) -> int:
472474

473475
def get_child_at_index(self, index: int) -> SBValue:
474476
start = self.data_ptr.GetValueAsUnsigned()
475-
address = start + index * self.element_type_size
477+
address = start + index * self.element_size
476478
element = self.data_ptr.CreateValueFromAddress(
477479
"[%s]" % index, address, self.element_type
478480
)
@@ -483,12 +485,33 @@ def update(self):
483485
self.data_ptr = self.valobj.GetChildMemberWithName("data_ptr")
484486

485487
self.element_type = self.data_ptr.GetType().GetPointeeType()
486-
self.element_type_size = self.element_type.GetByteSize()
488+
self.element_size = self.element_type.GetByteSize()
487489

488490
def has_children(self) -> bool:
489491
return True
490492

491493

494+
class MSVCStdSliceSyntheticProvider(StdSliceSyntheticProvider):
495+
def get_type_name(self) -> str:
496+
name = self.valobj.GetTypeName()
497+
498+
if name.startswith("ref_mut"):
499+
# remove "ref_mut$<slice2$<" and trailing "> >"
500+
name = name[17:-3]
501+
ref = "&mut "
502+
else:
503+
# remove "ref$<slice2$<" and trailing "> >"
504+
name = name[13:-3]
505+
ref = "&"
506+
507+
return "".join([ref, "[", name, "]"])
508+
509+
def StdSliceSummaryProvider(valobj, dict):
510+
output = sequence_formatter("[", valobj, dict)
511+
output += "]"
512+
return output
513+
514+
492515
class StdVecDequeSyntheticProvider:
493516
"""Pretty-printer for alloc::collections::vec_deque::VecDeque<T>
494517

0 commit comments

Comments
 (0)