1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Fixed a sized array initialization

This commit is contained in:
Brian Fiete 2020-04-12 08:37:22 -07:00
parent 5bb3966b47
commit e2a6a122c4
3 changed files with 23 additions and 12 deletions

View file

@ -15446,18 +15446,22 @@ void BfExprEvaluator::InitializedSizedArray(BfSizedArrayType* arrayType, BfToken
if (expr != NULL) if (expr != NULL)
{ {
bool tryDefer = false; bool tryDefer = false;
if ((checkArrayType->IsComposite()) && if ((checkArrayType->IsComposite()) &&
((expr->IsA<BfInvocationExpression>()) || (expr->IsExact<BfTupleExpression>()))) ((expr->IsA<BfInvocationExpression>()) || (expr->IsExact<BfTupleExpression>())))
{
// 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<bool> 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<bool> prevIgnoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, mModule->mBfIRBuilder->mIgnoreWrites || tryDefer);
elementValue = mModule->CreateValueFromExpression(expr, checkArrayType->mElementType);
if (!elementValue) if (!elementValue)
elementValue = mModule->GetDefaultTypedValue(checkArrayType->mElementType); elementValue = mModule->GetDefaultTypedValue(checkArrayType->mElementType);
deferredValue = !prevIgnoreWrites.mPrevVal && elementValue.mValue.IsFake();
if ((!elementValue) || (!CheckAllowValue(elementValue, expr))) if ((!elementValue) || (!CheckAllowValue(elementValue, expr)))
elementValue = mModule->GetDefaultTypedValue(checkArrayType->mElementType); elementValue = mModule->GetDefaultTypedValue(checkArrayType->mElementType);

View file

@ -7122,7 +7122,14 @@ BfTypedValue BfModule::CreateValueFromExpression(BfExprEvaluator& exprEvaluator,
} }
if (!typedVal.mType->IsComposite()) // Load non-structs by default 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); typedVal = LoadValue(typedVal, 0, exprEvaluator.mIsVolatileReference);
}
if (wantTypeRef != NULL) if (wantTypeRef != NULL)
{ {
@ -10224,7 +10231,7 @@ BfTypedValue BfModule::LoadValue(BfTypedValue typedValue, BfAstNode* refNode, bo
if (!typedValue.IsAddr()) if (!typedValue.IsAddr())
return typedValue; return typedValue;
if (typedValue.mType->IsValuelessType()) if ((typedValue.mType->IsValuelessType()) || (typedValue.mType->IsVar()))
return BfTypedValue(mBfIRBuilder->GetFakeVal(), typedValue.mType, false); return BfTypedValue(mBfIRBuilder->GetFakeVal(), typedValue.mType, false);
BfIRValue loadedVal = typedValue.mValue; 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) BfLocalVariable* BfModule::AddLocalVariableDef(BfLocalVariable* localVarDef, bool addDebugInfo, bool doAliasValue, BfIRValue declareBefore, BfIRInitType initType)
{ {
if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend())) if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend()))
{ {
if ((!localVarDef->mValue.IsConst()) && (!localVarDef->mValue.IsArg()) && (!localVarDef->mValue.IsFake())) if ((!localVarDef->mValue.IsConst()) && (!localVarDef->mValue.IsArg()) && (!localVarDef->mValue.IsFake()))

View file

@ -311,7 +311,7 @@ public:
bool mOuterIsConditional; bool mOuterIsConditional;
bool mInnerIsConditional; bool mInnerIsConditional;
bool mHadOuterDynStack; bool mHadOuterDynStack;
bool mAllowTargeting; bool mAllowTargeting;
bool mHadScopeValueRetain; bool mHadScopeValueRetain;
bool mIsDeferredBlock; bool mIsDeferredBlock;
BfBlock* mAstBlock; BfBlock* mAstBlock;
@ -345,7 +345,7 @@ public:
mHadOuterDynStack = false; mHadOuterDynStack = false;
mHadScopeValueRetain = false; mHadScopeValueRetain = false;
mIsDeferredBlock = false; mIsDeferredBlock = false;
mAllowTargeting = true; mAllowTargeting = true;
mMixinDepth = 0; mMixinDepth = 0;
mScopeDepth = 0; mScopeDepth = 0;
} }