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

Reflection fixes

This commit is contained in:
Brian Fiete 2019-11-29 09:24:13 -08:00
parent b6e49673c6
commit a4476332fe
5 changed files with 91 additions and 113 deletions

View file

@ -64,11 +64,26 @@ namespace System.Reflection
}
Type fieldType = Type.GetType(mFieldData.mFieldTypeId);
//Type objType = obj.GetType();
void* fieldDataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust;
void* dataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust;
Type rawValueType = value.RawGetType();
void* valueDataAddr = ((uint8*)(void*)value) + rawValueType.mMemberDataOffset;
switch (fieldType.mTypeCode)
Type valueType = value.GetType();
if ((valueType != fieldType) && (valueType.IsTypedPrimitive))
valueType = valueType.UnderlyingType;
if (valueType == fieldType)
{
Internal.MemCpy(fieldDataAddr, valueDataAddr, fieldType.mSize);
}
else
{
return .Err(.InvalidValueType);
}
/*switch (fieldType.mTypeCode)
{
case .Boolean:
if (!value is bool)
@ -82,7 +97,7 @@ namespace System.Reflection
break;
default:
return .Err(.InvalidValueType);
}
}*/
return .Ok;
}
@ -107,7 +122,6 @@ namespace System.Reflection
}
Type fieldType = Type.GetType(mFieldData.mFieldTypeId);
//Type objType = obj.GetType();
void* dataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust;
@ -116,26 +130,6 @@ namespace System.Reflection
value.CopyValueData(dataAddr);
//TypeCode typeCode = fieldType.mTypeCode;
/*if (typeCode == TypeCode.Enum)
typeCode = fieldType.GetUnderlyingType().mTypeCode;
switch (typeCode)
{
case TypeCode.Int32:
*(int32*)dataAddr = value.Get<int32>();
break;
case TypeCode.Boolean:
*(bool*)dataAddr = value.Get<bool>();
break;
case TypeCode.Object:
*(Object*)dataAddr = value.Get<Object>();
break;
default:
return .Err;//("Invalid type");
}*/
return .Ok;
}
@ -177,8 +171,6 @@ namespace System.Reflection
Type tTarget;
void* targetDataAddr = GetDataPtrAndType(target, out tTarget);
//Type tTarget = target.RawGetType();
//void* targetDataAddr = (void*)&target;
Type tMember = typeof(TMember);
@ -192,22 +184,13 @@ namespace System.Reflection
Runtime.FatalError();
value = *(TMember*)targetDataAddr;
}
else if (tMember.mTypeCode == TypeCode.Int32)
else if (fieldType.mTypeCode == tMember.mTypeCode)
{
if (fieldType.mTypeCode == TypeCode.Int32)
{
if (tMember.mTypeCode != TypeCode.Int32)
Runtime.FatalError("Expected int");
*(int32*)&value = *(int32*)targetDataAddr;
Internal.MemCpy(&value, targetDataAddr, tMember.Size);
}
else
{
return .Err;//("Invalid type");
}
}
else
{
return .Err;//("Invalid type");
return .Err;
}
return .Ok;
@ -219,8 +202,6 @@ namespace System.Reflection
Type tTarget;
void* targetDataAddr = GetDataPtrAndType(target, out tTarget);
//Type tTarget = target.RawGetType();
//void* targetDataAddr = (void*)&target;
if (!tTarget.IsSubtypeOf(mTypeInstance))
Runtime.FatalError("Invalid type");
@ -229,32 +210,11 @@ namespace System.Reflection
Type fieldType = Type.GetType(mFieldData.mFieldTypeId);
/*if (fieldType.IsNullable)
{
var specializedType = (SpecializedGenericType)fieldType;
var genericArg = specializedType.GetGenericArg(0);
bool hasValue = *(bool*)((uint8*)targetDataAddr + genericArg.mSize);
if (!hasValue)
return .Err;
fieldType = genericArg;
}*/
//value.mStructType = (int)(void*)fieldType;
TypeCode typeCode = fieldType.mTypeCode;
if (typeCode == TypeCode.Enum)
typeCode = fieldType.UnderlyingType.mTypeCode;
/*if (typeCode == TypeCode.Int32)
{
*(int32*)&value.mData = *(int32*)targetDataAddr;
}
else if (typeCode == TypeCode.Boolean)
{
*(bool*)&value.mData = *(bool*)targetDataAddr;
}
else */if (typeCode == TypeCode.Object)
if (typeCode == TypeCode.Object)
{
value.mStructType = 0;
value.mData = *(int*)targetDataAddr;
@ -264,22 +224,6 @@ namespace System.Reflection
value = Variant.Create(fieldType, targetDataAddr);
}
/*else if (fieldType.mSize <= sizeof(int))
{
value.mStructType = (int)(void*)fieldType;
Internal.MemCpy(&value.mData, targetDataAddr, fieldType.mSize);
}
else
{
value.mStructType = (int)(void*)fieldType;
void* data = new uint8[fieldType.mSize]*;
Internal.MemCpy(data, targetDataAddr, fieldType.mSize);
value.mData = (int)data;
}*/
/*{
return .Err;
}*/
return value;
}

