1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-07-04 23:36:00 +02:00

Added GetFieldReference, ability to explicitly reference in Variant

This commit is contained in:
Brian Fiete 2020-07-06 09:09:28 -07:00
parent 5cfe9e6196
commit 78dd56d6c5
11 changed files with 279 additions and 54 deletions

View file

@ -1266,7 +1266,7 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
bool needsTypeList = bfModule->IsMethodImplementedAndReified(typeDefType, "GetType");
bool needsObjectTypeData = needsTypeList || bfModule->IsMethodImplementedAndReified(vdataContext->mBfObjectType, "RawGetType") || bfModule->IsMethodImplementedAndReified(vdataContext->mBfObjectType, "GetType");
bool needsTypeNames = bfModule->IsMethodImplementedAndReified(typeDefType, "GetName");
bool needsTypeNames = bfModule->IsMethodImplementedAndReified(typeDefType, "GetName") || bfModule->IsMethodImplementedAndReified(typeDefType, "GetFullName");
bool needsStringLiteralList = (mOptions.mAllowHotSwapping) || (bfModule->IsMethodImplementedAndReified(stringType, "Intern"));
Dictionary<int, int> usedStringIdMap;

View file

@ -6312,6 +6312,7 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
{
typeDataVar = mBfIRBuilder->CreateGlobalVariable(typeInstanceDataType, true,
BfIRLinkageType_External, typeInstanceData, typeDataName);
mBfIRBuilder->GlobalVar_SetAlignment(typeDataVar, mSystem->mPtrSize);
if (mBfIRBuilder->DbgHasInfo())
{

View file

@ -7190,12 +7190,12 @@ DbgTypedValue DbgExprEvaluator::MatchMethod(BfAstNode* targetSrc, DbgTypedValue
}
}
auto castedType = mDbgModule->FindType(typeName, NULL, GetLanguage());
auto castedType = mDbgModule->FindType(typeName, NULL, GetLanguage(), true);
if (castedType == NULL)
{
if (typeName.EndsWith('*'))
{
auto noPtrTypeEntry = mDbgModule->FindType(typeName.Substring(0, typeName.length() - 1), NULL, DbgLanguage_Beef);
auto noPtrTypeEntry = mDbgModule->FindType(typeName.Substring(0, typeName.length() - 1), NULL, DbgLanguage_Beef, true);
if (noPtrTypeEntry != NULL)
castedType = mDbgModule->GetPointerType(noPtrTypeEntry);
}

View file

@ -7382,7 +7382,7 @@ DbgType* DbgModule::FindTypeHelper(const String& typeName, DbgType* checkType)
return NULL;
}
DbgType* DbgModule::FindType(const String& typeName, DbgType* contextType, DbgLanguage language)
DbgType* DbgModule::FindType(const String& typeName, DbgType* contextType, DbgLanguage language, bool bfObjectPtr)
{
if ((language == DbgLanguage_Unknown) && (contextType != NULL))
language = contextType->mLanguage;
@ -7391,7 +7391,7 @@ DbgType* DbgModule::FindType(const String& typeName, DbgType* contextType, DbgLa
{
if (typeName[typeName.length() - 1] == '*')
{
DbgType* dbgType = FindType(typeName.Substring(0, typeName.length() - 1), contextType, language);
DbgType* dbgType = FindType(typeName.Substring(0, typeName.length() - 1), contextType, language, bfObjectPtr);
if (dbgType == NULL)
return NULL;
return GetPointerType(dbgType);
@ -7400,7 +7400,11 @@ DbgType* DbgModule::FindType(const String& typeName, DbgType* contextType, DbgLa
auto entry = GetLinkedModule()->mTypeMap.Find(typeName.c_str(), language);
if (entry != NULL)
{
if ((bfObjectPtr) && (entry->mValue->IsBfObject()))
return GetPointerType(entry->mValue);
return entry->mValue;
}
if (contextType != NULL)
{

View file

@ -1298,7 +1298,7 @@ public:
//const uint8* CopyOrigImageData(addr_target address, int length);
DbgType* FindTypeHelper(const String& typeName, DbgType* checkType);
DbgType* FindType(const String& typeName, DbgType* contextType = NULL, DbgLanguage language = DbgLanguage_Unknown);
DbgType* FindType(const String& typeName, DbgType* contextType = NULL, DbgLanguage language = DbgLanguage_Unknown, bool bfObjectPtr = false);
DbgTypeMap::Entry* FindType(const char* typeName, DbgLanguage language);
DbgType* GetPointerType(DbgType* innerType);

View file

@ -53,6 +53,9 @@ namespace Tests
[Reflect]
class ClassA
{
int32 mA = 123;
String mStr = "A";
[AlwaysInclude, AttrC(71, 72)]
static float StaticMethodA(int32 a, int32 b, float c, ref int32 d, ref StructA sa)
{
@ -62,6 +65,18 @@ namespace Tests
return a + b + c;
}
[AlwaysInclude]
static StructA StaticMethodB(ref int32 a, ref String b)
{
a += 1000;
b = "B";
StructA sa;
sa.mA = 12;
sa.mB = 34;
return sa;
}
[AlwaysInclude]
float MemberMethodA(int32 a, int32 b, float c)
{
@ -168,6 +183,21 @@ namespace Tests
Test.Assert(result.Get<float>() == 123);
result.Dispose();
Object aObj = a;
Object saObj = sa;
Test.Assert(methodInfo.Name == "StaticMethodA");
result = methodInfo.Invoke(null, 100, (int32)20, 3.0f, aObj, saObj).Get();
Test.Assert(a == 120);
Test.Assert(sa.mA == 101);
Test.Assert(sa.mB == 22);
int32 a2 = (int32)aObj;
StructA sa2 = (StructA)saObj;
Test.Assert(a2 == 240);
Test.Assert(sa2.mA == 201);
Test.Assert(sa2.mB == 42);
Test.Assert(result.Get<float>() == 123);
result.Dispose();
result = methodInfo.Invoke(.(), .Create(100), .Create((int32)20), .Create(3.0f), .Create(&a), .Create(&sa)).Get();
Test.Assert(a == 240);
Test.Assert(sa.mA == 201);
@ -175,10 +205,55 @@ namespace Tests
Test.Assert(result.Get<float>() == 123);
result.Dispose();
Variant aV = .CreateOwned(a);
Variant saV = .CreateOwned(sa);
result = methodInfo.Invoke(.(), .Create(100), .Create((int32)20), .Create(3.0f), aV, saV).Get();
Test.Assert(a == 240);
Test.Assert(sa.mA == 201);
Test.Assert(sa.mB == 42);
a2 = aV.Get<int32>();
sa2 = saV.Get<StructA>();
Test.Assert(a2 == 360);
Test.Assert(sa2.mA == 301);
Test.Assert(sa2.mB == 62);
Test.Assert(result.Get<float>() == 123);
aV.Dispose();
saV.Dispose();
result.Dispose();
let attrC = methodInfo.GetCustomAttribute<AttrCAttribute>().Get();
Test.Assert(attrC.mA == 71);
Test.Assert(attrC.mB == 72);
case 1:
Test.Assert(methodInfo.Name == "StaticMethodB");
var fieldA = typeInfo.GetField("mA").Value;
var fieldStr = typeInfo.GetField("mStr").Value;
var fieldAV = fieldA.GetValueReference(ca).Value;
var fieldStrV = fieldStr.GetValueReference(ca).Value;
Test.Assert(fieldAV.Get<int32>() == 123);
Test.Assert(fieldStrV.Get<String>() == "A");
var res = methodInfo.Invoke(.(), fieldAV, fieldStrV).Value;
var sa = res.Get<StructA>();
Test.Assert(sa.mA == 12);
Test.Assert(sa.mB == 34);
res.Dispose();
Test.Assert(fieldAV.Get<int32>() == 1123);
Test.Assert(fieldStrV.Get<String>() == "B");
fieldAV.Dispose();
fieldStrV.Dispose();
fieldAV = fieldA.GetValue(ca).Value;
fieldStrV = fieldStr.GetValue(ca).Value;
Test.Assert(fieldAV.Get<int32>() == 1123);
Test.Assert(fieldStrV.Get<String>() == "B");
fieldAV.Dispose();
fieldStrV.Dispose();
case 2:
Test.Assert(methodInfo.Name == "MemberMethodA");
var result = methodInfo.Invoke(ca, 100, (int32)20, 3.0f).Get();
Test.Assert(result.Get<float>() == 123);
@ -187,7 +262,7 @@ namespace Tests
result = methodInfo.Invoke(.Create(ca), .Create(100), .Create((int32)20), .Create(3.0f)).Get();
Test.Assert(result.Get<float>() == 123);
result.Dispose();
case 2:
case 3:
Test.Assert(methodInfo.Name == "GetA");
var result = methodInfo.Invoke(ca, 123).Get();
Test.Assert(result.Get<int>() == 1123);
@ -198,10 +273,10 @@ namespace Tests
result = methodInfo.Invoke(.Create(ca2), .Create(123)).Get();
Test.Assert(result.Get<int>() == 2123);
result.Dispose();
case 3:
case 4:
Test.Assert(methodInfo.Name == "__BfCtor");
Test.Assert(methodInfo.IsConstructor);
case 4:
case 5:
Test.FatalError(); // Shouldn't have any more
}