From d1ce5f04153992b0054efd4eea20502dd55aaaf0 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 30 Jun 2024 08:21:27 +0200 Subject: [PATCH] Fixed reentrancy issue while assigning enum case indices --- IDEHelper/Compiler/BfExprEvaluator.cpp | 12 ------------ IDEHelper/Compiler/BfModuleTypeUtils.cpp | 21 ++++++++++++++++++--- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 5d77dae5..0b3d2ef2 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -6130,18 +6130,6 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr handled = true; } - /*else if (auto castExpr = BfNodeDynCast(argExpr)) - { - if (auto namedTypeRef = BfNodeDynCastExact(castExpr->mTypeRef)) - { - if (namedTypeRef->ToString() == "ExpectedType") - { - resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_ExpectedTypeCast); - handled = true; - } - } - }*/ - if (!handled) { BfAstNode* checkArgExpr = argExpr; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index d85f8445..3d80d918 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4858,8 +4858,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (typeInstance->IsInterface()) Fail("Interfaces cannot include fields. Consider making this a property", field->GetRefNode()); } - - int enumCaseEntryIdx = 0; + for (int pass = 0; pass < 2; pass++) { for (auto field : typeDef->mFields) @@ -4889,7 +4888,6 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy { if (typeInstance->IsEnum()) { - fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1; resolvedFieldType = typeInstance; BfType* payloadType = NULL; @@ -4983,6 +4981,23 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } } + // Assign enum indices + int enumCaseEntryIdx = 0; + for (auto field : typeDef->mFields) + { + auto fieldInstance = &typeInstance->mFieldInstances[field->mIdx]; + if (!fieldInstance->mFieldIncluded) + continue; + + if (field->IsEnumCaseEntry()) + { + if (typeInstance->IsEnum()) + { + fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1; + } + } + } + if (!resolvedTypeRef->IsIncomplete()) { // We finished resolving ourselves through a re-entry, so we're actually done here