1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +02:00

Improved unknown-sized array in BfInvocationExpression

This commit is contained in:
Brian Fiete 2025-05-28 06:23:22 +02:00
parent eb4d2a1757
commit 9e71acc003

View file

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