Simplify Variant code with define for ManagedObject handle

This commit is contained in:
Wojtek Figat
2023-08-25 10:22:09 +02:00
parent 2026c84baa
commit 992cc381d5

View File

@@ -28,6 +28,12 @@
#include "Engine/Utilities/Crc.h"
#include "Engine/Utilities/StringConverter.h"
#if USE_NETCORE
#define MANAGED_GC_HANDLE AsUint64
#else
#define MANAGED_GC_HANDLE AsUint
#endif
namespace
{
const char* InBuiltTypesTypeNames[40] =
@@ -498,13 +504,8 @@ Variant::Variant(Variant&& other) noexcept
other.AsDictionary = nullptr;
break;
case VariantType::ManagedObject:
#if USE_NETCORE
AsUint64 = other.AsUint64;
other.AsUint64 = 0;
#elif USE_MONO
AsUint = other.AsUint;
other.AsUint = 0;
#endif
MANAGED_GC_HANDLE = other.MANAGED_GC_HANDLE;
other.MANAGED_GC_HANDLE = 0;
break;
case VariantType::Null:
case VariantType::Void:
@@ -625,11 +626,7 @@ Variant::Variant(Asset* v)
Variant::Variant(MObject* v)
: Type(VariantType::ManagedObject, v ? MCore::Object::GetClass(v) : nullptr)
{
#if USE_NETCORE
AsUint64 = v ? MCore::GCHandle::New(v) : 0;
#else
AsUint = v ? MCore::GCHandle::New(v) : 0;
#endif
MANAGED_GC_HANDLE = v ? MCore::GCHandle::New(v) : 0;
}
#else
@@ -968,13 +965,8 @@ Variant::~Variant()
Delete(AsDictionary);
break;
case VariantType::ManagedObject:
#if USE_NETCORE
if (AsUint64)
MCore::GCHandle::Free(AsUint64);
#elif USE_MONO
if (AsUint)
MCore::GCHandle::Free(AsUint);
#endif
if (MANAGED_GC_HANDLE)
MCore::GCHandle::Free(MANAGED_GC_HANDLE);
break;
default: ;
}
@@ -1027,13 +1019,8 @@ Variant& Variant::operator=(Variant&& other)
other.AsDictionary = nullptr;
break;
case VariantType::ManagedObject:
#if USE_NETCORE
AsUint64 = other.AsUint64;
other.AsUint64 = 0;
#elif USE_MONO
AsUint = other.AsUint;
other.AsUint = 0;
#endif
MANAGED_GC_HANDLE = other.MANAGED_GC_HANDLE;
other.MANAGED_GC_HANDLE = 0;
break;
case VariantType::Null:
case VariantType::Void:
@@ -1105,11 +1092,7 @@ Variant& Variant::operator=(const Variant& other)
AsDictionary = New<Dictionary<Variant, Variant>>(*other.AsDictionary);
break;
case VariantType::ManagedObject:
#if USE_NETCORE
AsUint64 = other.AsUint64 ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.AsUint64)) : 0;
#elif USE_MONO
AsUint = other.AsUint ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.AsUint)) : 0;
#endif
MANAGED_GC_HANDLE = other.MANAGED_GC_HANDLE ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.MANAGED_GC_HANDLE)) : 0;
break;
case VariantType::Null:
case VariantType::Void:
@@ -1234,11 +1217,9 @@ bool Variant::operator==(const Variant& other) const
return false;
return AsBlob.Length == other.AsBlob.Length && StringUtils::Compare(static_cast<const char*>(AsBlob.Data), static_cast<const char*>(other.AsBlob.Data), AsBlob.Length - 1) == 0;
case VariantType::ManagedObject:
#if USE_NETCORE
#if USE_CSHARP
// TODO: invoke C# Equality logic?
return AsUint64 == other.AsUint64 || MCore::GCHandle::GetTarget(AsUint64) == MCore::GCHandle::GetTarget(other.AsUint64);
#elif USE_MONO
return AsUint == other.AsUint || MCore::GCHandle::GetTarget(AsUint) == MCore::GCHandle::GetTarget(other.AsUint);
return MANAGED_GC_HANDLE == other.MANAGED_GC_HANDLE || MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) == MCore::GCHandle::GetTarget(other.MANAGED_GC_HANDLE);
#else
return false;
#endif
@@ -1331,10 +1312,8 @@ Variant::operator bool() const
case VariantType::Asset:
return AsAsset != nullptr;
case VariantType::ManagedObject:
#if USE_NETCORE
return AsUint64 != 0 && MCore::GCHandle::GetTarget(AsUint64) != nullptr;
#elif USE_MONO
return AsUint != 0 && MCore::GCHandle::GetTarget(AsUint) != nullptr;
#if USE_CSHARP
return MANAGED_GC_HANDLE != 0 && MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) != nullptr;
#else
return false;
#endif
@@ -1605,10 +1584,8 @@ Variant::operator void*() const
case VariantType::Blob:
return AsBlob.Data;
case VariantType::ManagedObject:
#if USE_NETCORE
return AsUint64 ? MCore::GCHandle::GetTarget(AsUint64) : nullptr;
#elif USE_MONO
return AsUint ? MCore::GCHandle::GetTarget(AsUint) : nullptr;
#if USE_CSHARP
return MANAGED_GC_HANDLE ? MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) : nullptr;
#else
return nullptr;
#endif
@@ -1654,10 +1631,8 @@ Variant::operator ScriptingObject*() const
Variant::operator MObject*() const
{
#if USE_NETCORE
return Type.Type == VariantType::ManagedObject && AsUint64 ? MCore::GCHandle::GetTarget(AsUint64) : nullptr;
#elif USE_MONO
return Type.Type == VariantType::ManagedObject && AsUint ? MCore::GCHandle::GetTarget(AsUint) : nullptr;
#if USE_CSHARP
return Type.Type == VariantType::ManagedObject && MANAGED_GC_HANDLE ? MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) : nullptr;
#else
return nullptr;
#endif
@@ -2370,12 +2345,9 @@ void Variant::SetType(const VariantType& type)
Delete(AsDictionary);
break;
case VariantType::ManagedObject:
#if USE_NETCORE
if (AsUint64)
MCore::GCHandle::Free(AsUint64);
#elif USE_MONO
if (AsUint)
MCore::GCHandle::Free(AsUint);
#if USE_CSHARP
if (MANAGED_GC_HANDLE)
MCore::GCHandle::Free(MANAGED_GC_HANDLE);
#endif
break;
default: ;
@@ -2430,10 +2402,8 @@ void Variant::SetType(const VariantType& type)
AsDictionary = New<Dictionary<Variant, Variant>>();
break;
case VariantType::ManagedObject:
#if USE_NETCORE
AsUint64 = 0;
#elif USE_MONO
AsUint = 0;
#if USE_CSHARP
MANAGED_GC_HANDLE = 0;
#endif
break;
case VariantType::Structure:
@@ -2487,12 +2457,9 @@ void Variant::SetType(VariantType&& type)
Delete(AsDictionary);
break;
case VariantType::ManagedObject:
#if USE_NETCORE
if (AsUint64)
MCore::GCHandle::Free(AsUint64);
#elif USE_MONO
if (AsUint)
MCore::GCHandle::Free(AsUint);
#if USE_CSHARP
if (MANAGED_GC_HANDLE)
MCore::GCHandle::Free(MANAGED_GC_HANDLE);
#endif
break;
default: ;
@@ -2547,10 +2514,8 @@ void Variant::SetType(VariantType&& type)
AsDictionary = New<Dictionary<Variant, Variant>>();
break;
case VariantType::ManagedObject:
#if USE_NETCORE
AsUint64 = 0;
#elif USE_MONO
AsUint = 0;
#if USE_CSHARP
MANAGED_GC_HANDLE = 0;
#endif
break;
case VariantType::Structure:
@@ -2680,21 +2645,13 @@ void Variant::SetManagedObject(MObject* object)
{
if (Type.Type != VariantType::ManagedObject)
SetType(VariantType(VariantType::ManagedObject, MCore::Object::GetClass(object)));
#if USE_NETCORE
AsUint64 = MCore::GCHandle::New(object);
#else
AsUint = MCore::GCHandle::New(object);
#endif
MANAGED_GC_HANDLE = MCore::GCHandle::New(object);
}
else
{
if (Type.Type != VariantType::ManagedObject || Type.TypeName)
SetType(VariantType(VariantType::ManagedObject));
#if USE_NETCORE
AsUint64 = 0;
#elif USE_MONO
AsUint = 0;
#endif
MANAGED_GC_HANDLE = 0;
}
#endif
}
@@ -2807,10 +2764,8 @@ String Variant::ToString() const
case VariantType::Typename:
return String((const char*)AsBlob.Data, AsBlob.Length ? AsBlob.Length - 1 : 0);
case VariantType::ManagedObject:
#if USE_NETCORE
return AsUint64 ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(AsUint64)))) : TEXT("null");
#elif USE_MONO
return AsUint ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(AsUint)))) : TEXT("null");
#if USE_CSHARP
return MANAGED_GC_HANDLE ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE)))) : TEXT("null");
#else
return String::Empty;
#endif
@@ -2981,11 +2936,7 @@ Variant Variant::NewValue(const StringAnsiView& typeName)
MObject* instance = mclass->CreateInstance();
if (instance)
{
#if USE_NETCORE
v.AsUint64 = MCore::GCHandle::New(instance);
#else
v.AsUint = MCore::GCHandle::New(instance);
#endif
v.MANAGED_GC_HANDLE = MCore::GCHandle::New(instance);
}
}
}
@@ -3930,12 +3881,7 @@ void Variant::AllocStructure()
Platform::MemoryCopy(AsBlob.Data, data, AsBlob.Length);
#else
Type.Type = VariantType::ManagedObject;
#if USE_NETCORE
AsUint64 = MCore::GCHandle::New(instance);
#else
AsUint = MCore::GCHandle::New(instance);
#endif
MANAGED_GC_HANDLE = MCore::GCHandle::New(instance);
#endif
}
else
@@ -4027,10 +3973,8 @@ uint32 GetHash(const Variant& key)
case VariantType::Typename:
return GetHash((const char*)key.AsBlob.Data);
case VariantType::ManagedObject:
#if USE_NETCORE
return key.AsUint64 ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.AsUint64)) : 0;
#elif USE_MONO
return key.AsUint ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.AsUint)) : 0;
#if USE_CSHARP
return key.MANAGED_GC_HANDLE ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.MANAGED_GC_HANDLE)) : 0;
#else
return 0;
#endif