From f1105a8ce15761bfd5290ddb38035e83019c2542 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 23 Nov 2021 12:09:28 -0800 Subject: [PATCH] Fixed comptime TypeDone type population reentracy issue --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 1513f875..9d1ac7bc 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -2361,7 +2361,11 @@ void BfModule::ExecuteCEOnCompile(CeEmitContext* ceEmitContext, BfTypeInstance* auto methodInstance = GetRawMethodInstanceAtIdx(typeInstance, methodDef->mIdx); auto result = mCompiler->mCEMachine->Call(methodDef->GetRefNode(), this, methodInstance, {}, (CeEvalFlags)(CeEvalFlags_PersistantError | CeEvalFlags_DeferIfNotOnlyError), NULL); - if (typeInstance->mDefineState != BfTypeDefineState_CETypeInit) + if ((onCompileKind == BfCEOnCompileKind_TypeDone) && (typeInstance->mDefineState > BfTypeDefineState_CETypeInit)) + { + // Type done, okay + } + else if (typeInstance->mDefineState != BfTypeDefineState_CETypeInit) { // We populated before we could finish AssertErrorState(); @@ -4530,7 +4534,11 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy { typeInstance->mDefineState = BfTypeDefineState_Defined; if (!typeInstance->IsBoxed()) + { ExecuteCEOnCompile(NULL, typeInstance, BfCEOnCompileKind_TypeDone); + if (typeInstance->mDefineState == BfTypeDefineState_DefinedAndMethodsSlotted) + return; + } } if (typeInstance->mTypeFailed)