From 5d909752c96d8905810806395a432544c9fce9c8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 31 Jan 2020 06:12:04 -0800 Subject: [PATCH] Improved some var handling for allocations --- IDEHelper/Compiler/BfExprEvaluator.cpp | 59 ++++++++++++-------------- IDEHelper/Compiler/BfModule.cpp | 5 +++ 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 42de1f5b..764edc2a 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -10987,7 +10987,10 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr) } if (resolvedTypeRef == NULL) - return; + { + unresolvedTypeRef = mModule->GetPrimitiveType(BfTypeCode_Var); + resolvedTypeRef = unresolvedTypeRef; + } auto resultType = resolvedTypeRef; if ((resolvedTypeRef->IsInterface()) && (!isArrayAlloc)) @@ -11300,6 +11303,14 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr) mModule->mBfIRBuilder->CreateConst(BfTypeCode_Int8, isUninit ? 0xCC : 0), clearBytes, resultType->mAlign); } }; + + if (resultType->IsVar()) + { + SetAndRestoreValue prevIgnoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, true); + mResult = BfTypedValue(BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), mModule->GetPrimitiveType(BfTypeCode_Var))); + _HandleInitExprs(mResult.mValue, 0, objCreateExpr->mArguments); + return; + } if (isRawArrayAlloc) { @@ -11569,13 +11580,21 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr) appendAllocAlign = BF_MAX(appendAllocAlign, allocAlign); BfIRValue allocValue; - if (isAppendAlloc) - allocValue = mModule->AppendAllocFromType(resolvedTypeRef, appendSizeValue, appendAllocAlign); + if (resolvedTypeRef->IsVar()) + { + mResult = mModule->GetDefaultTypedValue(resultType); + return; + } else { - allocValue = mModule->AllocFromType(resolvedTypeRef, allocTarget, appendSizeValue, BfIRValue(), 0, BfAllocFlags_None, allocAlign); + if (isAppendAlloc) + allocValue = mModule->AppendAllocFromType(resolvedTypeRef, appendSizeValue, appendAllocAlign); + else + { + allocValue = mModule->AllocFromType(resolvedTypeRef, allocTarget, appendSizeValue, BfIRValue(), 0, BfAllocFlags_None, allocAlign); + } + mResult = BfTypedValue(allocValue, resultType); } - mResult = BfTypedValue(allocValue, resultType); if (isScopeAlloc) { @@ -11695,33 +11714,7 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr) bindResult.mIRArgs.Insert(0, mResult.mValue); CreateCall(bindResult.mMethodInstance, bindResult.mFunc, false, bindResult.mIRArgs); } - } - -// if ((mResult) && (!isArrayAlloc) && (objCreateExpr->mCollectionInitializer != NULL)) -// { -// for (BfExpression* initExpr : objCreateExpr->mCollectionInitializer->mValues) -// { -// SizedArray exprs; -// -// if (auto groupExpr = BfNodeDynCast(initExpr)) -// { -// for (BfExpression* argExpr : groupExpr->mValues) -// exprs.push_back(argExpr); -// } -// else -// { -// exprs.push_back(initExpr); -// } -// -// BfExprEvaluator exprEvaluator(mModule); -// SizedArray copiedArgs; -// for (BfExpression* arg : exprs) -// copiedArgs.push_back(arg); -// BfResolvedArgs argValues(copiedArgs); -// exprEvaluator.ResolveArgValues(argValues); -// exprEvaluator.MatchMethod(initExpr, NULL, mResult, false, false, "Add", argValues, NULL); -// } -// } + } } void BfExprEvaluator::Visit(BfBoxExpression* boxExpr) @@ -17394,7 +17387,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod if ((resultType->IsVar()) || (otherType->IsVar())) { - mResult = BfTypedValue(mModule->GetDefaultValue(resultType), mModule->GetPrimitiveType(BfTypeCode_Var)); + mResult = mModule->GetDefaultTypedValue(resultType); return; } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 204eca65..8def0109 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -1380,6 +1380,9 @@ BfTypedValue BfModule::GetFakeTypedValue(BfType* type) BfTypedValue BfModule::GetDefaultTypedValue(BfType* type, bool allowRef, BfDefaultValueKind defaultValueKind) { + if (type->IsVar()) + return BfTypedValue(mBfIRBuilder->GetFakeVal(), type); + PopulateType(type, BfPopulateType_Data); mBfIRBuilder->PopulateType(type, type->IsValueType() ? BfIRPopulateType_Full : BfIRPopulateType_Declaration); @@ -7384,6 +7387,8 @@ BfIRValue BfModule::AllocFromType(BfType* type, const BfAllocTarget& allocTarget BfScopeData* scopeData = allocTarget.mScopeData; + BF_ASSERT(!type->IsVar()); + auto typeInstance = type->ToTypeInstance(); if ((typeInstance == NULL) && (type->IsGenericParam())) typeInstance = mContext->mBfObjectType;