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

Fixed handling of virtual methods in boxed structs

This commit is contained in:
Brian Fiete 2020-01-15 08:34:09 -08:00
parent 7894fc73cc
commit 43d7d72f48
6 changed files with 28 additions and 26 deletions

View file

@ -4202,7 +4202,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV
{ {
auto typeInst = methodInstance->mMethodInstanceGroup->mOwner; auto typeInst = methodInstance->mMethodInstanceGroup->mOwner;
int extMethodIdx = (methodInstance->mVirtualTableIdx - typeInst->GetBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); int extMethodIdx = (methodInstance->mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) - typeInst->GetOrigSelfVTableSize();
if (extMethodIdx >= 0) if (extMethodIdx >= 0)
{ {
BF_ASSERT(mModule->mCompiler->IsHotCompile()); BF_ASSERT(mModule->mCompiler->IsHotCompile());
@ -4215,10 +4215,10 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV
// for that new method is inserted in mVirtualMethodTable (thus increasing the index relative to GetBaseVTableSize()), // for that new method is inserted in mVirtualMethodTable (thus increasing the index relative to GetBaseVTableSize()),
// but the actual written vtable position doesn't change, hence offsetting from GetOrigBaseVTableSize() // but the actual written vtable position doesn't change, hence offsetting from GetOrigBaseVTableSize()
#ifdef _DEBUG #ifdef _DEBUG
int vExtIdx = typeInst->GetBaseVTableSize(); int vExtIdx = typeInst->GetImplBaseVTableSize();
BF_ASSERT(typeInst->mVirtualMethodTable[vExtIdx].mDeclaringMethod.mMethodNum == -1); // A type entry with a -1 mMethodNum means it's a vtable ext slot BF_ASSERT(typeInst->mVirtualMethodTable[vExtIdx].mDeclaringMethod.mMethodNum == -1); // A type entry with a -1 mMethodNum means it's a vtable ext slot
#endif #endif
int vExtOfs = typeInst->GetOrigBaseVTableSize(); int vExtOfs = typeInst->GetOrigImplBaseVTableSize();
vDataIdx = mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32, 1 + mModule->mCompiler->GetDynCastVDataCount() + mModule->mCompiler->mMaxInterfaceSlots); vDataIdx = mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32, 1 + mModule->mCompiler->GetDynCastVDataCount() + mModule->mCompiler->mMaxInterfaceSlots);
vDataIdx = mModule->mBfIRBuilder->CreateAdd(vDataIdx, mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32, vExtOfs)); vDataIdx = mModule->mBfIRBuilder->CreateAdd(vDataIdx, mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32, vExtOfs));
@ -4235,7 +4235,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV
vDataIdx = mModule->mBfIRBuilder->GetConfigConst(BfIRConfigConst_VirtualMethodOfs, BfTypeCode_Int32); vDataIdx = mModule->mBfIRBuilder->GetConfigConst(BfIRConfigConst_VirtualMethodOfs, BfTypeCode_Int32);
vDataIdx = mModule->mBfIRBuilder->CreateAdd(vDataIdx, mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32, vDataIdx = mModule->mBfIRBuilder->CreateAdd(vDataIdx, mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32,
(methodInstance->mVirtualTableIdx - typeInst->GetBaseVTableSize()) + typeInst->GetOrigBaseVTableSize())); (methodInstance->mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) + typeInst->GetOrigImplBaseVTableSize()));
} }
} }
else else

View file

@ -5773,17 +5773,17 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary<int, int>& usedStrin
{ {
auto typeInst = defaultMethod->mMethodInstanceGroup->mOwner; auto typeInst = defaultMethod->mMethodInstanceGroup->mOwner;
int extMethodIdx = (defaultMethod->mVirtualTableIdx - typeInst->GetBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); int extMethodIdx = (defaultMethod->mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) - typeInst->GetOrigSelfVTableSize();
if (extMethodIdx >= 0) if (extMethodIdx >= 0)
{ {
// Extension? // Extension?
int vExtOfs = typeInst->GetOrigBaseVTableSize(); int vExtOfs = typeInst->GetOrigImplBaseVTableSize();
vDataVal = ((vDataIdx + vExtOfs + 1) << 20) | (extMethodIdx); vDataVal = ((vDataIdx + vExtOfs + 1) << 20) | (extMethodIdx);
} }
else else
{ {
// Map this new virtual index back to the original index // Map this new virtual index back to the original index
vDataIdx += (defaultMethod->mVirtualTableIdx - typeInst->GetBaseVTableSize()) + typeInst->GetOrigBaseVTableSize(); vDataIdx += (defaultMethod->mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) + typeInst->GetOrigImplBaseVTableSize();
} }
} }
else else
@ -19906,8 +19906,9 @@ void BfModule::UniqueSlotVirtualMethod(BfMethodInstance* methodInstance)
// may slot this override anyway (?) // may slot this override anyway (?)
int vTableStart = 0; int vTableStart = 0;
if (typeInstance->mBaseType != NULL) auto implBaseType = typeInstance->GetImplBaseType();
vTableStart = typeInstance->mBaseType->mVirtualMethodTableSize; if (implBaseType != NULL)
vTableStart = implBaseType->mVirtualMethodTableSize;
StringT<128> mangledName; StringT<128> mangledName;
BfMangler::Mangle(mangledName, mCompiler->GetMangleKind(), methodInstance); BfMangler::Mangle(mangledName, mCompiler->GetMangleKind(), methodInstance);

