mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Force field reflection of tuple data in discriminated unions
This commit is contained in:
parent
eae4aed3a9
commit
e659a4e711
1 changed files with 33 additions and 7 deletions
|
@ -1151,6 +1151,8 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
|
||||||
std::multimap<String, BfTypeInstance*> sortedStaticMarkMap;
|
std::multimap<String, BfTypeInstance*> sortedStaticMarkMap;
|
||||||
std::multimap<String, BfTypeInstance*> sortedStaticTLSMap;
|
std::multimap<String, BfTypeInstance*> sortedStaticTLSMap;
|
||||||
HashSet<BfModule*> usedModuleSet;
|
HashSet<BfModule*> usedModuleSet;
|
||||||
|
HashSet<BfType*> reflectTypeSet;
|
||||||
|
HashSet<BfType*> reflectFieldTypeSet;
|
||||||
|
|
||||||
vdataHashCtx.MixinStr(project->mStartupObject);
|
vdataHashCtx.MixinStr(project->mStartupObject);
|
||||||
vdataHashCtx.Mixin(project->mTargetType);
|
vdataHashCtx.Mixin(project->mTargetType);
|
||||||
|
@ -1184,6 +1186,21 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
|
||||||
if (module == NULL)
|
if (module == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (type->IsEnum())
|
||||||
|
{
|
||||||
|
for (auto& fieldInst : typeInst->mFieldInstances)
|
||||||
|
{
|
||||||
|
auto fieldDef = fieldInst.GetFieldDef();
|
||||||
|
if (fieldDef == NULL)
|
||||||
|
continue;
|
||||||
|
if (!fieldDef->IsEnumCaseEntry())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (fieldInst.mResolvedType->IsTuple())
|
||||||
|
reflectFieldTypeSet.Add(fieldInst.mResolvedType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (type->IsInterface())
|
if (type->IsInterface())
|
||||||
vdataHashCtx.Mixin(typeInst->mSlotNum);
|
vdataHashCtx.Mixin(typeInst->mSlotNum);
|
||||||
vdataHashCtx.Mixin(typeInst->mAlwaysIncludeFlags);
|
vdataHashCtx.Mixin(typeInst->mAlwaysIncludeFlags);
|
||||||
|
@ -1321,7 +1338,6 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
|
||||||
|
|
||||||
Dictionary<int, int> usedStringIdMap;
|
Dictionary<int, int> usedStringIdMap;
|
||||||
|
|
||||||
HashSet<BfType*> reflectTypeSet;
|
|
||||||
reflectTypeSet.Add(vdataContext->mUnreifiedModule->ResolveTypeDef(mReflectTypeInstanceTypeDef));
|
reflectTypeSet.Add(vdataContext->mUnreifiedModule->ResolveTypeDef(mReflectTypeInstanceTypeDef));
|
||||||
reflectTypeSet.Add(vdataContext->mUnreifiedModule->ResolveTypeDef(mReflectSpecializedGenericType));
|
reflectTypeSet.Add(vdataContext->mUnreifiedModule->ResolveTypeDef(mReflectSpecializedGenericType));
|
||||||
reflectTypeSet.Add(vdataContext->mUnreifiedModule->ResolveTypeDef(mReflectUnspecializedGenericType));
|
reflectTypeSet.Add(vdataContext->mUnreifiedModule->ResolveTypeDef(mReflectUnspecializedGenericType));
|
||||||
|
@ -1341,6 +1357,11 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
|
||||||
if ((typeInst != NULL) && (!typeInst->IsReified()) && (!typeInst->IsUnspecializedType()))
|
if ((typeInst != NULL) && (!typeInst->IsReified()) && (!typeInst->IsUnspecializedType()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (type->mTypeId == 0x0000045F)
|
||||||
|
{
|
||||||
|
NOP;
|
||||||
|
}
|
||||||
|
|
||||||
bool needsTypeData = (needsTypeList) || ((type->IsObject()) && (needsObjectTypeData));
|
bool needsTypeData = (needsTypeList) || ((type->IsObject()) && (needsObjectTypeData));
|
||||||
bool needsVData = (type->IsObject()) && (typeInst->HasBeenInstantiated());
|
bool needsVData = (type->IsObject()) && (typeInst->HasBeenInstantiated());
|
||||||
|
|
||||||
|
@ -1357,7 +1378,12 @@ void BfCompiler::CreateVData(BfVDataModule* bfModule)
|
||||||
|
|
||||||
if ((needsTypeData) || (needsVData))
|
if ((needsTypeData) || (needsVData))
|
||||||
{
|
{
|
||||||
if (reflectTypeSet.Contains(type))
|
if (reflectFieldTypeSet.Contains(type))
|
||||||
|
{
|
||||||
|
needsTypeData = true;
|
||||||
|
forceReflectFields = true;
|
||||||
|
}
|
||||||
|
else if (reflectTypeSet.Contains(type))
|
||||||
{
|
{
|
||||||
needsTypeData = true;
|
needsTypeData = true;
|
||||||
needsVData = true;
|
needsVData = true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue