From e2a6a122c4e84357eae9a39e6276b97f1fb25f8e Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 12 Apr 2020 08:37:22 -0700 Subject: [PATCH] Fixed a sized array initialization --- IDEHelper/Compiler/BfExprEvaluator.cpp | 20 ++++++++++++-------- IDEHelper/Compiler/BfModule.cpp | 11 +++++++++-- IDEHelper/Compiler/BfModule.h | 4 ++-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index fb0e4f6d..7fc152c7 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -15446,18 +15446,22 @@ void BfExprEvaluator::InitializedSizedArray(BfSizedArrayType* arrayType, BfToken if (expr != NULL) { bool tryDefer = false; - if ((checkArrayType->IsComposite()) && - ((expr->IsA()) || (expr->IsExact()))) + if ((checkArrayType->IsComposite()) && + ((expr->IsA()) || (expr->IsExact()))) + { + // We evaluate with a new scope because this expression may create variables that we don't want to be visible to other + // non-deferred evaluations (since the value may actually be a FakeVal) + SetAndRestoreValue prevIgnoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, true); + elementValue = mModule->CreateValueFromExpression(expr, checkArrayType->mElementType, BfEvalExprFlags_CreateConditionalScope); + deferredValue = !prevIgnoreWrites.mPrevVal && elementValue.mValue.IsFake(); + } + else { - tryDefer = true; + elementValue = mModule->CreateValueFromExpression(expr, checkArrayType->mElementType); } - SetAndRestoreValue prevIgnoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, mModule->mBfIRBuilder->mIgnoreWrites || tryDefer); - elementValue = mModule->CreateValueFromExpression(expr, checkArrayType->mElementType); if (!elementValue) - elementValue = mModule->GetDefaultTypedValue(checkArrayType->mElementType); - - deferredValue = !prevIgnoreWrites.mPrevVal && elementValue.mValue.IsFake(); + elementValue = mModule->GetDefaultTypedValue(checkArrayType->mElementType); if ((!elementValue) || (!CheckAllowValue(elementValue, expr))) elementValue = mModule->GetDefaultTypedValue(checkArrayType->mElementType); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 4ab51a86..392dbd2b 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -7122,7 +7122,14 @@ BfTypedValue BfModule::CreateValueFromExpression(BfExprEvaluator& exprEvaluator, } if (!typedVal.mType->IsComposite()) // Load non-structs by default + { + if ((!mBfIRBuilder->mIgnoreWrites) && (!typedVal.mType->IsValuelessType()) && (!typedVal.mType->IsVar())) + { + BF_ASSERT(!typedVal.mValue.IsFake()); + } + typedVal = LoadValue(typedVal, 0, exprEvaluator.mIsVolatileReference); + } if (wantTypeRef != NULL) { @@ -10224,7 +10231,7 @@ BfTypedValue BfModule::LoadValue(BfTypedValue typedValue, BfAstNode* refNode, bo if (!typedValue.IsAddr()) return typedValue; - if (typedValue.mType->IsValuelessType()) + if ((typedValue.mType->IsValuelessType()) || (typedValue.mType->IsVar())) return BfTypedValue(mBfIRBuilder->GetFakeVal(), typedValue.mType, false); BfIRValue loadedVal = typedValue.mValue; @@ -12282,7 +12289,7 @@ void BfModule::DoAddLocalVariable(BfLocalVariable* localVar) } BfLocalVariable* BfModule::AddLocalVariableDef(BfLocalVariable* localVarDef, bool addDebugInfo, bool doAliasValue, BfIRValue declareBefore, BfIRInitType initType) -{ +{ if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend())) { if ((!localVarDef->mValue.IsConst()) && (!localVarDef->mValue.IsArg()) && (!localVarDef->mValue.IsFake())) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index f69772da..04301cdf 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -311,7 +311,7 @@ public: bool mOuterIsConditional; bool mInnerIsConditional; bool mHadOuterDynStack; - bool mAllowTargeting; + bool mAllowTargeting; bool mHadScopeValueRetain; bool mIsDeferredBlock; BfBlock* mAstBlock; @@ -345,7 +345,7 @@ public: mHadOuterDynStack = false; mHadScopeValueRetain = false; mIsDeferredBlock = false; - mAllowTargeting = true; + mAllowTargeting = true; mMixinDepth = 0; mScopeDepth = 0; }