View file

@ -3372,7 +3372,7 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance)
if (typeInstance->mHotTypeData != NULL) if (typeInstance->mHotTypeData != NULL)
{ {
//auto hotLatestVersionHead = typeInstance->mHotTypeData->GetLatestVersionHead(); //auto hotLatestVersionHead = typeInstance->mHotTypeData->GetLatestVersionHead();
int wantVTableSize = typeInstance->GetBaseVTableSize() + (int)typeInstance->mHotTypeData->mVTableEntries.size(); int wantVTableSize = typeInstance->GetImplBaseVTableSize() + (int)typeInstance->mHotTypeData->mVTableEntries.size();
while ((int)typeInstance->mVirtualMethodTable.size() < wantVTableSize) while ((int)typeInstance->mVirtualMethodTable.size() < wantVTableSize)
{ {
typeInstance->mVirtualMethodTable.push_back(BfVirtualMethodEntry()); typeInstance->mVirtualMethodTable.push_back(BfVirtualMethodEntry());

View file

@ -4245,13 +4245,12 @@ BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStm
// Must be an expression. Always set CreateExprFlags_NoCaseExpr, to keep ending statements in a switch case to look like case expressions // Must be an expression. Always set CreateExprFlags_NoCaseExpr, to keep ending statements in a switch case to look like case expressions
auto expr = CreateExpression(node, (CreateExprFlags)((createStmtFlags & CreateStmtFlags_To_CreateExprFlags_Mask) | CreateExprFlags_NoCaseExpr)); auto expr = CreateExpression(node, (CreateExprFlags)((createStmtFlags & CreateStmtFlags_To_CreateExprFlags_Mask) | CreateExprFlags_NoCaseExpr));
if (expr != NULL)
auto nextNode = mVisitorPos.GetNext();
if (nextNode != NULL)
{ {
FailAfter("Semicolon expected", expr); auto nextNode = mVisitorPos.GetNext();
if (nextNode != NULL)
FailAfter("Semicolon expected", expr);
} }
return expr; return expr;
} }
} }

View file

@ -827,17 +827,17 @@ int BfMethodInstance::DbgGetVirtualMethodNum()
{ {
auto typeInst = mMethodInstanceGroup->mOwner; auto typeInst = mMethodInstanceGroup->mOwner;
int extMethodIdx = (mVirtualTableIdx - typeInst->GetBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); int extMethodIdx = (mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) - typeInst->GetOrigSelfVTableSize();
if (extMethodIdx >= 0) if (extMethodIdx >= 0)
{ {
// Extension? // Extension?
int vExtOfs = typeInst->GetOrigBaseVTableSize(); int vExtOfs = typeInst->GetOrigImplBaseVTableSize();
vDataVal = ((vDataIdx + vExtOfs + 1) << 20) | (extMethodIdx); vDataVal = ((vDataIdx + vExtOfs + 1) << 20) | (extMethodIdx);
} }
else else
{ {
// Map this new virtual index back to the original index // Map this new virtual index back to the original index
vDataIdx += (mVirtualTableIdx - typeInst->GetBaseVTableSize()) + typeInst->GetOrigBaseVTableSize(); vDataIdx += (mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) + typeInst->GetOrigImplBaseVTableSize();
} }
} }
else else
@ -1178,20 +1178,22 @@ int BfTypeInstance::GetSelfVTableSize()
int BfTypeInstance::GetOrigSelfVTableSize() int BfTypeInstance::GetOrigSelfVTableSize()
{ {
if (mBaseType != NULL) if (mBaseType != NULL)
return GetOrigVTableSize() - GetOrigBaseVTableSize(); return GetOrigVTableSize() - GetOrigImplBaseVTableSize();
return GetOrigVTableSize(); return GetOrigVTableSize();
} }
int BfTypeInstance::GetBaseVTableSize() int BfTypeInstance::GetImplBaseVTableSize()
{ {
if (mBaseType != NULL) auto implBase = GetImplBaseType();
return mBaseType->mVirtualMethodTableSize; if (implBase != NULL)
return implBase->mVirtualMethodTableSize;
return 0; return 0;
} }
int BfTypeInstance::GetOrigBaseVTableSize() int BfTypeInstance::GetOrigImplBaseVTableSize()
{ {
if (mBaseType != NULL) auto implBase = GetImplBaseType();
if (implBase != NULL)
return mBaseType->GetOrigVTableSize(); return mBaseType->GetOrigVTableSize();
return 0; return 0;
} }

View file

@ -1719,8 +1719,8 @@ public:
int GetOrigVTableSize(); int GetOrigVTableSize();
int GetSelfVTableSize(); int GetSelfVTableSize();
int GetOrigSelfVTableSize(); int GetOrigSelfVTableSize();
int GetBaseVTableSize(); int GetImplBaseVTableSize();
int GetOrigBaseVTableSize(); int GetOrigImplBaseVTableSize();
int GetIFaceVMethodSize(); int GetIFaceVMethodSize();
BfType* GetUnionInnerType(bool* wantSplat = NULL); BfType* GetUnionInnerType(bool* wantSplat = NULL);
BfPrimitiveType* GetDiscriminatorType(int* outDataIdx = NULL); BfPrimitiveType* GetDiscriminatorType(int* outDataIdx = NULL);