Browse Source

Fixed params expression with ref values

Brian Fiete 5 years ago
parent
commit
e82daf74d4

+ 0 - 5
IDEHelper/Compiler/BfAst.cpp

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

+ 1 - 11
IDEHelper/Compiler/BfAst.h

@@ -268,7 +268,6 @@ class BfOperatorDeclaration;
 class BfFieldDeclaration;
 class BfEnumCaseDeclaration;
 class BfParameterDeclaration;
-class BfParamsExpression;
 class BfForStatement;
 class BfUsingStatement;
 class BfDoStatement;
@@ -454,8 +453,7 @@ public:
 	virtual void Visit(BfNullableTypeRef* typeRef);
 	virtual void Visit(BfVariableDeclaration* varDecl);	
 	virtual void Visit(BfLocalMethodDeclaration* methodDecl);
-	virtual void Visit(BfParameterDeclaration* paramDecl);	
-	virtual void Visit(BfParamsExpression* paramsExpr);
+	virtual void Visit(BfParameterDeclaration* paramDecl);		
 	virtual void Visit(BfTypeAttrExpression* typeAttrExpr);
 	virtual void Visit(BfTypeOfExpression* typeOfExpr);
 	virtual void Visit(BfSizeOfExpression* sizeOfExpr);	
@@ -2472,14 +2470,6 @@ public:
 	BfTokenNode* mRefToken;
 };	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
 {
 public:

+ 0 - 7
IDEHelper/Compiler/BfElementVisitor.cpp

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

+ 1 - 2
IDEHelper/Compiler/BfElementVisitor.h

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

+ 2 - 9
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -4134,12 +4134,10 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
 					{
 						BfResolvedArg compositeResolvedArg;
 						auto compositeLocalVar = methodState->mLocals[localVar->mLocalVarIdx + compositeIdx + 1];
-						auto argValue = exprEvaluator.LoadLocal(compositeLocalVar);
+						auto argValue = exprEvaluator.LoadLocal(compositeLocalVar, true);
 						if (argValue)
 						{
-							if (argValue.mType->IsRef())
-								argValue.mKind = BfTypedValueKind_Value;
-							else if (!argValue.mType->IsStruct())
+							if (!argValue.mType->IsStruct())
 								argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference);
 						}
 						resolvedArg.mTypedValue = argValue;
@@ -8052,11 +8050,6 @@ void BfExprEvaluator::Visit(BfCollectionInitializerExpression* 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)
 {	
 	auto typeType = mModule->ResolveTypeDef(mModule->mCompiler->mTypeTypeDef);

+ 1 - 2
IDEHelper/Compiler/BfExprEvaluator.h

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

+ 0 - 7
IDEHelper/Compiler/BfPrinter.cpp

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

+ 1 - 2
IDEHelper/Compiler/BfPrinter.h

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

+ 23 - 0
IDEHelper/Tests/src/Delegates.bf

@@ -140,6 +140,29 @@ namespace Tests
 			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()
 		{
 			delegate int(int, int) dlg0 = null;