1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-19 00:20:25 +02:00

Added Variant support to reflected method invocation

This commit is contained in:
Brian Fiete 2020-06-22 17:06:26 -07:00
parent 5bdaeadc25
commit 2eb7ce3e1a
7 changed files with 387 additions and 7 deletions

View file

@ -32,6 +32,26 @@ namespace System.Reflection
}
}
public static Result<int64> ToInt64(Variant variant)
{
var variant;
var dataPtr = variant.DataPtr;
switch (variant.VariantType.[Friend]mTypeCode)
{
case .Int8: return (.)*(int8*)dataPtr;
case .Int16: return (.)*(int16*)dataPtr;
case .Int32: return (.)*(int32*)dataPtr;
case .Int64: return (.)*(int64*)dataPtr;
case .UInt8, .Char8: return (.)*(uint8*)dataPtr;
case .UInt16, .Char16: return (.)*(uint16*)dataPtr;
case .UInt32, .Char32: return (.)*(uint32*)dataPtr;
case .UInt64: return (.)*(uint64*)dataPtr;
case .Int: return (.)*(int*)dataPtr;
case .UInt: return (.)*(uint*)dataPtr;
default: return .Err;
}
}
public static bool IntCanFit(int64 val, Type type)
{
switch (type.[Friend]mTypeCode)
@ -55,6 +75,53 @@ namespace System.Reflection
}
}
public static Result<Variant> ConvertTo(Variant variant, Type type)
{
var variant;
if (variant.VariantType == type)
{
return Variant.CreateFromVariant(variant);
}
var varType = variant.VariantType;
void* dataPtr = variant.DataPtr;
if (varType.IsPrimitive)
{
if (varType.IsInteger)
{
int64 intVal = ToInt64(variant);
switch (type.[Friend]mTypeCode)
{
case .Float:
float val = (.)intVal;
return Variant.Create(type, &val);
case .Double:
double val = (.)intVal;
return Variant.Create(type, &val);
default:
}
if (IntCanFit(intVal, type))
{
return Variant.Create(type, &intVal);
}
}
else if (varType.IsFloatingPoint)
{
if ((type.[Friend]mTypeCode == .Double) &&
(varType.[Friend]mTypeCode == .Float))
{
double val = (.)*(float*)dataPtr;
return Variant.Create(type, &val);
}
}
}
return .Err;
}
public static Result<Variant> ConvertTo(Object obj, Type type)
{
if (obj.GetType() == type)
@ -63,6 +130,7 @@ namespace System.Reflection
}
var (objType, dataPtr) = GetTypeAndPointer(obj);
if (objType.IsPrimitive)
{
if (objType.IsInteger)