1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-11 04:52:21 +02:00

Improved struct returns from mixins and block expressions

This commit is contained in:
Brian Fiete 2022-06-15 11:24:24 -07:00
parent 5268e103e9
commit e3ca70c153
3 changed files with 36 additions and 0 deletions

View file

@ -798,6 +798,21 @@ public:
} }
} }
void MakeTemporary(bool restricted = false)
{
switch (mKind)
{
case BfTypedValueKind_Addr:
mKind = restricted ? BfTypedValueKind_RestrictedTempAddr : BfTypedValueKind_TempAddr;
break;
case BfTypedValueKind_ReadOnlyAddr:
mKind = BfTypedValueKind_ReadOnlyTempAddr;
break;
default:
break;
}
}
bool CanModify() const; bool CanModify() const;
}; };

View file

@ -3403,6 +3403,11 @@ void BfExprEvaluator::Visit(BfBlock* blockExpr)
mModule->VisitEmbeddedStatement(blockExpr, this, BfNodeIsA<BfUnscopedBlock>(blockExpr) ? BfEmbeddedStatementFlags_Unscoped : BfEmbeddedStatementFlags_None); mModule->VisitEmbeddedStatement(blockExpr, this, BfNodeIsA<BfUnscopedBlock>(blockExpr) ? BfEmbeddedStatementFlags_Unscoped : BfEmbeddedStatementFlags_None);
mResult = mModule->SanitizeAddr(mResult); mResult = mModule->SanitizeAddr(mResult);
if ((mResult) && (mResult.mType->IsStruct()))
{
mResult = mModule->MakeAddressable(mResult, true);
mResult.MakeTemporary(true);
}
} }
bool BfExprEvaluator::CheckVariableDeclaration(BfAstNode* checkNode, bool requireSimpleIfExpr, bool exprMustBeTrue, bool silentFail) bool BfExprEvaluator::CheckVariableDeclaration(BfAstNode* checkNode, bool requireSimpleIfExpr, bool exprMustBeTrue, bool silentFail)
@ -17248,6 +17253,12 @@ void BfExprEvaluator::InjectMixin(BfAstNode* targetSrc, BfTypedValue target, boo
mModule->mBfIRBuilder->RestoreDebugLocation(); mModule->mBfIRBuilder->RestoreDebugLocation();
mModule->mBfIRBuilder->DupDebugLocation(); mModule->mBfIRBuilder->DupDebugLocation();
if ((mResult) && (mResult.mType->IsStruct()))
{
mResult = mModule->MakeAddressable(mResult, true);
mResult.MakeTemporary(true);
}
} }
void BfExprEvaluator::SetMethodElementType(BfAstNode* target) void BfExprEvaluator::SetMethodElementType(BfAstNode* target)

View file

@ -79,6 +79,11 @@ namespace Tests
ref a ref a
} }
static mixin Unwrap(var res)
{
res.Value
}
[Test] [Test]
public static void TestBasics() public static void TestBasics()
{ {
@ -139,6 +144,11 @@ namespace Tests
var c = { ref b }; var c = { ref b };
c = 99; c = 99;
Test.Assert(b == 99); Test.Assert(b == 99);
Result<StringView> svRes = "ab ";
var sv2 = Unwrap!(svRes)..Trim();
Test.Assert(svRes.Value == "ab ");
Test.Assert(sv2 == "ab");
} }
} }