diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 65b7fecb..3f88c7a4 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -1264,11 +1264,24 @@ void BeIRCodeGen::HandleNextCmd() break; } - BF_ASSERT(type->mTypeCode == BeTypeCode_Struct); - auto structType = (BeStructType*)type; - mBeContext->SetStructBody(structType, members, isPacked); - structType->mSize = instSize; - structType->mAlign = instAlign; + bool failed = false; + for (auto member : members) + { + if (member->mSize < 0) + { + Fail("StructSetBody invalid member type"); + failed = true; + } + } + + if (!failed) + { + BF_ASSERT(type->mTypeCode == BeTypeCode_Struct); + auto structType = (BeStructType*)type; + mBeContext->SetStructBody(structType, members, isPacked); + structType->mSize = instSize; + structType->mAlign = instAlign; + } } break; case BfIRCmd_Type: @@ -3725,6 +3738,18 @@ void BeIRCodeGen::SetConfigConst(int idx, int value) mConfigConsts.Add(value); } +BeValue* BeIRCodeGen::TryGetBeValue(int id) +{ + auto& result = mResults[id]; + if (result.mKind != BeIRCodeGenEntryKind_Value) + return NULL; +#ifdef BE_EXTRA_CHECKS + BF_ASSERT(!result.mBeValue->mLifetimeEnded); + BF_ASSERT(!result.mBeValue->mWasRemoved); +#endif + return result.mBeValue; +} + BeValue* BeIRCodeGen::GetBeValue(int id) { auto& result = mResults[id]; diff --git a/IDEHelper/Backend/BeIRCodeGen.h b/IDEHelper/Backend/BeIRCodeGen.h index c78cc3b9..9cf61252 100644 --- a/IDEHelper/Backend/BeIRCodeGen.h +++ b/IDEHelper/Backend/BeIRCodeGen.h @@ -150,6 +150,7 @@ public: virtual void SetConfigConst(int idx, int value) override; BeValue* GetBeValue(int streamId); + BeValue* TryGetBeValue(int streamId); BeType* GetBeType(int streamId); BeBlock* GetBeBlock(int streamId); BeMDNode* GetBeMetadata(int streamId); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 8da9fc0b..348a216f 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -2607,7 +2607,14 @@ BfProjectSet* BfModule::GetVisibleProjectSet() }; if (mCurTypeInstance != NULL) + { _AddType(mCurTypeInstance); + if ((mContext->mCurTypeState != NULL) && (mContext->mCurTypeState->mType == mCurTypeInstance)) + { + if (mContext->mCurTypeState->mCurTypeDef != NULL) + _AddProject(mContext->mCurTypeState->mCurTypeDef->mProject); + } + } auto methodState = mCurMethodState; while (methodState != NULL) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 66249c9d..9358c908 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -6099,6 +6099,9 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy std::function splatIterate; splatIterate = [&](BfType* checkType) { + if (hadNonSplattable) + return; + if (checkType->IsValueType()) PopulateType(checkType, BfPopulateType_Data); @@ -6135,6 +6138,13 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy for (int fieldIdx = 0; fieldIdx < (int)checkTypeInstance->mFieldInstances.size(); fieldIdx++) { auto fieldInstance = (BfFieldInstance*)&checkTypeInstance->mFieldInstances[fieldIdx]; + + if ((fieldInstance->mResolvedType->IsVar()) || (fieldInstance->mResolvedType->IsLet())) + { + //TODO: allow splattables with var/let field types + hadNonSplattable = true; + } + if (fieldInstance->mDataIdx >= 0) splatIterate(fieldInstance->GetResolvedType()); } diff --git a/IDEHelper/Compiler/CeMachine.cpp b/IDEHelper/Compiler/CeMachine.cpp index 5c0d1b5d..86300a23 100644 --- a/IDEHelper/Compiler/CeMachine.cpp +++ b/IDEHelper/Compiler/CeMachine.cpp @@ -2097,7 +2097,12 @@ void CeBuilder::Build() mCeFunction->mFailed = true; return; } - mBeFunction = (BeFunction*)irCodeGen->GetBeValue(dupMethodInstance.mIRFunction.mId); + mBeFunction = (BeFunction*)irCodeGen->TryGetBeValue(dupMethodInstance.mIRFunction.mId); + if (mBeFunction == NULL) + { + mCeFunction->mFailed = true; + return; + } mIntPtrType = irCodeGen->mBeContext->GetPrimitiveType((mPtrSize == 4) ? BeTypeCode_Int32 : BeTypeCode_Int64); @@ -10386,6 +10391,10 @@ CeFunction* CeMachine::GetFunction(BfMethodInstance* methodInstance, BfIRValue f { if ((func.IsConst()) || (func.IsFake())) return NULL; + + auto funcVal = mCeModule->mBfIRBuilder->mBeIRCodeGen->TryGetBeValue(func.mId); + if (funcVal == NULL) + return NULL; } CeFunctionInfo** functionInfoPtr = NULL; @@ -10409,8 +10418,7 @@ CeFunction* CeMachine::GetFunction(BfMethodInstance* methodInstance, BfIRValue f } else { - auto funcVal = mCeModule->mBfIRBuilder->mBeIRCodeGen->GetBeValue(func.mId); - + auto funcVal = mCeModule->mBfIRBuilder->mBeIRCodeGen->GetBeValue(func.mId); if (auto function = BeValueDynCast(funcVal)) { String funcName = function->mName;