mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Reflection fixes
This commit is contained in:
parent
b6e49673c6
commit
a4476332fe
5 changed files with 91 additions and 113 deletions
|
@ -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*)⌖
|
||||
|
||||
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*)⌖
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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"]
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue