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

Fixed params expression with ref values

This commit is contained in:
Brian Fiete 2020-05-19 09:42:11 -07:00
parent 4fe6bcaa86
commit e82daf74d4
9 changed files with 29 additions and 45 deletions

View file

@ -301,11 +301,6 @@ void BfStructuralVisitor::Visit(BfParameterDeclaration* paramDecl)
Visit(paramDecl->ToBase()); Visit(paramDecl->ToBase());
} }
void BfStructuralVisitor::Visit(BfParamsExpression* paramsExpr)
{
Visit(paramsExpr->ToBase());
}
void BfStructuralVisitor::Visit(BfTypeAttrExpression* typeAttrExpr) void BfStructuralVisitor::Visit(BfTypeAttrExpression* typeAttrExpr)
{ {
Visit(typeAttrExpr->ToBase()); Visit(typeAttrExpr->ToBase());

View file

@ -268,7 +268,6 @@ class BfOperatorDeclaration;
class BfFieldDeclaration; class BfFieldDeclaration;
class BfEnumCaseDeclaration; class BfEnumCaseDeclaration;
class BfParameterDeclaration; class BfParameterDeclaration;
class BfParamsExpression;
class BfForStatement; class BfForStatement;
class BfUsingStatement; class BfUsingStatement;
class BfDoStatement; class BfDoStatement;
@ -455,7 +454,6 @@ public:
virtual void Visit(BfVariableDeclaration* varDecl); virtual void Visit(BfVariableDeclaration* varDecl);
virtual void Visit(BfLocalMethodDeclaration* methodDecl); virtual void Visit(BfLocalMethodDeclaration* methodDecl);
virtual void Visit(BfParameterDeclaration* paramDecl); virtual void Visit(BfParameterDeclaration* paramDecl);
virtual void Visit(BfParamsExpression* paramsExpr);
virtual void Visit(BfTypeAttrExpression* typeAttrExpr); virtual void Visit(BfTypeAttrExpression* typeAttrExpr);
virtual void Visit(BfTypeOfExpression* typeOfExpr); virtual void Visit(BfTypeOfExpression* typeOfExpr);
virtual void Visit(BfSizeOfExpression* sizeOfExpr); virtual void Visit(BfSizeOfExpression* sizeOfExpr);
@ -2472,14 +2470,6 @@ public:
BfTokenNode* mRefToken; BfTokenNode* mRefToken;
}; BF_AST_DECL(BfRefTypeRef, BfElementedTypeRef); }; BF_AST_DECL(BfRefTypeRef, BfElementedTypeRef);
class BfParamsExpression : public BfExpression
{
public:
BF_AST_TYPE(BfParamsExpression, BfExpression);
BfTokenNode* mParamsToken;
}; BF_AST_DECL(BfParamsExpression, BfExpression);
class BfTypeAttrExpression : public BfExpression class BfTypeAttrExpression : public BfExpression
{ {
public: public:

View file

@ -446,13 +446,6 @@ void BfElementVisitor::Visit(BfParameterDeclaration* paramDecl)
VisitChild(paramDecl->mModToken); // 'Params' VisitChild(paramDecl->mModToken); // 'Params'
} }
void BfElementVisitor::Visit(BfParamsExpression* paramsExpr)
{
Visit(paramsExpr->ToBase());
VisitChild(paramsExpr->mParamsToken);
}
void BfElementVisitor::Visit(BfTypeAttrExpression* typeAttrExpr) void BfElementVisitor::Visit(BfTypeAttrExpression* typeAttrExpr)
{ {
Visit(typeAttrExpr->ToBase()); Visit(typeAttrExpr->ToBase());

View file

@ -65,7 +65,6 @@ public:
virtual void Visit(BfVariableDeclaration* varDecl); virtual void Visit(BfVariableDeclaration* varDecl);
virtual void Visit(BfLocalMethodDeclaration* methodDecl); virtual void Visit(BfLocalMethodDeclaration* methodDecl);
virtual void Visit(BfParameterDeclaration* paramDecl); virtual void Visit(BfParameterDeclaration* paramDecl);
virtual void Visit(BfParamsExpression* paramsExpr);
virtual void Visit(BfTypeAttrExpression* typeAttrExpr); virtual void Visit(BfTypeAttrExpression* typeAttrExpr);
virtual void Visit(BfDefaultExpression* defaultExpr); virtual void Visit(BfDefaultExpression* defaultExpr);
virtual void Visit(BfUninitializedExpression* uninitializedExpr); virtual void Visit(BfUninitializedExpression* uninitializedExpr);

View file

@ -4134,12 +4134,10 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
{ {
BfResolvedArg compositeResolvedArg; BfResolvedArg compositeResolvedArg;
auto compositeLocalVar = methodState->mLocals[localVar->mLocalVarIdx + compositeIdx + 1]; auto compositeLocalVar = methodState->mLocals[localVar->mLocalVarIdx + compositeIdx + 1];
auto argValue = exprEvaluator.LoadLocal(compositeLocalVar); auto argValue = exprEvaluator.LoadLocal(compositeLocalVar, true);
if (argValue) if (argValue)
{ {
if (argValue.mType->IsRef()) if (!argValue.mType->IsStruct())
argValue.mKind = BfTypedValueKind_Value;
else if (!argValue.mType->IsStruct())
argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference); argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference);
} }
resolvedArg.mTypedValue = argValue; resolvedArg.mTypedValue = argValue;
@ -8052,11 +8050,6 @@ void BfExprEvaluator::Visit(BfCollectionInitializerExpression* arrayInitExpr)
mModule->Fail("Collection initializer not usable here", arrayInitExpr); mModule->Fail("Collection initializer not usable here", arrayInitExpr);
} }
void BfExprEvaluator::Visit(BfParamsExpression* paramsExpr)
{
mModule->Fail("Params expression is only usable as a call parameter", paramsExpr);
}
void BfExprEvaluator::Visit(BfTypeOfExpression* typeOfExpr) void BfExprEvaluator::Visit(BfTypeOfExpression* typeOfExpr)
{ {
auto typeType = mModule->ResolveTypeDef(mModule->mCompiler->mTypeTypeDef); auto typeType = mModule->ResolveTypeDef(mModule->mCompiler->mTypeTypeDef);

View file

@ -420,7 +420,6 @@ public:
virtual void Visit(BfMixinExpression* mixinExpr) override; virtual void Visit(BfMixinExpression* mixinExpr) override;
virtual void Visit(BfSizedArrayCreateExpression* createExpr) override; virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
virtual void Visit(BfCollectionInitializerExpression* initExpr) override; virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
virtual void Visit(BfParamsExpression* paramsExpr) override;
virtual void Visit(BfTypeOfExpression* typeOfExpr) override; virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
virtual void Visit(BfSizeOfExpression* sizeOfExpr) override; virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
virtual void Visit(BfAlignOfExpression* alignOfExpr) override; virtual void Visit(BfAlignOfExpression* alignOfExpr) override;

View file

@ -1462,13 +1462,6 @@ void BfPrinter::Visit(BfParameterDeclaration* paramDecl)
Visit(paramDecl->ToBase()); Visit(paramDecl->ToBase());
} }
void BfPrinter::Visit(BfParamsExpression* paramsExpr)
{
Visit(paramsExpr->ToBase());
VisitChild(paramsExpr->mParamsToken);
}
void BfPrinter::Visit(BfTypeOfExpression* typeOfExpr) void BfPrinter::Visit(BfTypeOfExpression* typeOfExpr)
{ {
Visit(typeOfExpr->ToBase()); Visit(typeOfExpr->ToBase());

View file

@ -147,7 +147,6 @@ public:
virtual void Visit(BfNullableTypeRef* typeRef) override; virtual void Visit(BfNullableTypeRef* typeRef) override;
virtual void Visit(BfVariableDeclaration* varDecl) override; virtual void Visit(BfVariableDeclaration* varDecl) override;
virtual void Visit(BfParameterDeclaration* paramDecl) override; virtual void Visit(BfParameterDeclaration* paramDecl) override;
virtual void Visit(BfParamsExpression* paramsExpr) override;
virtual void Visit(BfTypeOfExpression* typeOfExpr) override; virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
virtual void Visit(BfSizeOfExpression* sizeOfExpr) override; virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
virtual void Visit(BfDefaultExpression* defaultExpr) override; virtual void Visit(BfDefaultExpression* defaultExpr) override;

View file

@ -140,6 +140,29 @@ namespace Tests
ca.TestLambda(); ca.TestLambda();
} }
public static void Modify(ref int a, ref Splattable b)
{
a += 1000;
b.mA += 2000;
b.mB += 3000;
}
[Test]
public static void TestRefs()
{
delegate void(ref int a, ref Splattable b) dlg = scope => Modify;
int a = 123;
Splattable splat = .();
splat.mA = 234;
splat.mB = 345;
dlg(ref a, ref splat);
Test.Assert(a == 1123);
Test.Assert(splat.mA == 2234);
Test.Assert(splat.mB == 3345);
}
public static void TestCasting() public static void TestCasting()
{ {
delegate int(int, int) dlg0 = null; delegate int(int, int) dlg0 = null;