1import gdb 2 3from typing import Optional, Union 4 5 6class Value(gdb.Value): 7 def __init__(self, value: Union[gdb.Value, 'Value']): 8 super().__init__(value) 9 10 def __getitem__(self, key): 11 try: 12 value = super().__getitem__(key) 13 except gdb.error: 14 value = super().__getattr__(key) 15 return Value(value) 16 17 def __getattr__(self, key): 18 if hasattr(super(), key): 19 return Value(super().__getattribute__(key)) 20 return Value(super().__getitem__(key)) 21 22 def cast(self, type_name: str | gdb.Type, ptr: bool = False) -> Optional['Value']: 23 try: 24 gdb_type = gdb.lookup_type(type_name) if isinstance(type_name, str) else type_name 25 if ptr: 26 gdb_type = gdb_type.pointer() 27 return Value(super().cast(gdb_type)) 28 except gdb.error: 29 return None 30 31 def super_value(self, attr: str) -> 'Value': 32 return self[attr] 33