UE Data formatters done.
This commit is contained in:
@@ -50,6 +50,8 @@ public:
|
|||||||
Sparse.Add(TEXT("delta"));
|
Sparse.Add(TEXT("delta"));
|
||||||
Sparse.RemoveAt(BetaIdx);
|
Sparse.RemoveAt(BetaIdx);
|
||||||
|
|
||||||
|
TTuple<int32, FString, float, bool, FName> Tuple(1, TEXT("hello"), 3.14f, true, FName("world"));
|
||||||
|
|
||||||
// Set a breakpoint on the following line to inspect Map, Bits, and Sparse.
|
// Set a breakpoint on the following line to inspect Map, Bits, and Sparse.
|
||||||
WingOut::Stdout.Printf(TEXT("Test_TMaps: Map has %d entries, Bits has %d bits, Sparse has %d entries.\n"),
|
WingOut::Stdout.Printf(TEXT("Test_TMaps: Map has %d entries, Bits has %d bits, Sparse has %d entries.\n"),
|
||||||
Map.Num(), Bits.Num(), Sparse.Num());
|
Map.Num(), Bits.Num(), Sparse.Num());
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ def _init_globals(target):
|
|||||||
#
|
#
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
|
def TryGetSyntheticValue(v):
|
||||||
|
s = v.GetSyntheticValue()
|
||||||
|
return s if s.IsValid() else v
|
||||||
|
|
||||||
class ForwardingSynthProvider:
|
class ForwardingSynthProvider:
|
||||||
def __init__(self, valobj, dict):
|
def __init__(self, valobj, dict):
|
||||||
self.valobj = valobj
|
self.valobj = valobj
|
||||||
@@ -213,7 +217,7 @@ class TObjectPtrSynthProvider(ForwardingSynthProvider):
|
|||||||
if addr == 0 or addr & 1: # null or unresolved handle (odd address)
|
if addr == 0 or addr & 1: # null or unresolved handle (odd address)
|
||||||
self.forward_to = lldb.SBValue()
|
self.forward_to = lldb.SBValue()
|
||||||
else:
|
else:
|
||||||
self.forward_to = debug_ptr.Dereference()
|
self.forward_to = TryGetSyntheticValue(debug_ptr.Dereference())
|
||||||
|
|
||||||
def TObjectPtrSummaryProvider(valobj, dict):
|
def TObjectPtrSummaryProvider(valobj, dict):
|
||||||
debug_ptr = valobj.GetNonSyntheticValue().GetChildMemberWithName('DebugPtr')
|
debug_ptr = valobj.GetNonSyntheticValue().GetChildMemberWithName('DebugPtr')
|
||||||
@@ -235,7 +239,7 @@ class TStrongObjectPtrSynthProvider(ForwardingSynthProvider):
|
|||||||
if addr == 0:
|
if addr == 0:
|
||||||
self.forward_to = lldb.SBValue()
|
self.forward_to = lldb.SBValue()
|
||||||
else:
|
else:
|
||||||
self.forward_to = obj.Dereference()
|
self.forward_to = TryGetSyntheticValue(obj.Dereference())
|
||||||
|
|
||||||
def TStrongObjectPtrSummaryProvider(valobj, dict):
|
def TStrongObjectPtrSummaryProvider(valobj, dict):
|
||||||
obj = valobj.GetNonSyntheticValue().GetChildMemberWithName('Object')
|
obj = valobj.GetNonSyntheticValue().GetChildMemberWithName('Object')
|
||||||
@@ -268,7 +272,7 @@ class TWeakObjectPtrSynthProvider(ForwardingSynthProvider):
|
|||||||
if obj_ptr is None or obj_ptr.GetValueAsUnsigned(0) == 0:
|
if obj_ptr is None or obj_ptr.GetValueAsUnsigned(0) == 0:
|
||||||
self.forward_to = lldb.SBValue()
|
self.forward_to = lldb.SBValue()
|
||||||
else:
|
else:
|
||||||
self.forward_to = obj_ptr.Dereference()
|
self.forward_to = TryGetSyntheticValue(obj_ptr.Dereference())
|
||||||
|
|
||||||
def TWeakObjectPtrSummaryProvider(valobj, dict):
|
def TWeakObjectPtrSummaryProvider(valobj, dict):
|
||||||
raw = valobj.GetNonSyntheticValue()
|
raw = valobj.GetNonSyntheticValue()
|
||||||
@@ -290,7 +294,7 @@ class TSharedPtrSynthProvider(ForwardingSynthProvider):
|
|||||||
if addr == 0:
|
if addr == 0:
|
||||||
self.forward_to = lldb.SBValue()
|
self.forward_to = lldb.SBValue()
|
||||||
else:
|
else:
|
||||||
self.forward_to = obj.Dereference()
|
self.forward_to = TryGetSyntheticValue(obj.Dereference())
|
||||||
|
|
||||||
def TSharedPtrSummaryProvider(valobj, dict):
|
def TSharedPtrSummaryProvider(valobj, dict):
|
||||||
obj = valobj.GetNonSyntheticValue().GetChildMemberWithName('Object')
|
obj = valobj.GetNonSyntheticValue().GetChildMemberWithName('Object')
|
||||||
@@ -321,7 +325,7 @@ class TWeakPtrSynthProvider(ForwardingSynthProvider):
|
|||||||
if obj is None or obj.GetValueAsUnsigned(0) == 0:
|
if obj is None or obj.GetValueAsUnsigned(0) == 0:
|
||||||
self.forward_to = lldb.SBValue()
|
self.forward_to = lldb.SBValue()
|
||||||
else:
|
else:
|
||||||
self.forward_to = obj.Dereference()
|
self.forward_to = TryGetSyntheticValue(obj.Dereference())
|
||||||
|
|
||||||
def TWeakPtrSummaryProvider(valobj, dict):
|
def TWeakPtrSummaryProvider(valobj, dict):
|
||||||
obj, expired = _resolve_weak_ptr(valobj.GetNonSyntheticValue())
|
obj, expired = _resolve_weak_ptr(valobj.GetNonSyntheticValue())
|
||||||
@@ -342,7 +346,7 @@ class TUniquePtrSynthProvider(ForwardingSynthProvider):
|
|||||||
if addr == 0:
|
if addr == 0:
|
||||||
self.forward_to = lldb.SBValue()
|
self.forward_to = lldb.SBValue()
|
||||||
else:
|
else:
|
||||||
self.forward_to = ptr.Dereference()
|
self.forward_to = TryGetSyntheticValue(ptr.Dereference())
|
||||||
|
|
||||||
def TUniquePtrSummaryProvider(valobj, dict):
|
def TUniquePtrSummaryProvider(valobj, dict):
|
||||||
ptr = valobj.GetNonSyntheticValue().GetChildMemberWithName('Ptr')
|
ptr = valobj.GetNonSyntheticValue().GetChildMemberWithName('Ptr')
|
||||||
@@ -532,6 +536,76 @@ def TSparseArraySummaryProvider(valobj, dict):
|
|||||||
num_free = raw.GetChildMemberWithName('NumFreeIndices').GetValueAsSigned(0)
|
num_free = raw.GetChildMemberWithName('NumFreeIndices').GetValueAsSigned(0)
|
||||||
return 'size=%d' % (array_num - num_free)
|
return 'size=%d' % (array_num - num_free)
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
#
|
||||||
|
# Provider for TSet
|
||||||
|
#
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
class TSetSynthProvider(ForwardingSynthProvider):
|
||||||
|
def update(self):
|
||||||
|
self.forward_to = TryGetSyntheticValue(self.valobj.GetChildMemberWithName('Elements'))
|
||||||
|
|
||||||
|
def TSetSummaryProvider(valobj, dict):
|
||||||
|
elements = valobj.GetNonSyntheticValue().GetChildMemberWithName('Elements')
|
||||||
|
return TSparseArraySummaryProvider(elements, dict)
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
#
|
||||||
|
# Provider for TMap / TMultiMap
|
||||||
|
#
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
class TMapSynthProvider(ForwardingSynthProvider):
|
||||||
|
def update(self):
|
||||||
|
self.forward_to = TryGetSyntheticValue(self.valobj.GetChildMemberWithName('Pairs').GetNonSyntheticValue().GetChildMemberWithName('Elements'))
|
||||||
|
|
||||||
|
def TMapSummaryProvider(valobj, dict):
|
||||||
|
pairs = valobj.GetNonSyntheticValue().GetChildMemberWithName('Pairs')
|
||||||
|
elements = pairs.GetNonSyntheticValue().GetChildMemberWithName('Elements')
|
||||||
|
return TSparseArraySummaryProvider(elements, dict)
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
#
|
||||||
|
# Provider for TTuple
|
||||||
|
#
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
def _tuple_child_name(index):
|
||||||
|
if index == 0: return 'Key'
|
||||||
|
if index == 1: return 'Value'
|
||||||
|
return 'Value%d' % index
|
||||||
|
|
||||||
|
class TTupleSynthProvider(StoredSynthProvider):
|
||||||
|
def update(self):
|
||||||
|
self.children = []
|
||||||
|
raw = self.valobj.GetNonSyntheticValue()
|
||||||
|
target = raw.GetTarget()
|
||||||
|
container = raw
|
||||||
|
first = raw.GetChildAtIndex(0)
|
||||||
|
if first.IsValid() and 'TTupleBase<' in (first.GetType().GetName() or ''):
|
||||||
|
container = first
|
||||||
|
n = container.GetNumChildren()
|
||||||
|
for i in range(n):
|
||||||
|
base = container.GetChildAtIndex(i)
|
||||||
|
field = base.GetChildAtIndex(0)
|
||||||
|
if not field.IsValid(): continue
|
||||||
|
child = target.CreateValueFromAddress(
|
||||||
|
_tuple_child_name(i),
|
||||||
|
lldb.SBAddress(field.GetLoadAddress(), target),
|
||||||
|
field.GetType())
|
||||||
|
self.children.append(child)
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
#
|
||||||
|
# Provider for TSetElement
|
||||||
|
#
|
||||||
|
############################################################
|
||||||
|
|
||||||
|
class TSetElementSynthProvider(ForwardingSynthProvider):
|
||||||
|
def update(self):
|
||||||
|
self.forward_to = TryGetSyntheticValue(self.valobj.GetChildMemberWithName('Value'))
|
||||||
|
|
||||||
##############################################################
|
##############################################################
|
||||||
#
|
#
|
||||||
# The getattr which is built in to codelldb.value.Value
|
# The getattr which is built in to codelldb.value.Value
|
||||||
@@ -618,6 +692,11 @@ def __lldb_init_module(debugger, dict):
|
|||||||
_register_provider(cat, '^TArray<.+>$', summary_fn='TArraySummaryProvider', synth_cls='TArraySynthProvider')
|
_register_provider(cat, '^TArray<.+>$', summary_fn='TArraySummaryProvider', synth_cls='TArraySynthProvider')
|
||||||
_register_provider(cat, '^TBitArray<.+>$', summary_fn='TBitArraySummaryProvider', synth_cls='TBitArraySynthProvider')
|
_register_provider(cat, '^TBitArray<.+>$', summary_fn='TBitArraySummaryProvider', synth_cls='TBitArraySynthProvider')
|
||||||
_register_provider(cat, '^TSparseArray<.+>$', summary_fn='TSparseArraySummaryProvider', synth_cls='TSparseArraySynthProvider')
|
_register_provider(cat, '^TSparseArray<.+>$', summary_fn='TSparseArraySummaryProvider', synth_cls='TSparseArraySynthProvider')
|
||||||
|
_register_provider(cat, '^TSetElement<.+>$', synth_cls='TSetElementSynthProvider')
|
||||||
|
_register_provider(cat, '^TTuple<.+>$', synth_cls='TTupleSynthProvider')
|
||||||
|
_register_provider(cat, '^TSet<.+>$', summary_fn='TSetSummaryProvider', synth_cls='TSetSynthProvider')
|
||||||
|
_register_provider(cat, '^TMap<.+>$', summary_fn='TMapSummaryProvider', synth_cls='TMapSynthProvider')
|
||||||
|
_register_provider(cat, '^TMultiMap<.+>$', summary_fn='TMapSummaryProvider', synth_cls='TMapSynthProvider')
|
||||||
_register_provider(cat, '^UObject$', summary_fn='UObjectSummaryProvider', synth_cls='UObjectSynthProvider')
|
_register_provider(cat, '^UObject$', summary_fn='UObjectSummaryProvider', synth_cls='UObjectSynthProvider')
|
||||||
|
|
||||||
for class_name in (
|
for class_name in (
|
||||||
@@ -627,11 +706,3 @@ def __lldb_init_module(debugger, dict):
|
|||||||
_register_provider(cat, '^%s$' % class_name, summary_fn='UObjectSummaryProvider')
|
_register_provider(cat, '^%s$' % class_name, summary_fn='UObjectSummaryProvider')
|
||||||
|
|
||||||
cat.SetEnabled(True)
|
cat.SetEnabled(True)
|
||||||
|
|
||||||
def counttypes():
|
|
||||||
# Count all class types.
|
|
||||||
target = lldb.debugger.GetSelectedTarget()
|
|
||||||
count = 0
|
|
||||||
for module in target.module_iter():
|
|
||||||
count += module.GetTypes(lldb.eTypeClassClass).GetSize()
|
|
||||||
print('UEDataFormatter: %d class types found' % count)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user