_wip
This commit is contained in:
@@ -304,7 +304,7 @@ MTypeObject* MUtils::BoxVariantType(const VariantType& value)
|
||||
return INTERNAL_TYPE_GET_OBJECT(mType);
|
||||
}
|
||||
|
||||
Variant MUtils::UnboxVariant(MObject* value)
|
||||
Variant MUtils::UnboxVariant(MObject* value, bool releaseHandle)
|
||||
{
|
||||
if (value == nullptr)
|
||||
return Variant::Null;
|
||||
@@ -345,7 +345,11 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
case MTypes::R8:
|
||||
return *static_cast<double*>(unboxed);
|
||||
case MTypes::String:
|
||||
{
|
||||
if (releaseHandle)
|
||||
MUtils::FreeManaged<String>(value);
|
||||
return Variant(MUtils::ToString((MString*)value));
|
||||
}
|
||||
case MTypes::Ptr:
|
||||
return *static_cast<void**>(unboxed);
|
||||
case MTypes::ValueType:
|
||||
@@ -400,6 +404,8 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
{
|
||||
Variant v;
|
||||
v.SetBlob(ptr, MCore::Array::GetLength((MArray*)value));
|
||||
if (releaseHandle)
|
||||
MUtils::FreeManaged<Array<byte>>(value);
|
||||
return v;
|
||||
}
|
||||
const StringAnsiView fullname = arrayClass->GetFullName();
|
||||
@@ -508,7 +514,10 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
{
|
||||
// Array of Objects
|
||||
for (int32 i = 0; i < array.Count(); i++)
|
||||
array[i] = UnboxVariant(((MObject**)ptr)[i]);
|
||||
array[i] = UnboxVariant(((MObject**)ptr)[i], releaseHandle);
|
||||
|
||||
if (releaseHandle)
|
||||
MUtils::FreeManaged<Array<byte>>(value);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
@@ -527,10 +536,13 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
{
|
||||
MObject* keyManaged = managedKeysPtr[i];
|
||||
MObject* valueManaged = managed.GetValue(keyManaged);
|
||||
native.Add(UnboxVariant(keyManaged), UnboxVariant(valueManaged));
|
||||
native.Add(UnboxVariant(keyManaged, releaseHandle), UnboxVariant(valueManaged, releaseHandle));
|
||||
}
|
||||
Variant v(MoveTemp(native));
|
||||
v.Type.SetTypeName(klass->GetFullName());
|
||||
if (releaseHandle)
|
||||
MCore::GCHandle::Free(*(MGCHandle*)&value);
|
||||
//MUtils::FreeManaged<Dictionary<byte, byte>>(value);
|
||||
return v;
|
||||
}
|
||||
break;
|
||||
@@ -548,6 +560,8 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
v.Type = MoveTemp(VariantType(VariantType::Enum, fullname));
|
||||
// TODO: what about 64-bit enum? use enum size with memcpy
|
||||
v.AsUint64 = *static_cast<uint32*>(MCore::Object::Unbox(value));
|
||||
if (releaseHandle)
|
||||
MUtils::FreeManaged<byte>(value);
|
||||
return v;
|
||||
}
|
||||
if (klass->IsValueType())
|
||||
@@ -565,10 +579,12 @@ Variant MUtils::UnboxVariant(MObject* value)
|
||||
type.Struct.Unbox(v.AsBlob.Data, value);
|
||||
return v;
|
||||
}
|
||||
return Variant(value);
|
||||
}
|
||||
|
||||
return Variant(value);
|
||||
auto variant = Variant(value);
|
||||
if (releaseHandle)
|
||||
MUtils::FreeManaged<byte>(value);
|
||||
return variant;
|
||||
}
|
||||
|
||||
MObject* MUtils::BoxVariant(const Variant& value)
|
||||
|
||||
Reference in New Issue
Block a user