EM_Task/CoreUObject/Private/Serialization/ArchiveDescribeReference.cpp
Boshuang Zhao 5144a49c9b add
2026-02-13 16:18:33 +08:00

50 lines
1.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Serialization/ArchiveDescribeReference.h"
#include "UObject/UnrealType.h"
FArchiveDescribeReference::FArchiveDescribeReference(UObject* Src, UObject* InTarget, FOutputDevice& InOutput): Source(Src), Target(InTarget), Output(InOutput)
{
// use the optimized RefLink to skip over properties which don't contain object references
ArIsObjectReferenceCollector = true;
ArIgnoreArchetypeRef = false;
ArIgnoreOuterRef = true;
ArIgnoreClassRef = false;
Source->Serialize(*this);
}
FArchive& FArchiveDescribeReference::operator<<(class UObject*& Obj)
{
if (Obj == Target)
{
if (GetSerializedProperty())
{
Output.Logf(TEXT(" [%s]"), *GetSerializedProperty()->GetFullName());
}
else
{
Output.Logf(TEXT(" [native]"));
}
PTRINT BigOffset = ((uint8*)&Obj) - (uint8*)Source;
if (BigOffset > 0 && BigOffset < Source->GetClass()->GetPropertiesSize())
{
int32 Offset = int32(BigOffset);
UClass* UseClass = Source->GetClass();
UClass* SuperClass = UseClass->GetSuperClass();
while (1)
{
if (!SuperClass || Offset >= SuperClass->GetPropertiesSize())
{
break;
}
UseClass = SuperClass;
SuperClass = UseClass->GetSuperClass();
}
Output.Logf(TEXT(" class %s offset %d, offset from UObject %d "), *UseClass->GetName(), SuperClass ? Offset - SuperClass->GetPropertiesSize() : Offset, Offset);
}
}
return *this;
}