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

Retain argument cascade type

This commit is contained in:
Brian Fiete 2022-06-06 11:27:07 -07:00
parent 91a4af93af
commit 25bde9e566
3 changed files with 15 additions and 1 deletions

View file

@ -5905,6 +5905,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
else if ((!resolvedArg.mResolvedType->IsStruct()) && (!resolvedArg.mResolvedType->IsSizedArray()) && (!resolvedArg.mResolvedType->IsValuelessType())) else if ((!resolvedArg.mResolvedType->IsStruct()) && (!resolvedArg.mResolvedType->IsSizedArray()) && (!resolvedArg.mResolvedType->IsValuelessType()))
argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference); argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference);
} }
resolvedArg.mUncastedTypedValue = argValue;
resolvedArg.mTypedValue = argValue; resolvedArg.mTypedValue = argValue;
if (deferParamValues) if (deferParamValues)
@ -8000,6 +8001,9 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
if ((argExprIdx != -1) && (argExprIdx < (int)argValues.size()) && ((argValues[argExprIdx].mArgFlags & BfArgFlag_Cascade) != 0)) if ((argExprIdx != -1) && (argExprIdx < (int)argValues.size()) && ((argValues[argExprIdx].mArgFlags & BfArgFlag_Cascade) != 0))
{ {
mUsedAsStatement = true; mUsedAsStatement = true;
if (argValues[argExprIdx].mUncastedTypedValue)
argCascades.Add(argValues[argExprIdx].mUncastedTypedValue);
else
argCascades.Add(argValue); argCascades.Add(argValue);
} }
@ -8430,6 +8434,7 @@ BfTypedValue BfExprEvaluator::ResolveArgValue(BfResolvedArg& resolvedArg, BfType
auto expr = BfNodeDynCast<BfExpression>(resolvedArg.mExpression); auto expr = BfNodeDynCast<BfExpression>(resolvedArg.mExpression);
BF_ASSERT(expr != NULL); BF_ASSERT(expr != NULL);
argValue = mModule->CreateValueFromExpression(expr, wantType, (BfEvalExprFlags)((mBfEvalExprFlags & BfEvalExprFlags_InheritFlags) | BfEvalExprFlags_NoCast | BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_AllowOutExpr)); argValue = mModule->CreateValueFromExpression(expr, wantType, (BfEvalExprFlags)((mBfEvalExprFlags & BfEvalExprFlags_InheritFlags) | BfEvalExprFlags_NoCast | BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_AllowOutExpr));
resolvedArg.mUncastedTypedValue = argValue;
if ((argValue) && (wantType != NULL)) if ((argValue) && (wantType != NULL))
argValue = mModule->Cast(expr, argValue, wantType); argValue = mModule->Cast(expr, argValue, wantType);
} }

View file

@ -56,6 +56,7 @@ class BfResolvedArg
{ {
public: public:
BfTypedValue mTypedValue; BfTypedValue mTypedValue;
BfTypedValue mUncastedTypedValue;
BfType* mResolvedType; BfType* mResolvedType;
BfAstNode* mExpression; BfAstNode* mExpression;
BfArgFlags mArgFlags; BfArgFlags mArgFlags;

View file

@ -154,6 +154,11 @@ namespace Tests
scPtr.mData[0] += 100; scPtr.mData[0] += 100;
} }
static void ObjMethod(Object obj)
{
}
[Test] [Test]
public static void TestBasics() public static void TestBasics()
{ {
@ -198,6 +203,9 @@ namespace Tests
function [CallingConvention(.Cdecl)] void (StructC) scFunc2 = => ModifyC2; function [CallingConvention(.Cdecl)] void (StructC) scFunc2 = => ModifyC2;
scFunc2(sc); scFunc2(sc);
Test.Assert(sc.mData[0] == 323); Test.Assert(sc.mData[0] == 323);
var v = ObjMethod(.. scope String());
Test.Assert(v.GetType() == typeof(String));
} }
} }
} }