diff --git a/src/etc/lldb_lookup.py b/src/etc/lldb_lookup.py index 5a2cffaf44492..e3e79f347bbad 100644 --- a/src/etc/lldb_lookup.py +++ b/src/etc/lldb_lookup.py @@ -194,14 +194,28 @@ def register_providers_compatibility(): register( StdSliceSyntheticProvider, SizeSummaryProvider, - r"^&(mut )?\[.+\]$", + r"^((&(mut )?)|(\*(const|mut) ))\[.+\]$", + ) + + # Box<[T]> GNU + register( + StdSliceSyntheticProvider, + SizeSummaryProvider, + r"^(alloc::([a-z_]+::)+)Box<\[.+\],.*>$", ) # slice MSVC register( MSVCStdSliceSyntheticProvider, StdSliceSummaryProvider, - r"^ref(_mut)?\$ >", + r"^((ref(_mut)?)|(ptr_(const|mut)))\$ >$", + ) + + # Box<[T]> MSVC + register( + MSVCStdSliceSyntheticProvider, + StdSliceSummaryProvider, + r"^(alloc::([a-z_]+::)+)Box,.*>$", ) # OsString diff --git a/src/etc/lldb_providers.py b/src/etc/lldb_providers.py index 156e9b887aad6..058f5725afebc 100644 --- a/src/etc/lldb_providers.py +++ b/src/etc/lldb_providers.py @@ -908,6 +908,8 @@ def get_type_name(self) -> str: def MSVCEnumSummaryProvider(valobj: SBValue, _dict: LLDBOpaque) -> str: + if valobj.TypeIsPointerType(): + valobj = valobj.Dereference() enum_synth = MSVCEnumSyntheticProvider(valobj.GetNonSyntheticValue(), _dict) variant_names: SBType = valobj.target.FindFirstType( f"{enum_synth.valobj.GetTypeName()}::VariantNames" @@ -1127,19 +1129,44 @@ def has_children(self) -> bool: class MSVCStdSliceSyntheticProvider(StdSliceSyntheticProvider): + type_name: Optional[str] = None + def get_type_name(self) -> str: + if self.type_name is not None: + return self.type_name + name = self.valobj.GetTypeName() if name.startswith("ref_mut"): - # remove "ref_mut$ >" - name = name[17:-3] - ref = "&mut " + name = name[len("ref_mut$ ") + self.type_name = f"&mut [{name}]" + elif name.startswith("ref"): + name = name[len("ref$ ") + self.type_name = f"&[{name}]" + elif name.startswith("ptr_mut"): + name = name[len("ptr_mut$ ") + self.type_name = f"*mut [{name}]" + elif name.startswith("ptr_const"): + name = name[len("ptr_const$ ") + self.type_name = f"*const [{name}]" + elif name.startswith("alloc::boxed::Box"): + prefix_len = len("alloc::boxed::Box,alloc::alloc::Global>") + if name.endswith(",alloc::alloc::Global>"): + name = name[prefix_len : len(name) - suffix_len] + + self.type_name = f"Box<[{name}]>" + else: + [element_name, alloc_name] = name[prefix_len:].split(">", 1) + + name = f"{element_name}{alloc_name}" + + # alloc name contains the trailing ">", so we don't need to add it + self.type_name = f"Box<[{element_name}]{alloc_name}" else: - # remove "ref$ >" - name = name[13:-3] - ref = "&" + self.type_name = name - return "".join([ref, "[", name, "]"]) + return self.type_name def StdSliceSummaryProvider(valobj, dict):