1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Fixed case where BfResolvedTypeSet inserts new types during Insert

This commit is contained in:
Brian Fiete 2024-12-31 17:22:34 -08:00
parent c003557bef
commit 316e3f345f
2 changed files with 48 additions and 20 deletions

View file

@ -11685,10 +11685,15 @@ BfType* BfModule::ResolveTypeRef_Ref(BfTypeReference* typeRef, BfPopulateType po
} }
static int sCallIdx = 0; static int sCallIdx = 0;
int callIdx = sCallIdx++; int callIdx = 0;
if (callIdx == 0x00006CA4)
if (!mCompiler->mIsResolveOnly)
{ {
NOP; callIdx = sCallIdx++;
if (callIdx == 0x0000A224)
{
NOP;
}
} }
BfResolvedTypeSet::LookupContext lookupCtx; BfResolvedTypeSet::LookupContext lookupCtx;

View file

@ -2831,28 +2831,51 @@ public:
{ {
return false; return false;
} }
int bucket = (hashVal & 0x7FFFFFFF) % mHashSize;
auto checkEntryIdx = mHashHeads[bucket]; while (true)
while (checkEntryIdx != -1)
{ {
auto checkEntry = &mEntries[checkEntryIdx]; int startAllocSize = mAllocSize;
int bucket = (hashVal & 0x7FFFFFFF) % mHashSize;
auto startEntryIdx = mHashHeads[bucket];
auto checkEntryIdx = startEntryIdx;
bool needsRerun = false;
// checkEntry->mType can be NULL if we're in the process of filling it in (and this Insert is from an element type) while (checkEntryIdx != -1)
// OR if the type resolution failed after node insertion
if ((checkEntry->mValue != NULL) && (hashVal == checkEntry->mHashCode) && (Equals(checkEntry->mValue, findType, ctx)))
{ {
*entryPtr = EntryRef(this, checkEntryIdx); auto checkEntry = &mEntries[checkEntryIdx];
return false;
}
checkEntryIdx = checkEntry->mNext;
tryCount++; // checkEntry->mType can be NULL if we're in the process of filling it in (and this Insert is from an element type)
// If this fires off, this may indicate that our hashes are equivalent but Equals fails // OR if the type resolution failed after node insertion
if (tryCount >= 10) if ((checkEntry->mValue != NULL) && (hashVal == checkEntry->mHashCode) && (Equals(checkEntry->mValue, findType, ctx)))
{ {
NOP; *entryPtr = EntryRef(this, checkEntryIdx);
return false;
}
if ((mAllocSize != startAllocSize) || (startEntryIdx != mHashHeads[bucket]))
{
// It's possible for Equals to add types, buckets could be invalid or a new type could
// have been inserted at the start of our bucket
needsRerun = true;
break;
}
checkEntryIdx = checkEntry->mNext;
tryCount++;
// If this fires off, this may indicate that our hashes are equivalent but Equals fails
if (tryCount >= 10)
{
NOP;
}
BF_ASSERT(tryCount < 10);
}
if (!needsRerun)
{
// Retry if we added entries
break;
} }
BF_ASSERT(tryCount < 10);
} }
if ((ctx->mResolveFlags & BfResolveTypeRefFlag_NoCreate) != 0) if ((ctx->mResolveFlags & BfResolveTypeRefFlag_NoCreate) != 0)