Merge branch 'scripting-int16-support' of git://github.com/jb-perrier/FlaxEngine into jb-perrier-scripting-int16-support

This commit is contained in:
Wojtek Figat
2021-05-19 19:50:06 +02:00
6 changed files with 385 additions and 13 deletions

View File

@@ -160,6 +160,10 @@ const char* VariantType::GetTypeName() const
return "System.Void";
case Bool:
return "System.Boolean";
case Int16:
return "System.Int16";
case Uint16:
return "System.UInt16";
case Int:
return "System.Int32";
case Uint:
@@ -225,6 +229,12 @@ const char* VariantType::GetTypeName() const
case Bool:
result = TEXT("Bool");
break;
case Int16:
result = TEXT("Int16");
break;
case Uint16:
result = TEXT("Uint16");
break;
case Int:
result = TEXT("Int");
break;
@@ -417,6 +427,18 @@ Variant::Variant(bool v)
AsBool = v;
}
Variant::Variant(int16 v)
: Type(VariantType::Int16)
{
AsInt16 = v;
}
Variant::Variant(uint16 v)
: Type(VariantType::Uint16)
{
AsUint16 = v;
}
Variant::Variant(int32 v)
: Type(VariantType::Int)
{
@@ -896,6 +918,10 @@ bool Variant::operator==(const Variant& other) const
return true;
case VariantType::Bool:
return AsBool == other.AsBool;
case VariantType::Int16:
return AsInt16 == other.AsInt16;
case VariantType::Uint16:
return AsUint16 == other.AsUint16;
case VariantType::Int:
return AsInt == other.AsInt;
case VariantType::Uint:
@@ -1004,6 +1030,10 @@ bool Variant::operator<(const Variant& other) const
return true;
case VariantType::Bool:
return AsBool < other.AsBool;
case VariantType::Int16:
return AsInt16 < other.AsInt16;
case VariantType::Uint16:
return AsUint16 < other.AsUint16;
case VariantType::Int:
return AsInt < other.AsInt;
case VariantType::Uint:
@@ -1040,6 +1070,10 @@ Variant::operator bool() const
{
case VariantType::Bool:
return AsBool;
case VariantType::Int16:
return AsInt16 != 0;
case VariantType::Uint16:
return AsUint16 != 0;
case VariantType::Int:
return AsInt != 0;
case VariantType::Uint:
@@ -1075,6 +1109,10 @@ Variant::operator Char() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (Char)AsInt16;
case VariantType::Uint16:
return (Char)AsUint16;
case VariantType::Int:
return (Char)AsInt;
case VariantType::Uint:
@@ -1101,6 +1139,10 @@ Variant::operator int8() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (int8)AsInt16;
case VariantType::Uint16:
return (int8)AsUint16;
case VariantType::Int:
return (int8)AsInt;
case VariantType::Uint:
@@ -1127,6 +1169,10 @@ Variant::operator int16() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return AsInt16;
case VariantType::Uint16:
return (int16)AsUint16;
case VariantType::Int:
return (int16)AsInt;
case VariantType::Uint:
@@ -1153,6 +1199,10 @@ Variant::operator int32() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (int32)AsInt16;
case VariantType::Uint16:
return (int32)AsUint16;
case VariantType::Int:
return AsInt;
case VariantType::Uint:
@@ -1179,6 +1229,10 @@ Variant::operator int64() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (int64)AsInt16;
case VariantType::Uint16:
return (int64)AsUint16;
case VariantType::Int:
return (int64)AsInt;
case VariantType::Uint:
@@ -1205,6 +1259,10 @@ Variant::operator uint8() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (uint8)AsInt16;
case VariantType::Uint16:
return (uint8)AsUint16;
case VariantType::Int:
return (uint8)AsInt;
case VariantType::Uint:
@@ -1231,6 +1289,10 @@ Variant::operator uint16() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (uint16)AsInt16;
case VariantType::Uint16:
return AsUint16;
case VariantType::Int:
return (uint16)AsInt;
case VariantType::Uint:
@@ -1257,6 +1319,10 @@ Variant::operator uint32() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (uint32)AsInt16;
case VariantType::Uint16:
return (uint32)AsUint16;
case VariantType::Int:
return (uint32)AsInt;
case VariantType::Uint:
@@ -1283,6 +1349,10 @@ Variant::operator uint64() const
{
case VariantType::Bool:
return AsBool ? 1 : 0;
case VariantType::Int16:
return (uint64)AsInt16;
case VariantType::Uint16:
return (uint64)AsUint16;
case VariantType::Int:
return (uint64)AsInt;
case VariantType::Uint:
@@ -1309,6 +1379,10 @@ Variant::operator float() const
{
case VariantType::Bool:
return AsBool ? 1.0f : 0.0f;
case VariantType::Int16:
return (float)AsInt16;
case VariantType::Uint16:
return (float)AsUint16;
case VariantType::Int:
return (float)AsInt;
case VariantType::Uint:
@@ -1333,6 +1407,10 @@ Variant::operator double() const
{
case VariantType::Bool:
return AsBool ? 1.0 : 0.0;
case VariantType::Int16:
return (double)AsInt16;
case VariantType::Uint16:
return (double)AsUint16;
case VariantType::Int:
return (double)AsInt;
case VariantType::Uint:
@@ -1423,6 +1501,10 @@ Variant::operator Vector2() const
{
case VariantType::Bool:
return Vector2(AsBool ? 1.0f : 0.0f);
case VariantType::Int16:
return Vector2((float)AsInt16);
case VariantType::Uint16:
return Vector2((float)AsUint16);
case VariantType::Int:
return Vector2((float)AsInt);
case VariantType::Uint:
@@ -1459,6 +1541,10 @@ Variant::operator Vector3() const
{
case VariantType::Bool:
return Vector3(AsBool ? 1.0f : 0.0f);
case VariantType::Int16:
return Vector3((float)AsInt16);
case VariantType::Uint16:
return Vector3((float)AsUint16);
case VariantType::Int:
return Vector3((float)AsInt);
case VariantType::Uint:
@@ -1495,6 +1581,10 @@ Variant::operator Vector4() const
{
case VariantType::Bool:
return Vector4(AsBool ? 1.0f : 0.0f);
case VariantType::Int16:
return Vector4((float)AsInt16);
case VariantType::Uint16:
return Vector4((float)AsUint16);
case VariantType::Int:
return Vector4((float)AsInt);
case VariantType::Uint:
@@ -1531,6 +1621,10 @@ Variant::operator Int2() const
{
case VariantType::Bool:
return Int2((int32)(AsBool ? 1.0f : 0.0f));
case VariantType::Int16:
return Int2((int32)AsInt16);
case VariantType::Uint16:
return Int2((int32)AsUint16);
case VariantType::Int:
return Int2((int32)AsInt);
case VariantType::Uint:
@@ -1573,6 +1667,10 @@ Variant::operator Int3() const
{
case VariantType::Bool:
return Int3((int32)(AsBool ? 1 : 0));
case VariantType::Int16:
return Int3((int32)AsInt16);
case VariantType::Uint16:
return Int3((int32)AsUint16);
case VariantType::Int:
return Int3((int32)AsInt);
case VariantType::Uint:
@@ -1615,6 +1713,10 @@ Variant::operator Int4() const
{
case VariantType::Bool:
return Int4((int32)(AsBool ? 1 : 0));
case VariantType::Int16:
return Int4(AsInt16);
case VariantType::Uint16:
return Int4((int32)AsUint16);
case VariantType::Int:
return Int4(AsInt);
case VariantType::Uint:
@@ -1657,6 +1759,10 @@ Variant::operator Color() const
{
case VariantType::Bool:
return Color(AsBool ? 1.0f : 0.0f);
case VariantType::Int16:
return Color((float)AsInt16);
case VariantType::Uint16:
return Color((float)AsUint16);
case VariantType::Int:
return Color((float)AsInt);
case VariantType::Uint:
@@ -2139,6 +2245,10 @@ String Variant::ToString() const
return TEXT("null");
case VariantType::Bool:
return AsBool ? TEXT("true") : TEXT("false");
case VariantType::Int16:
return StringUtils::ToString(AsInt16);
case VariantType::Uint16:
return StringUtils::ToString(AsUint16);
case VariantType::Int:
return StringUtils::ToString(AsInt);
case VariantType::Uint:
@@ -2207,6 +2317,8 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
case VariantType::Bool:
switch (to.Type)
{
case VariantType::Int16:
case VariantType::Uint16:
case VariantType::Int:
case VariantType::Uint:
case VariantType::Int64:
@@ -2221,10 +2333,50 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
default:
return false;
}
case VariantType::Int16:
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Uint64:
case VariantType::Float:
case VariantType::Double:
case VariantType::Vector2:
case VariantType::Vector3:
case VariantType::Vector4:
case VariantType::Color:
return true;
default:
return false;
}
case VariantType::Int:
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Int16:
case VariantType::Int64:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Uint64:
case VariantType::Float:
case VariantType::Double:
case VariantType::Vector2:
case VariantType::Vector3:
case VariantType::Vector4:
case VariantType::Color:
return true;
default:
return false;
}
case VariantType::Uint16:
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Uint:
case VariantType::Uint64:
@@ -2242,7 +2394,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Uint16:
case VariantType::Uint64:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Float:
@@ -2259,7 +2413,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Uint64:
case VariantType::Float:
@@ -2276,7 +2432,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Float:
@@ -2293,7 +2451,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Int64:
case VariantType::Uint64:
@@ -2310,8 +2470,10 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Uint:
case VariantType::Uint16:
case VariantType::Int64:
case VariantType::Uint64:
case VariantType::Float:
@@ -2327,7 +2489,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Float:
@@ -2343,7 +2507,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Float:
@@ -2359,7 +2525,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Float:
@@ -2375,7 +2543,9 @@ bool Variant::CanCast(const Variant& v, const VariantType& to)
switch (to.Type)
{
case VariantType::Bool:
case VariantType::Uint16:
case VariantType::Uint:
case VariantType::Int16:
case VariantType::Int:
case VariantType::Int64:
case VariantType::Float:
@@ -2401,6 +2571,10 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Bool:
switch (to.Type)
{
case VariantType::Int16: // No portable literal suffix for short ( Available in MSVC but Undocumented : i16 )
return Variant((int16)(v.AsBool ? 1 : 0));
case VariantType::Uint16: // No portable literal suffix for short ( Available in MSVC but Undocumented : ui16 )
return Variant((uint16)(v.AsBool ? 1 : 0));
case VariantType::Int:
return Variant(v.AsBool ? 1 : 0);
case VariantType::Uint:
@@ -2424,17 +2598,51 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
default: ;
}
break;
case VariantType::Int16:
switch (to.Type)
{
case VariantType::Bool:
return Variant(v.AsInt != 0);
case VariantType::Int:
return Variant((int32)v.AsInt16);
case VariantType::Int64:
return Variant((int64)v.AsInt16);
case VariantType::Uint16:
return Variant((uint16)v.AsInt16);
case VariantType::Uint:
return Variant((uint32)v.AsInt16);
case VariantType::Uint64:
return Variant((uint64)v.AsInt16);
case VariantType::Float:
return Variant((float)v.AsInt16);
case VariantType::Double:
return Variant((double)v.AsInt16);
case VariantType::Vector2:
return Variant(Vector2((float)v.AsInt16));
case VariantType::Vector3:
return Variant(Vector3((float)v.AsInt16));
case VariantType::Vector4:
return Variant(Vector4((float)v.AsInt16));
case VariantType::Color:
return Variant(Color((float)v.AsInt16));
default: ;
}
break;
case VariantType::Int:
switch (to.Type)
{
case VariantType::Bool:
return Variant(v.AsInt != 0);
case VariantType::Int16:
return Variant((int16)v.AsInt);
case VariantType::Int64:
return Variant((int64)v.AsUint);
return Variant((int64)v.AsInt);
case VariantType::Uint16:
return Variant((uint16)v.AsInt);
case VariantType::Uint:
return Variant((uint32)v.AsInt);
case VariantType::Uint64:
return Variant((uint64)v.AsUint);
return Variant((uint64)v.AsInt);
case VariantType::Float:
return Variant((float)v.AsInt);
case VariantType::Double:
@@ -2450,15 +2658,49 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
default: ;
}
break;
case VariantType::Uint16:
switch (to.Type)
{
case VariantType::Bool:
return Variant(v.AsUint16 != 0);
case VariantType::Int16:
return Variant((int16)v.AsUint16);
case VariantType::Int:
return Variant((int32)v.AsUint16);
case VariantType::Int64:
return Variant((int64)v.AsUint16);
case VariantType::Uint16:
return Variant((uint16)v.AsUint16);
case VariantType::Uint64:
return Variant((uint64)v.AsUint16);
case VariantType::Float:
return Variant((float)v.AsUint16);
case VariantType::Double:
return Variant((double)v.AsUint16);
case VariantType::Vector2:
return Variant(Vector2((float)v.AsUint16));
case VariantType::Vector3:
return Variant(Vector3((float)v.AsUint16));
case VariantType::Vector4:
return Variant(Vector4((float)v.AsUint16));
case VariantType::Color:
return Variant(Color((float)v.AsUint16));
default: ;
}
break;
case VariantType::Uint:
switch (to.Type)
{
case VariantType::Bool:
return Variant(v.AsUint != 0);
case VariantType::Int16:
return Variant((int16)v.AsUint);
case VariantType::Int:
return Variant((int32)v.AsUint);
case VariantType::Int64:
return Variant((int64)v.AsUint);
case VariantType::Uint16:
return Variant((uint16)v.AsUint);
case VariantType::Uint64:
return Variant((uint64)v.AsUint);
case VariantType::Float:
@@ -2481,8 +2723,12 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(v.AsInt64 != 0);
case VariantType::Int64:
return Variant((int64)v.AsUint);
case VariantType::Int16:
return Variant((int16)v.AsInt64);
case VariantType::Int:
return Variant((int32)v.AsInt64);
case VariantType::Uint16:
return Variant((uint16)v.AsInt64);
case VariantType::Uint:
return Variant((uint32)v.AsInt64);
case VariantType::Uint64:
@@ -2507,10 +2753,14 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(v.AsUint64 != 0);
case VariantType::Int16:
return Variant((int16)v.AsUint64);
case VariantType::Int:
return Variant((int32)v.AsUint64);
case VariantType::Int64:
return Variant((int64)v.AsUint64);
case VariantType::Uint16:
return Variant((uint16)v.AsUint16);
case VariantType::Uint:
return Variant((uint32)v.AsUint);
case VariantType::Float:
@@ -2533,8 +2783,12 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(Math::Abs(v.AsFloat) > ZeroTolerance);
case VariantType::Int16:
return Variant((int16)v.AsFloat);
case VariantType::Int:
return Variant((int32)v.AsFloat);
case VariantType::Uint16:
return Variant((uint16)v.AsFloat);
case VariantType::Uint:
return Variant((uint32)v.AsFloat);
case VariantType::Int64:
@@ -2559,8 +2813,12 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(Math::Abs(v.AsDouble) > ZeroTolerance);
case VariantType::Int16:
return Variant((int16)v.AsDouble);
case VariantType::Int:
return Variant((int32)v.AsDouble);
case VariantType::Uint16:
return Variant((uint16)v.AsDouble);
case VariantType::Uint:
return Variant((uint32)v.AsDouble);
case VariantType::Int64:
@@ -2585,8 +2843,12 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(Math::Abs(((Vector2*)v.AsData)->X) > ZeroTolerance);
case VariantType::Int16:
return Variant((int16)((Vector2*)v.AsData)->X);
case VariantType::Int:
return Variant((int32)((Vector2*)v.AsData)->X);
case VariantType::Uint16:
return Variant((uint16)((Vector2*)v.AsData)->X);
case VariantType::Uint:
return Variant((uint32)((Vector2*)v.AsData)->X);
case VariantType::Int64:
@@ -2611,8 +2873,12 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(Math::Abs(((Vector3*)v.AsData)->X) > ZeroTolerance);
case VariantType::Int16:
return Variant((int16)((Vector3*)v.AsData)->X);
case VariantType::Int:
return Variant((int32)((Vector3*)v.AsData)->X);
case VariantType::Uint16:
return Variant((uint16)((Vector3*)v.AsData)->X);
case VariantType::Uint:
return Variant((uint32)((Vector3*)v.AsData)->X);
case VariantType::Int64:
@@ -2637,8 +2903,12 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(Math::Abs(((Vector4*)v.AsData)->X) > ZeroTolerance);
case VariantType::Int16:
return Variant((int16)((Vector4*)v.AsData)->X);
case VariantType::Int:
return Variant((int32)((Vector4*)v.AsData)->X);
case VariantType::Uint16:
return Variant((uint16)((Vector4*)v.AsData)->X);
case VariantType::Uint:
return Variant((uint32)((Vector4*)v.AsData)->X);
case VariantType::Int64:
@@ -2663,8 +2933,12 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
{
case VariantType::Bool:
return Variant(Math::Abs(((Color*)v.AsData)->R) > ZeroTolerance);
case VariantType::Int16:
return Variant((int16)((Color*)v.AsData)->R);
case VariantType::Int:
return Variant((int32)((Color*)v.AsData)->R);
case VariantType::Uint16:
return Variant((uint16)((Color*)v.AsData)->R);
case VariantType::Uint:
return Variant((uint32)((Color*)v.AsData)->R);
case VariantType::Int64:
@@ -2696,6 +2970,8 @@ bool Variant::NearEqual(const Variant& a, const Variant& b, float epsilon)
return false;
switch (a.Type.Type)
{
case VariantType::Int16:
return Math::Abs(a.AsInt16 - b.AsInt16) <= (int32)epsilon;
case VariantType::Int:
return Math::Abs(a.AsInt - b.AsInt) <= (int32)epsilon;
case VariantType::Int64:
@@ -2737,8 +3013,12 @@ Variant Variant::Lerp(const Variant& a, const Variant& b, float alpha)
{
case VariantType::Bool:
return alpha < 0.5f ? a : b;
case VariantType::Int16:
return Math::Lerp(a.AsInt16, b.AsInt16, alpha);
case VariantType::Int:
return Math::Lerp(a.AsInt, b.AsInt, alpha);
case VariantType::Uint16:
return Math::Lerp(a.AsUint16, b.AsUint16, alpha);
case VariantType::Uint:
return Math::Lerp(a.AsUint, b.AsUint, alpha);
case VariantType::Int64:
@@ -2844,8 +3124,12 @@ uint32 GetHash(const Variant& key)
{
case VariantType::Bool:
return GetHash(key.AsBool);
case VariantType::Int16:
return GetHash(key.AsInt16);
case VariantType::Int:
return GetHash(key.AsInt);
case VariantType::Uint16:
return GetHash(key.AsUint16);
case VariantType::Uint:
return GetHash(key.AsUint);
case VariantType::Int64:

View File

@@ -58,6 +58,9 @@ API_STRUCT(InBuild) struct FLAXENGINE_API VariantType
Int3,
Int4,
Int16,
Uint16,
MAX
};
@@ -135,6 +138,8 @@ API_STRUCT(InBuild) struct FLAXENGINE_API Variant
union
{
bool AsBool;
int16 AsInt16;
uint16 AsUint16;
int32 AsInt;
uint32 AsUint;
int64 AsInt64;
@@ -184,6 +189,8 @@ public:
Variant(Variant&& other) noexcept;
Variant(bool v);
Variant(int16 v);
Variant(uint16 v);
Variant(int32 v);
Variant(uint32 v);
Variant(int64 v);

View File

@@ -154,13 +154,13 @@ VariantType MUtils::UnboxVariantType(MonoType* monoType)
if (klass == mono_get_boolean_class() || monoType->type == MONO_TYPE_BOOLEAN)
return VariantType(VariantType::Bool);
if (klass == mono_get_byte_class() || monoType->type == MONO_TYPE_U1)
return VariantType(VariantType::Int);
return VariantType(VariantType::Int16);
if (klass == mono_get_sbyte_class() || monoType->type == MONO_TYPE_I1)
return VariantType(VariantType::Int);
return VariantType(VariantType::Int16);
if (klass == mono_get_int16_class() || monoType->type == MONO_TYPE_I2)
return VariantType(VariantType::Int);
return VariantType(VariantType::Int16);
if (klass == mono_get_uint16_class() || monoType->type == MONO_TYPE_U2)
return VariantType(VariantType::Uint);
return VariantType(VariantType::Uint16);
if (klass == mono_get_int32_class() || monoType->type == MONO_TYPE_I4)
return VariantType(VariantType::Int);
if (klass == mono_get_uint32_class() || monoType->type == MONO_TYPE_U4)
@@ -266,13 +266,13 @@ Variant MUtils::UnboxVariant(MonoObject* value)
if (klass == mono_get_boolean_class())
return *static_cast<bool*>(mono_object_unbox(value));
if (klass == mono_get_byte_class())
return (int32)*static_cast<byte*>(mono_object_unbox(value));
return (int16)*static_cast<byte*>(mono_object_unbox(value));
if (klass == mono_get_sbyte_class())
return (int32)*static_cast<int8*>(mono_object_unbox(value));
return (int16)*static_cast<int8*>(mono_object_unbox(value));
if (klass == mono_get_int16_class())
return (int32)*static_cast<int16*>(mono_object_unbox(value));
return *static_cast<int16*>(mono_object_unbox(value));
if (klass == mono_get_uint16_class())
return (uint32)*static_cast<uint16*>(mono_object_unbox(value));
return *static_cast<uint16*>(mono_object_unbox(value));
if (klass == mono_get_int32_class())
return *static_cast<int32*>(mono_object_unbox(value));
if (klass == mono_get_uint32_class())
@@ -365,6 +365,10 @@ MonoObject* MUtils::BoxVariant(const Variant& value)
return nullptr;
case VariantType::Bool:
return mono_value_box(mono_domain_get(), mono_get_boolean_class(), (void*)&value.AsBool);
case VariantType::Int16:
return mono_value_box(mono_domain_get(), mono_get_int16_class(), (void*)&value.AsInt16);
case VariantType::Uint16:
return mono_value_box(mono_domain_get(), mono_get_uint16_class(), (void*)&value.AsUint16);
case VariantType::Int:
return mono_value_box(mono_domain_get(), mono_get_int32_class(), (void*)&value.AsInt);
case VariantType::Uint:
@@ -534,6 +538,10 @@ MonoClass* MUtils::GetClass(const VariantType& value)
return mono_get_void_class();
case VariantType::Bool:
return mono_get_boolean_class();
case VariantType::Int16:
return mono_get_int16_class();
case VariantType::Uint16:
return mono_get_uint16_class();
case VariantType::Int:
return mono_get_int32_class();
case VariantType::Uint:
@@ -600,6 +608,10 @@ MonoClass* MUtils::GetClass(const Variant& value)
return mono_get_void_class();
case VariantType::Bool:
return mono_get_boolean_class();
case VariantType::Int16:
return mono_get_int16_class();
case VariantType::Uint16:
return mono_get_uint16_class();
case VariantType::Int:
return mono_get_int32_class();
case VariantType::Uint:
@@ -700,12 +712,18 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& fa
case MONO_TYPE_CHAR:
case MONO_TYPE_I1:
case MONO_TYPE_I2:
if (value.Type.Type != VariantType::Int16)
value = (int16)value;
return &value.AsInt16;
case MONO_TYPE_I4:
if (value.Type.Type != VariantType::Int)
value = (int32)value;
return &value.AsInt;
case MONO_TYPE_U1:
case MONO_TYPE_U2:
if (value.Type.Type != VariantType::Uint16)
value = (uint16)value;
return &value.AsUint16;
case MONO_TYPE_U4:
if (value.Type.Type != VariantType::Uint)
value = (uint32)value;

View File

@@ -274,6 +274,12 @@ void ReadStream::ReadVariant(Variant* data)
case VariantType::Bool:
data->AsBool = ReadBool();
break;
case VariantType::Int16:
ReadInt16(&data->AsInt16);
break;
case VariantType::Uint16:
ReadUint16(&data->AsUint16);
break;
case VariantType::Int:
ReadInt32(&data->AsInt);
break;
@@ -573,6 +579,12 @@ void WriteStream::WriteVariant(const Variant& data)
case VariantType::Bool:
WriteBool(data.AsBool);
break;
case VariantType::Int16:
WriteInt16(data.AsInt16);
break;
case VariantType::Uint16:
WriteUint16(data.AsUint16);
break;
case VariantType::Int:
WriteInt32(data.AsInt);
break;