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:
parent
5bb3966b47
commit
e2a6a122c4
3 changed files with 23 additions and 12 deletions
|
@ -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);
|
||||||
|
|
|
@ -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()))
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue