|
@@ -49,6 +49,26 @@ namespace System
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public void* DataPtr
|
|
|
+ {
|
|
|
+ get mut
|
|
|
+ {
|
|
|
+ if (IsObject)
|
|
|
+ {
|
|
|
+ if (mStructType == 2)
|
|
|
+ return null;
|
|
|
+ Object obj = Internal.UnsafeCastToObject((void*)mData);
|
|
|
+ return (uint8*)Internal.UnsafeCastToPtr(obj) + obj.GetType().[Friend]mMemberDataOffset;
|
|
|
+ }
|
|
|
+
|
|
|
+ var type = VariantType;
|
|
|
+ if (type.Size <= sizeof(int))
|
|
|
+ return (void*)&mData;
|
|
|
+ else
|
|
|
+ return (void*)mData;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
protected override void GCMarkMembers()
|
|
|
{
|
|
|
if ((mStructType == 1) || (mStructType == 0))
|
|
@@ -78,12 +98,12 @@ namespace System
|
|
|
if (val == null)
|
|
|
{
|
|
|
variant.mStructType = 2;
|
|
|
- variant.mData = (int)(void*)typeof(T);
|
|
|
+ variant.mData = (int)Internal.UnsafeCastToPtr(typeof(T));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
variant.mStructType = (int)(owns ? 1 : 0);
|
|
|
- variant.mData = (int)(void*)val;
|
|
|
+ variant.mData = (int)Internal.UnsafeCastToPtr(val);
|
|
|
}
|
|
|
return variant;
|
|
|
}
|
|
@@ -92,7 +112,7 @@ namespace System
|
|
|
{
|
|
|
Variant variant;
|
|
|
Type type = typeof(T);
|
|
|
- variant.mStructType = (int)(void*)type;
|
|
|
+ variant.mStructType = (int)Internal.UnsafeCastToPtr(type);
|
|
|
if (sizeof(T) <= sizeof(int))
|
|
|
{
|
|
|
variant.mData = 0;
|
|
@@ -111,7 +131,7 @@ namespace System
|
|
|
{
|
|
|
Variant variant;
|
|
|
Type type = typeof(T);
|
|
|
- variant.mStructType = (int)(void*)type;
|
|
|
+ variant.mStructType = (int)Internal.UnsafeCastToPtr(type);
|
|
|
if (type.Size <= sizeof(int))
|
|
|
{
|
|
|
variant.mData = 0;
|
|
@@ -130,8 +150,7 @@ namespace System
|
|
|
{
|
|
|
Variant variant;
|
|
|
Debug.Assert(!type.IsObject);
|
|
|
- //Debug.Assert((type.GetUnderlyingType() == typeof(T)) || (type == typeof(T)));
|
|
|
- variant.mStructType = (int)(void*)type;
|
|
|
+ variant.mStructType = (int)Internal.UnsafeCastToPtr(type);
|
|
|
if (type.Size <= sizeof(int))
|
|
|
{
|
|
|
variant.mData = 0;
|
|
@@ -146,27 +165,27 @@ namespace System
|
|
|
return variant;
|
|
|
}
|
|
|
|
|
|
- public static void* Alloc(Type type, out Variant variant)
|
|
|
+ public static (Variant, void*) Alloc(Type type)
|
|
|
{
|
|
|
- variant = .();
|
|
|
+ Variant variant = .();
|
|
|
|
|
|
if (type.IsObject)
|
|
|
{
|
|
|
- return &variant.mData;
|
|
|
+ return (variant, &variant.mData);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- variant.mStructType = (int)(void*)type;
|
|
|
+ variant.mStructType = (int)Internal.UnsafeCastToPtr(type);
|
|
|
if (type.Size <= sizeof(int))
|
|
|
{
|
|
|
variant.mData = 0;
|
|
|
- return &variant.mData;
|
|
|
+ return (variant, &variant.mData);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
void* data = new uint8[type.[Friend]mSize]*;
|
|
|
variant.mData = (int)data;
|
|
|
- return data;
|
|
|
+ return (variant, data);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -222,8 +241,9 @@ namespace System
|
|
|
if (IsObject)
|
|
|
{
|
|
|
if (mStructType == 2)
|
|
|
- *((Object*)dest) =null;
|
|
|
- *((Object*)dest) = Internal.UnsafeCastToObject((void*)mData);
|
|
|
+ *((Object*)dest) = null;
|
|
|
+ else
|
|
|
+ *((Object*)dest) = Internal.UnsafeCastToObject((void*)mData);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -282,5 +302,58 @@ namespace System
|
|
|
{
|
|
|
v1.Get<T>() == v2.Get<T>()
|
|
|
}
|
|
|
+
|
|
|
+ public static Result<Variant> CreateFromVariant(Variant varFrom)
|
|
|
+ {
|
|
|
+ Variant varTo = varFrom;
|
|
|
+ if (varTo.mStructType == 1)
|
|
|
+ varTo.mStructType = 0;
|
|
|
+ if (varTo.mStructType > 2)
|
|
|
+ {
|
|
|
+ let type = (Type)Internal.UnsafeCastToObject((void*)varFrom.mStructType);
|
|
|
+ if (type.[Friend]mSize > sizeof(int))
|
|
|
+ {
|
|
|
+ void* data = new uint8[type.[Friend]mSize]*;
|
|
|
+ Internal.MemCpy(data, (void*)varFrom.mData, type.[Friend]mSize);
|
|
|
+ varTo.mData = (int)data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return varTo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Result<Variant> CreateFromBoxed(Object objectFrom)
|
|
|
+ {
|
|
|
+ if (objectFrom == null)
|
|
|
+ return default;
|
|
|
+
|
|
|
+ Variant variant = ?;
|
|
|
+ Type objType = objectFrom.[Friend]RawGetType();
|
|
|
+ if (objType.IsBoxed)
|
|
|
+ {
|
|
|
+ void* srcDataPtr = (uint8*)Internal.UnsafeCastToPtr(objectFrom) + objType.[Friend]mMemberDataOffset;
|
|
|
+
|
|
|
+ var underlying = objType.UnderlyingType;
|
|
|
+ variant.mStructType = (int)Internal.UnsafeCastToPtr(underlying);
|
|
|
+ if (underlying.Size <= sizeof(int))
|
|
|
+ {
|
|
|
+ variant.mData = 0;
|
|
|
+ *(int*)&variant.mData = *(int*)srcDataPtr;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ void* data = new uint8[underlying.[Friend]mSize]*;
|
|
|
+ Internal.MemCpy(data, srcDataPtr, underlying.[Friend]mSize);
|
|
|
+ variant.mData = (int)data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ variant.mStructType = 0;
|
|
|
+ variant.mData = (int)Internal.UnsafeCastToPtr(objectFrom);
|
|
|
+ }
|
|
|
+
|
|
|
+ return variant;
|
|
|
+ }
|
|
|
}
|
|
|
}
|