View file

@ -25,7 +25,7 @@ OtherLinkFlags = ""
TargetDirectory = "$(WorkspaceDir)/dist"
TargetName = "BeefIDE_d"
OtherLinkFlags = "$(LinkFlags) Comdlg32.lib kernel32.lib user32.lib advapi32.lib shell32.lib IDEHelper64_d.lib"
DebugCommandArguments = "-proddir=C:\\Beef\\IDEHelper\\Tests"
DebugCommandArguments = "-proddir=C:\\Beef\\IDE\\Tests\\Test1 -test=scripts\\Data01.txt -testNoExit"
DebugWorkingDirectory = "c:\\Beef\\IDE\\Tests\\EmptyTest"
EnvironmentVars = ["_NO_DEBUG_HEAP=1"]
@ -50,7 +50,7 @@ TargetDirectory = "$(WorkspaceDir)/dist"
TargetName = "BeefIDE_d2"
OtherLinkFlags = "$(LinkFlags) Comdlg32.lib kernel32.lib user32.lib advapi32.lib shell32.lib IDEHelper64_d.lib BeefySysLib64_d.lib wsock32.lib"
BeefLibType = "DynamicDebug"
DebugCommandArguments = "-workspace=c:\\beef\\ide\\mintest"
DebugCommandArguments = "-proddir=C:\\Beef\\IDE\\mintest"
DebugWorkingDirectory = "$(ProjectDir)\\dist"
EnvironmentVars = ["_NO_DEBUG_HEAP=1"]

View file

@ -161,6 +161,12 @@ struct Blurg
struct StructA
{
public int[10] mA;
public this()
{
mA = default;
void* v = &this;
}
}
enum EnumA
@ -175,37 +181,61 @@ struct Blurg
case B(int a, int b);
}
public static int32 Hey()
/*[DisableChecks]
public static float GetSum<TCount>(float[TCount] vals) where TCount : const int
{
//int_test val = 123;
(int, int) tup = (1, 3);
switch (tup)
{
case (1, var ref a):
a++;
PrintF("A\n");
default:
PrintF("B\n");
float total = 0;
for (int i < vals.Count)
total += vals[i];
return total;
}
if (tup case (1, var ref aa))
{
aa += 100;
}
/*EnumB eb = .B(1, 2);
if (eb case .B(1, var ref bb))
public static void Max<T, TFunc>(T lhs, T rhs, TFunc func) where TFunc : delegate int(T lhs, T rhs)
{
}*/
struct Base
{
int32 mA;
int64 mB;
}
struct Derived : Base
{
int8 mC;
}
return 123;
static int[] gArr = new .(1, 2, 3, 4, 5, );
[Checked]
public static int32 GetVal()
{
return 1;
}
[Unchecked]
public static int32 GetVal()
{
return 2;
}
public static int32 GetVal2()
{
return 3;
}
public static int32 Hey()
{
/*Self.[Checked]GetVal();
Self.[Unchecked]GetVal();
GetVal2();*/
int a = gArr[1];
a = gArr[[Unchecked]2];
return (int32)123;
}
}

View file

@ -1045,7 +1045,10 @@ namespace IDE
String filePath = scope String();
FixSrcPath(fileName, filePath);
gApp.ShowSourceFile(filePath);
String fixedFilePath = scope .();
Path.GetAbsolutePath(filePath, gApp.mWorkspace.mDir, fixedFilePath);
gApp.ShowSourceFile(fixedFilePath);
}
[IDECommand]

View file

@ -1,5 +1,6 @@
FileVersion = 1
Projects = {Tests = {Path = "."}, LibA = {Path = "LibA"}, LibB = {Path = "LibB"}, LibC = {Path = "LibC"}, TestsB = {Path = "TestsB"}}
Unlocked = ["corlib"]
[Workspace]
StartupProject = "Tests"