Bladeren bron

Improved unknown-sized array in BfInvocationExpression

Brian Fiete 2 maanden geleden
bovenliggende
commit
9e71acc003
1 gewijzigde bestanden met toevoegingen van 15 en 5 verwijderingen
  1. 15 5
      IDEHelper/Compiler/BfExprEvaluator.cpp

+ 15 - 5
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -19704,16 +19704,23 @@ void BfExprEvaluator::DoInvocation(BfInvocationExpression* invocationExpr)
 				typeState.mArrayInitializerSize = (int)invocationExpr->mArguments.size();
 				SetAndRestoreValue<BfTypeState*> prevTypeState(mModule->mContext->mCurTypeState, &typeState);
 
+				BfType* undefSizeParam = NULL;
+
 				if (indexerExpr->mArguments.size() != 0)
 				{
 					BfConstResolver constResolver(mModule);
 					auto arg = indexerExpr->mArguments[0];
 					constResolver.mExpectingType = mModule->GetPrimitiveType(BfTypeCode_IntPtr);
-
+					constResolver.mBfEvalExprFlags = (BfEvalExprFlags)(constResolver.mBfEvalExprFlags | BfEvalExprFlags_AllowGenericConstValue);
+					
 					if (arg != NULL)
 						constResolver.Resolve(arg, NULL, BfConstResolveFlag_ArrayInitSize);
 
-					if (constResolver.mResult.mValue.IsConst())
+					if (constResolver.mResult.mKind == BfTypedValueKind_GenericConstValue)
+					{
+						undefSizeParam = constResolver.mResult.mType;
+					}
+					else if (constResolver.mResult.mValue.IsConst())
 					{
 						auto constant = mModule->mBfIRBuilder->GetConstant(constResolver.mResult.mValue);
 
@@ -19721,14 +19728,17 @@ void BfExprEvaluator::DoInvocation(BfInvocationExpression* invocationExpr)
 						{
 							arrSize = constant->mInt32;
 						}
-						else if (constant->mConstType != BfConstType_Undef)
-							mModule->Fail("Non-negative integer expected", indexerExpr->mArguments[0]);
+						else if (constant->mConstType != BfConstType_Undef)												
+							mModule->Fail("Non-negative integer expected", indexerExpr->mArguments[0]);						
 					}
 				}
 				else
 					arrSize = invocationExpr->mArguments.size();
 
-				curType = mModule->CreateSizedArrayType(curType, arrSize);
+				if (undefSizeParam != NULL)
+					curType = mModule->CreateUnknownSizedArrayType(curType, undefSizeParam);
+				else
+					curType = mModule->CreateSizedArrayType(curType, arrSize);
 			}
 
 			InitializedSizedArray((BfSizedArrayType*)curType, invocationExpr->mOpenParen, invocationExpr->mArguments, invocationExpr->mCommas, invocationExpr->mCloseParen, NULL);