1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +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 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;
switch (fieldType.mTypeCode) Type rawValueType = value.RawGetType();
void* valueDataAddr = ((uint8*)(void*)value) + rawValueType.mMemberDataOffset;
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: case .Boolean:
if (!value is bool) if (!value is bool)
@ -82,7 +97,7 @@ namespace System.Reflection
break; break;
default: default:
return .Err(.InvalidValueType); return .Err(.InvalidValueType);
} }*/
return .Ok; return .Ok;
} }
@ -107,7 +122,6 @@ namespace System.Reflection
} }
Type fieldType = Type.GetType(mFieldData.mFieldTypeId); Type fieldType = Type.GetType(mFieldData.mFieldTypeId);
//Type objType = obj.GetType();
void* dataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust; void* dataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust;
@ -116,26 +130,6 @@ namespace System.Reflection
value.CopyValueData(dataAddr); 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; return .Ok;
} }
@ -177,9 +171,7 @@ namespace System.Reflection
Type tTarget; Type tTarget;
void* targetDataAddr = GetDataPtrAndType(target, out tTarget); void* targetDataAddr = GetDataPtrAndType(target, out tTarget);
//Type tTarget = target.RawGetType();
//void* targetDataAddr = (void*)&target;
Type tMember = typeof(TMember); Type tMember = typeof(TMember);
targetDataAddr = (uint8*)targetDataAddr + mFieldData.mDataOffset; targetDataAddr = (uint8*)targetDataAddr + mFieldData.mDataOffset;
@ -192,22 +184,13 @@ namespace System.Reflection
Runtime.FatalError(); Runtime.FatalError();
value = *(TMember*)targetDataAddr; value = *(TMember*)targetDataAddr;
} }
else if (tMember.mTypeCode == TypeCode.Int32) else if (fieldType.mTypeCode == tMember.mTypeCode)
{ {
if (fieldType.mTypeCode == TypeCode.Int32) Internal.MemCpy(&value, targetDataAddr, tMember.Size);
{ }
if (tMember.mTypeCode != TypeCode.Int32)
Runtime.FatalError("Expected int");
*(int32*)&value = *(int32*)targetDataAddr;
}
else
{
return .Err;//("Invalid type");
}
}
else else
{ {
return .Err;//("Invalid type"); return .Err;
} }
return .Ok; return .Ok;
@ -219,8 +202,6 @@ namespace System.Reflection
Type tTarget; Type tTarget;
void* targetDataAddr = GetDataPtrAndType(target, out tTarget); void* targetDataAddr = GetDataPtrAndType(target, out tTarget);
//Type tTarget = target.RawGetType();
//void* targetDataAddr = (void*)&target;
if (!tTarget.IsSubtypeOf(mTypeInstance)) if (!tTarget.IsSubtypeOf(mTypeInstance))
Runtime.FatalError("Invalid type"); Runtime.FatalError("Invalid type");
@ -229,32 +210,11 @@ namespace System.Reflection
Type fieldType = Type.GetType(mFieldData.mFieldTypeId); 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; TypeCode typeCode = fieldType.mTypeCode;
if (typeCode == TypeCode.Enum) if (typeCode == TypeCode.Enum)
typeCode = fieldType.UnderlyingType.mTypeCode; typeCode = fieldType.UnderlyingType.mTypeCode;
/*if (typeCode == TypeCode.Int32) if (typeCode == TypeCode.Object)
{
*(int32*)&value.mData = *(int32*)targetDataAddr;
}
else if (typeCode == TypeCode.Boolean)
{
*(bool*)&value.mData = *(bool*)targetDataAddr;
}
else */if (typeCode == TypeCode.Object)
{ {
value.mStructType = 0; value.mStructType = 0;
value.mData = *(int*)targetDataAddr; value.mData = *(int*)targetDataAddr;
@ -264,22 +224,6 @@ namespace System.Reflection
value = Variant.Create(fieldType, targetDataAddr); 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; return value;
} }

View file

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

View file

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

View file

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

View file

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