1import lldb 2 3from lldb_providers import * 4from rust_types import RustType, classify_struct, classify_union 5 6 7# BACKCOMPAT: rust 1.35 8def is_hashbrown_hashmap(hash_map): 9 return len(hash_map.type.fields) == 1 10 11 12def classify_rust_type(type): 13 type_class = type.GetTypeClass() 14 if type_class == lldb.eTypeClassStruct: 15 return classify_struct(type.name, type.fields) 16 if type_class == lldb.eTypeClassUnion: 17 return classify_union(type.fields) 18 19 return RustType.OTHER 20 21 22def summary_lookup(valobj, dict): 23 # type: (SBValue, dict) -> str 24 """Returns the summary provider for the given value""" 25 rust_type = classify_rust_type(valobj.GetType()) 26 27 if rust_type == RustType.STD_STRING: 28 return StdStringSummaryProvider(valobj, dict) 29 if rust_type == RustType.STD_OS_STRING: 30 return StdOsStringSummaryProvider(valobj, dict) 31 if rust_type == RustType.STD_STR: 32 return StdStrSummaryProvider(valobj, dict) 33 34 if rust_type == RustType.STD_VEC: 35 return SizeSummaryProvider(valobj, dict) 36 if rust_type == RustType.STD_VEC_DEQUE: 37 return SizeSummaryProvider(valobj, dict) 38 if rust_type == RustType.STD_SLICE: 39 return SizeSummaryProvider(valobj, dict) 40 41 if rust_type == RustType.STD_HASH_MAP: 42 return SizeSummaryProvider(valobj, dict) 43 if rust_type == RustType.STD_HASH_SET: 44 return SizeSummaryProvider(valobj, dict) 45 46 if rust_type == RustType.STD_RC: 47 return StdRcSummaryProvider(valobj, dict) 48 if rust_type == RustType.STD_ARC: 49 return StdRcSummaryProvider(valobj, dict) 50 51 if rust_type == RustType.STD_REF: 52 return StdRefSummaryProvider(valobj, dict) 53 if rust_type == RustType.STD_REF_MUT: 54 return StdRefSummaryProvider(valobj, dict) 55 if rust_type == RustType.STD_REF_CELL: 56 return StdRefSummaryProvider(valobj, dict) 57 58 if rust_type == RustType.STD_NONZERO_NUMBER: 59 return StdNonZeroNumberSummaryProvider(valobj, dict) 60 61 if rust_type == RustType.STD_PATHBUF: 62 return StdPathBufSummaryProvider(valobj, dict) 63 if rust_type == RustType.STD_PATH: 64 return StdPathSummaryProvider(valobj, dict) 65 66 return "" 67 68 69def synthetic_lookup(valobj, dict): 70 # type: (SBValue, dict) -> object 71 """Returns the synthetic provider for the given value""" 72 rust_type = classify_rust_type(valobj.GetType()) 73 74 if rust_type == RustType.STRUCT: 75 return StructSyntheticProvider(valobj, dict) 76 if rust_type == RustType.STRUCT_VARIANT: 77 return StructSyntheticProvider(valobj, dict, is_variant=True) 78 if rust_type == RustType.TUPLE: 79 return TupleSyntheticProvider(valobj, dict) 80 if rust_type == RustType.TUPLE_VARIANT: 81 return TupleSyntheticProvider(valobj, dict, is_variant=True) 82 if rust_type == RustType.EMPTY: 83 return EmptySyntheticProvider(valobj, dict) 84 if rust_type == RustType.REGULAR_ENUM: 85 discriminant = valobj.GetChildAtIndex(0).GetChildAtIndex(0).GetValueAsUnsigned() 86 return synthetic_lookup(valobj.GetChildAtIndex(discriminant), dict) 87 if rust_type == RustType.SINGLETON_ENUM: 88 return synthetic_lookup(valobj.GetChildAtIndex(0), dict) 89 if rust_type == RustType.ENUM: 90 return ClangEncodedEnumProvider(valobj, dict) 91 if rust_type == RustType.STD_VEC: 92 return StdVecSyntheticProvider(valobj, dict) 93 if rust_type == RustType.STD_VEC_DEQUE: 94 return StdVecDequeSyntheticProvider(valobj, dict) 95 if rust_type == RustType.STD_SLICE or rust_type == RustType.STD_STR: 96 return StdSliceSyntheticProvider(valobj, dict) 97 98 if rust_type == RustType.STD_HASH_MAP: 99 if is_hashbrown_hashmap(valobj): 100 return StdHashMapSyntheticProvider(valobj, dict) 101 else: 102 return StdOldHashMapSyntheticProvider(valobj, dict) 103 if rust_type == RustType.STD_HASH_SET: 104 hash_map = valobj.GetChildAtIndex(0) 105 if is_hashbrown_hashmap(hash_map): 106 return StdHashMapSyntheticProvider(valobj, dict, show_values=False) 107 else: 108 return StdOldHashMapSyntheticProvider(hash_map, dict, show_values=False) 109 110 if rust_type == RustType.STD_RC: 111 return StdRcSyntheticProvider(valobj, dict) 112 if rust_type == RustType.STD_ARC: 113 return StdRcSyntheticProvider(valobj, dict, is_atomic=True) 114 115 if rust_type == RustType.STD_CELL: 116 return StdCellSyntheticProvider(valobj, dict) 117 if rust_type == RustType.STD_REF: 118 return StdRefSyntheticProvider(valobj, dict) 119 if rust_type == RustType.STD_REF_MUT: 120 return StdRefSyntheticProvider(valobj, dict) 121 if rust_type == RustType.STD_REF_CELL: 122 return StdRefSyntheticProvider(valobj, dict, is_cell=True) 123 124 return DefaultSyntheticProvider(valobj, dict) 125