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

Disallow object-to-void* casting. Lowering fixes. Variant fixes.

This commit is contained in:
Brian Fiete 2020-06-23 07:32:53 -07:00
parent bca0440b16
commit 16be83ceda
12 changed files with 174 additions and 82 deletions

View file

@ -421,7 +421,7 @@ namespace System.IO
ofn.mTitle = mTitle.ToScopedNativeWChar!::();
ofn.mFlags = Options | (Windows.OFN_EXPLORER | Windows.OFN_ENABLEHOOK | Windows.OFN_ENABLESIZING);
ofn.mHook = hookProcPtr;
ofn.mCustData = (int)(void*)this;
ofn.mCustData = (int)Internal.UnsafeCastToPtr(this);
ofn.mFlagsEx = Windows.OFN_USESHELLITEM;
if (mDefaultExt != null && AddExtension)
ofn.mDefExt = mDefaultExt;

View file

@ -89,7 +89,7 @@ namespace System
int IHashable.GetHashCode()
{
return (int)(void*)this;
return (int)Internal.UnsafeCastToPtr(this);
}
public virtual void ToString(String strBuffer)
@ -97,7 +97,7 @@ namespace System
//strBuffer.Set(stack string(GetType().mName));
RawGetType().GetName(strBuffer);
strBuffer.Append("@");
((int)(void*)this).ToString(strBuffer, "X", null);
((int)Internal.UnsafeCastToPtr(this)).ToString(strBuffer, "X", null);
}
[SkipCall, NoShow]

View file

@ -64,10 +64,10 @@ namespace System.Reflection
}
Type fieldType = Type.[Friend]GetType(mFieldData.mFieldTypeId);
void* fieldDataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust;
void* fieldDataAddr = ((uint8*)Internal.UnsafeCastToPtr(obj)) + mFieldData.mDataOffset + dataOffsetAdjust;
Type rawValueType = value.[Friend]RawGetType();
void* valueDataAddr = ((uint8*)(void*)value) + rawValueType.[Friend]mMemberDataOffset;
void* valueDataAddr = ((uint8*)Internal.UnsafeCastToPtr(value)) + rawValueType.[Friend]mMemberDataOffset;
Type valueType = value.GetType();
@ -126,7 +126,7 @@ namespace System.Reflection
Type fieldType = Type.[Friend]GetType(mFieldData.mFieldTypeId);
void* dataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust;
void* dataAddr = ((uint8*)Internal.UnsafeCastToPtr(obj)) + mFieldData.mDataOffset + dataOffsetAdjust;
if (value.VariantType != fieldType)
return .Err;//("Invalid type");
@ -154,7 +154,7 @@ namespace System.Reflection
if (type.IsBoxed)
return ((uint8*)(void*)value) + type.[Friend]mMemberDataOffset;
return ((uint8*)(void*)value);
return ((uint8*)Internal.UnsafeCastToPtr(value));
}
public Result<void> GetValue<TMember>(Object target, out TMember value)
@ -237,7 +237,7 @@ namespace System.Reflection
void* targetDataAddr = (void*)(int)mFieldData.mConstValue;
Type fieldType = Type.[Friend]GetType(mFieldData.mFieldTypeId);
value.[Friend]mStructType = (int)(void*)fieldType;
value.[Friend]mStructType = (int)Internal.UnsafeCastToPtr(fieldType);
TypeCode typeCode = fieldType.[Friend]mTypeCode;
if (typeCode == TypeCode.Enum)

View file

@ -238,7 +238,7 @@ namespace System.Reflection
if (args.Length != mMethodData.mParamCount)
return .Err(.ParamCountMismatch);
var (retVal, variantData) = Variant.Alloc(retType);
var variantData = Variant.Alloc(retType, var retVal);
void* retData = variantData;
// Struct return? Manually add it as an arg after 'this'. Revisit this - this is architecture-dependent.
@ -500,7 +500,7 @@ namespace System.Reflection
if (args.Count != mMethodData.mParamCount)
return .Err(.ParamCountMismatch);
var (retVal, variantData) = Variant.Alloc(retType);
var variantData = Variant.Alloc(retType, var retVal);
void* retData = variantData;
// Struct return? Manually add it as an arg after 'this'. Revisit this - this is architecture-dependent.

View file

@ -98,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;
}
@ -112,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;
@ -131,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;
@ -150,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;
@ -176,7 +175,7 @@ namespace System
}
else
{
variant.mStructType = (int)(void*)type;
variant.mStructType = (int)Internal.UnsafeCastToPtr(type);
if (type.Size <= sizeof(int))
{
variant.mData = 0;
@ -304,18 +303,57 @@ namespace System
v1.Get<T>() == v2.Get<T>()
}
public static Result<Variant> CreateFromVariant(Variant varFrom, bool reference = true)
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> CreateFromObject(Object objectFrom, bool reference = true)
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;
}
}
}