116 lines
4.2 KiB
Python
116 lines
4.2 KiB
Python
import lldb
|
|
|
|
from lldb_providers import *
|
|
from rust_types import RustType, classify_struct, classify_union
|
|
|
|
|
|
# BACKCOMPAT: rust 1.35
|
|
def is_hashbrown_hashmap(hash_map):
|
|
return len(hash_map.type.fields) == 1
|
|
|
|
|
|
def classify_rust_type(type):
|
|
type_class = type.GetTypeClass()
|
|
if type_class == lldb.eTypeClassStruct:
|
|
return classify_struct(type.name, type.fields)
|
|
if type_class == lldb.eTypeClassUnion:
|
|
return classify_union(type.fields)
|
|
|
|
return RustType.OTHER
|
|
|
|
|
|
def summary_lookup(valobj, dict):
|
|
# type: (SBValue, dict) -> str
|
|
"""Returns the summary provider for the given value"""
|
|
rust_type = classify_rust_type(valobj.GetType())
|
|
|
|
if rust_type == RustType.STD_STRING:
|
|
return StdStringSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_OS_STRING:
|
|
return StdOsStringSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_STR:
|
|
return StdStrSummaryProvider(valobj, dict)
|
|
|
|
if rust_type == RustType.STD_VEC:
|
|
return SizeSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_VEC_DEQUE:
|
|
return SizeSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_SLICE:
|
|
return SizeSummaryProvider(valobj, dict)
|
|
|
|
if rust_type == RustType.STD_HASH_MAP:
|
|
return SizeSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_HASH_SET:
|
|
return SizeSummaryProvider(valobj, dict)
|
|
|
|
if rust_type == RustType.STD_RC:
|
|
return StdRcSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_ARC:
|
|
return StdRcSummaryProvider(valobj, dict)
|
|
|
|
if rust_type == RustType.STD_REF:
|
|
return StdRefSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_REF_MUT:
|
|
return StdRefSummaryProvider(valobj, dict)
|
|
if rust_type == RustType.STD_REF_CELL:
|
|
return StdRefSummaryProvider(valobj, dict)
|
|
|
|
return ""
|
|
|
|
|
|
def synthetic_lookup(valobj, dict):
|
|
# type: (SBValue, dict) -> object
|
|
"""Returns the synthetic provider for the given value"""
|
|
rust_type = classify_rust_type(valobj.GetType())
|
|
|
|
if rust_type == RustType.STRUCT:
|
|
return StructSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STRUCT_VARIANT:
|
|
return StructSyntheticProvider(valobj, dict, is_variant=True)
|
|
if rust_type == RustType.TUPLE:
|
|
return TupleSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.TUPLE_VARIANT:
|
|
return TupleSyntheticProvider(valobj, dict, is_variant=True)
|
|
if rust_type == RustType.EMPTY:
|
|
return EmptySyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.REGULAR_ENUM:
|
|
discriminant = valobj.GetChildAtIndex(0).GetChildAtIndex(0).GetValueAsUnsigned()
|
|
return synthetic_lookup(valobj.GetChildAtIndex(discriminant), dict)
|
|
if rust_type == RustType.SINGLETON_ENUM:
|
|
return synthetic_lookup(valobj.GetChildAtIndex(0), dict)
|
|
|
|
if rust_type == RustType.STD_VEC:
|
|
return StdVecSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STD_VEC_DEQUE:
|
|
return StdVecDequeSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STD_SLICE:
|
|
return StdSliceSyntheticProvider(valobj, dict)
|
|
|
|
if rust_type == RustType.STD_HASH_MAP:
|
|
if is_hashbrown_hashmap(valobj):
|
|
return StdHashMapSyntheticProvider(valobj, dict)
|
|
else:
|
|
return StdOldHashMapSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STD_HASH_SET:
|
|
hash_map = valobj.GetChildAtIndex(0)
|
|
if is_hashbrown_hashmap(hash_map):
|
|
return StdHashMapSyntheticProvider(valobj, dict, show_values=False)
|
|
else:
|
|
return StdOldHashMapSyntheticProvider(hash_map, dict, show_values=False)
|
|
|
|
if rust_type == RustType.STD_RC:
|
|
return StdRcSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STD_ARC:
|
|
return StdRcSyntheticProvider(valobj, dict, is_atomic=True)
|
|
|
|
if rust_type == RustType.STD_CELL:
|
|
return StdCellSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STD_REF:
|
|
return StdRefSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STD_REF_MUT:
|
|
return StdRefSyntheticProvider(valobj, dict)
|
|
if rust_type == RustType.STD_REF_CELL:
|
|
return StdRefSyntheticProvider(valobj, dict, is_cell=True)
|
|
|
|
return DefaultSynthteticProvider(valobj, dict)
|