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:
parent
5bdaeadc25
commit
2eb7ce3e1a
7 changed files with 387 additions and 7 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue