mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Fixed handling of virtual methods in boxed structs
This commit is contained in:
parent
7894fc73cc
commit
43d7d72f48
6 changed files with 28 additions and 26 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue