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:
parent
c003557bef
commit
316e3f345f
2 changed files with 48 additions and 20 deletions
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue