From a4476332fe33b22321e1dbbebde92764065ad899 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 29 Nov 2019 09:24:13 -0800 Subject: [PATCH] Reflection fixes --- BeefLibs/corlib/src/Reflection/FieldInfo.bf | 110 +++++--------------- IDE/BeefProj.toml | 4 +- IDE/mintest/src/main3.bf | 84 ++++++++++----- IDE/src/ScriptManager.bf | 5 +- IDEHelper/Tests/BeefSpace.toml | 1 + 5 files changed, 91 insertions(+), 113 deletions(-) diff --git a/BeefLibs/corlib/src/Reflection/FieldInfo.bf b/BeefLibs/corlib/src/Reflection/FieldInfo.bf index e8f6aedc..bfb58a41 100644 --- a/BeefLibs/corlib/src/Reflection/FieldInfo.bf +++ b/BeefLibs/corlib/src/Reflection/FieldInfo.bf @@ -64,11 +64,26 @@ namespace System.Reflection } Type fieldType = Type.GetType(mFieldData.mFieldTypeId); - //Type objType = obj.GetType(); - - void* dataAddr = ((uint8*)(void*)obj) + mFieldData.mDataOffset + dataOffsetAdjust; + void* fieldDataAddr = ((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: 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(); - break; - case TypeCode.Boolean: - *(bool*)dataAddr = value.Get(); - break; - case TypeCode.Object: - *(Object*)dataAddr = value.Get(); - break; - default: - return .Err;//("Invalid type"); - }*/ - return .Ok; } @@ -177,9 +171,7 @@ namespace System.Reflection Type tTarget; void* targetDataAddr = GetDataPtrAndType(target, out tTarget); - //Type tTarget = target.RawGetType(); - //void* targetDataAddr = (void*)⌖ - + Type tMember = typeof(TMember); targetDataAddr = (uint8*)targetDataAddr + mFieldData.mDataOffset; @@ -192,22 +184,13 @@ namespace System.Reflection Runtime.FatalError(); value = *(TMember*)targetDataAddr; } - else if (tMember.mTypeCode == TypeCode.Int32) - { - if (fieldType.mTypeCode == TypeCode.Int32) - { - if (tMember.mTypeCode != TypeCode.Int32) - Runtime.FatalError("Expected int"); - *(int32*)&value = *(int32*)targetDataAddr; - } - else - { - return .Err;//("Invalid type"); - } - } + else if (fieldType.mTypeCode == tMember.mTypeCode) + { + Internal.MemCpy(&value, targetDataAddr, tMember.Size); + } 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; } diff --git a/IDE/BeefProj.toml b/IDE/BeefProj.toml index 24da142b..733e3bf4 100644 --- a/IDE/BeefProj.toml +++ b/IDE/BeefProj.toml @@ -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"] diff --git a/IDE/mintest/src/main3.bf b/IDE/mintest/src/main3.bf index c1d30376..79529f13 100644 --- a/IDE/mintest/src/main3.bf +++ b/IDE/mintest/src/main3.bf @@ -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); } + /*[DisableChecks] + public static float GetSum(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 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() { - //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) - { - 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; + return (int32)123; } } + diff --git a/IDE/src/ScriptManager.bf b/IDE/src/ScriptManager.bf index 987e15ef..fec32ae5 100644 --- a/IDE/src/ScriptManager.bf +++ b/IDE/src/ScriptManager.bf @@ -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] diff --git a/IDEHelper/Tests/BeefSpace.toml b/IDEHelper/Tests/BeefSpace.toml index d008e4ea..0fe68c29 100644 --- a/IDEHelper/Tests/BeefSpace.toml +++ b/IDEHelper/Tests/BeefSpace.toml @@ -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"