mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Compile QueueUnused modify-while-iterating fix
This commit is contained in:
parent
b1717a0722
commit
e606b18a0c
1 changed files with 28 additions and 21 deletions
|
@ -7045,6 +7045,8 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
|
||||||
mContext->mUnreifiedModule->ResolveTypeDef(typeDef, BfPopulateType_Full);
|
mContext->mUnreifiedModule->ResolveTypeDef(typeDef, BfPopulateType_Full);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Array<BfTypeInstance*> typeWorkList;
|
||||||
|
|
||||||
for (auto type : mContext->mResolvedTypes)
|
for (auto type : mContext->mResolvedTypes)
|
||||||
{
|
{
|
||||||
auto module = type->GetModule();
|
auto module = type->GetModule();
|
||||||
|
@ -7067,27 +7069,32 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory)
|
||||||
|
|
||||||
if (!typeInst->IsSpecializedType())
|
if (!typeInst->IsSpecializedType())
|
||||||
{
|
{
|
||||||
// Find any remaining methods for unreified processing
|
typeWorkList.Add(typeInst);
|
||||||
for (auto&& methodInstGroup : typeInst->mMethodInstanceGroups)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto typeInst : typeWorkList)
|
||||||
|
{
|
||||||
|
// Find any remaining methods for unreified processing
|
||||||
|
for (auto&& methodInstGroup : typeInst->mMethodInstanceGroups)
|
||||||
|
{
|
||||||
|
if ((methodInstGroup.mOnDemandKind == BfMethodOnDemandKind_Decl_AwaitingReference) ||
|
||||||
|
(methodInstGroup.mOnDemandKind == BfMethodOnDemandKind_NoDecl_AwaitingReference))
|
||||||
{
|
{
|
||||||
if ((methodInstGroup.mOnDemandKind == BfMethodOnDemandKind_Decl_AwaitingReference) ||
|
if ((methodInstGroup.mDefault != NULL) && (methodInstGroup.mDefault->mIsForeignMethodDef))
|
||||||
(methodInstGroup.mOnDemandKind == BfMethodOnDemandKind_NoDecl_AwaitingReference))
|
|
||||||
{
|
{
|
||||||
if ((methodInstGroup.mDefault != NULL) && (methodInstGroup.mDefault->mIsForeignMethodDef))
|
mContext->mUnreifiedModule->GetMethodInstance(typeInst, methodInstGroup.mDefault->mMethodDef, BfTypeVector(),
|
||||||
{
|
(BfGetMethodInstanceFlags)(BfGetMethodInstanceFlag_ForeignMethodDef | BfGetMethodInstanceFlag_UnspecializedPass | BfGetMethodInstanceFlag_ExplicitResolveOnlyPass));
|
||||||
mContext->mUnreifiedModule->GetMethodInstance(typeInst, methodInstGroup.mDefault->mMethodDef, BfTypeVector(),
|
queuedMoreMethods = true;
|
||||||
(BfGetMethodInstanceFlags)(BfGetMethodInstanceFlag_ForeignMethodDef | BfGetMethodInstanceFlag_UnspecializedPass | BfGetMethodInstanceFlag_ExplicitResolveOnlyPass));
|
}
|
||||||
queuedMoreMethods = true;
|
else
|
||||||
}
|
{
|
||||||
else
|
auto methodDef = typeInst->mTypeDef->mMethods[methodInstGroup.mMethodIdx];
|
||||||
{
|
if (methodDef->mMethodType == BfMethodType_Init)
|
||||||
auto methodDef = typeInst->mTypeDef->mMethods[methodInstGroup.mMethodIdx];
|
continue;
|
||||||
if (methodDef->mMethodType == BfMethodType_Init)
|
mContext->mUnreifiedModule->GetMethodInstance(typeInst, methodDef, BfTypeVector(),
|
||||||
continue;
|
(BfGetMethodInstanceFlags)(BfGetMethodInstanceFlag_UnspecializedPass | BfGetMethodInstanceFlag_ExplicitResolveOnlyPass));
|
||||||
mContext->mUnreifiedModule->GetMethodInstance(typeInst, methodDef, BfTypeVector(),
|
queuedMoreMethods = true;
|
||||||
(BfGetMethodInstanceFlags)(BfGetMethodInstanceFlag_UnspecializedPass | BfGetMethodInstanceFlag_ExplicitResolveOnlyPass));
|
|
||||||
queuedMoreMethods = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue