Pārlūkot izejas kodu

Fixed reentrancy issue while assigning enum case indices

Brian Fiete 1 gadu atpakaļ
vecāks
revīzija
d1ce5f0415

+ 0 - 12
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -6130,18 +6130,6 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
 			handled = true;
 		}
 
-		/*else if (auto castExpr = BfNodeDynCast<BfCastExpression>(argExpr))
-		{
-			if (auto namedTypeRef = BfNodeDynCastExact<BfNamedTypeReference>(castExpr->mTypeRef))
-			{
-				if (namedTypeRef->ToString() == "ExpectedType")
-				{
-					resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_ExpectedTypeCast);
-					handled = true;
-				}
-			}
-		}*/
-
 		if (!handled)
 		{
 			BfAstNode* checkArgExpr = argExpr;

+ 18 - 3
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