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:
parent
91a4af93af
commit
25bde9e566
3 changed files with 15 additions and 1 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue