diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 34e78eee..1d108a5c 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4202,7 +4202,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfMethodInstance* methodInstance, BfIRV { auto typeInst = methodInstance->mMethodInstanceGroup->mOwner; - int extMethodIdx = (methodInstance->mVirtualTableIdx - typeInst->GetBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); + int extMethodIdx = (methodInstance->mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); if (extMethodIdx >= 0) { 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()), // but the actual written vtable position doesn't change, hence offsetting from GetOrigBaseVTableSize() #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 #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->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->CreateAdd(vDataIdx, mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int32, - (methodInstance->mVirtualTableIdx - typeInst->GetBaseVTableSize()) + typeInst->GetOrigBaseVTableSize())); + (methodInstance->mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) + typeInst->GetOrigImplBaseVTableSize())); } } else diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index ae31c11d..b7d8b28e 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -5773,17 +5773,17 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary& usedStrin { auto typeInst = defaultMethod->mMethodInstanceGroup->mOwner; - int extMethodIdx = (defaultMethod->mVirtualTableIdx - typeInst->GetBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); + int extMethodIdx = (defaultMethod->mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); if (extMethodIdx >= 0) { // Extension? - int vExtOfs = typeInst->GetOrigBaseVTableSize(); + int vExtOfs = typeInst->GetOrigImplBaseVTableSize(); vDataVal = ((vDataIdx + vExtOfs + 1) << 20) | (extMethodIdx); } else { // 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 @@ -19906,8 +19906,9 @@ void BfModule::UniqueSlotVirtualMethod(BfMethodInstance* methodInstance) // may slot this override anyway (?) int vTableStart = 0; - if (typeInstance->mBaseType != NULL) - vTableStart = typeInstance->mBaseType->mVirtualMethodTableSize; + auto implBaseType = typeInstance->GetImplBaseType(); + if (implBaseType != NULL) + vTableStart = implBaseType->mVirtualMethodTableSize; StringT<128> mangledName; BfMangler::Mangle(mangledName, mCompiler->GetMangleKind(), methodInstance); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 555cda7a..d032b74a 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -3372,7 +3372,7 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance) if (typeInstance->mHotTypeData != NULL) { //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) { typeInstance->mVirtualMethodTable.push_back(BfVirtualMethodEntry()); diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 30428a4d..037ae8c2 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -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 auto expr = CreateExpression(node, (CreateExprFlags)((createStmtFlags & CreateStmtFlags_To_CreateExprFlags_Mask) | CreateExprFlags_NoCaseExpr)); - - auto nextNode = mVisitorPos.GetNext(); - if (nextNode != NULL) + if (expr != NULL) { - FailAfter("Semicolon expected", expr); + auto nextNode = mVisitorPos.GetNext(); + if (nextNode != NULL) + FailAfter("Semicolon expected", expr); } - return expr; } } diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 6687f90b..2661f6f4 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -827,17 +827,17 @@ int BfMethodInstance::DbgGetVirtualMethodNum() { auto typeInst = mMethodInstanceGroup->mOwner; - int extMethodIdx = (mVirtualTableIdx - typeInst->GetBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); + int extMethodIdx = (mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) - typeInst->GetOrigSelfVTableSize(); if (extMethodIdx >= 0) { // Extension? - int vExtOfs = typeInst->GetOrigBaseVTableSize(); + int vExtOfs = typeInst->GetOrigImplBaseVTableSize(); vDataVal = ((vDataIdx + vExtOfs + 1) << 20) | (extMethodIdx); } else { // Map this new virtual index back to the original index - vDataIdx += (mVirtualTableIdx - typeInst->GetBaseVTableSize()) + typeInst->GetOrigBaseVTableSize(); + vDataIdx += (mVirtualTableIdx - typeInst->GetImplBaseVTableSize()) + typeInst->GetOrigImplBaseVTableSize(); } } else @@ -1178,20 +1178,22 @@ int BfTypeInstance::GetSelfVTableSize() int BfTypeInstance::GetOrigSelfVTableSize() { if (mBaseType != NULL) - return GetOrigVTableSize() - GetOrigBaseVTableSize(); + return GetOrigVTableSize() - GetOrigImplBaseVTableSize(); return GetOrigVTableSize(); } -int BfTypeInstance::GetBaseVTableSize() +int BfTypeInstance::GetImplBaseVTableSize() { - if (mBaseType != NULL) - return mBaseType->mVirtualMethodTableSize; + auto implBase = GetImplBaseType(); + if (implBase != NULL) + return implBase->mVirtualMethodTableSize; return 0; } -int BfTypeInstance::GetOrigBaseVTableSize() +int BfTypeInstance::GetOrigImplBaseVTableSize() { - if (mBaseType != NULL) + auto implBase = GetImplBaseType(); + if (implBase != NULL) return mBaseType->GetOrigVTableSize(); return 0; } diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 859aceab..289af43b 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -1719,8 +1719,8 @@ public: int GetOrigVTableSize(); int GetSelfVTableSize(); int GetOrigSelfVTableSize(); - int GetBaseVTableSize(); - int GetOrigBaseVTableSize(); + int GetImplBaseVTableSize(); + int GetOrigImplBaseVTableSize(); int GetIFaceVMethodSize(); BfType* GetUnionInnerType(bool* wantSplat = NULL); BfPrimitiveType* GetDiscriminatorType(int* outDataIdx = NULL);