1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Argument cascades

This commit is contained in:
Brian Fiete 2021-01-02 08:11:07 -08:00
parent 0692fb44a4
commit 2dbcca8ca4
8 changed files with 98 additions and 8 deletions

View file

@ -4616,8 +4616,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
SizedArray<BfExpression*, 8> deferredArgs;
int argIdx = 0;
//for (int argIdx = 0; argIdx < argCount ; argIdx++)
while (true)
{
//printf("Args: %p %p %d\n", resolvedArgs.mArguments, resolvedArgs.mArguments->mVals, resolvedArgs.mArguments->mSize);
@ -4683,6 +4682,15 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
}
}
if (auto unaryOpExpr = BfNodeDynCastExact<BfUnaryOperatorExpression>(argExpr))
{
if (unaryOpExpr->mOp == BfUnaryOp_Cascade)
{
resolvedArg.mArgFlags = (BfArgFlags)(resolvedArg.mArgFlags | BfArgFlag_Cascade);
argExpr = unaryOpExpr->mExpression;
}
}
bool deferParamEval = false;
if ((flags & BfResolveArgsFlag_DeferParamEval) != 0)
{
@ -5899,6 +5907,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
BF_ASSERT(returnType->IsInterface());
}*/
Array<BfTypedValue> argCascades;
BfTypedValue target = inTarget;
if (!skipThis)
@ -6607,6 +6616,8 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
argValue = mModule->LoadValue(argValue);
}
if ((argExprIdx != -1) && (argExprIdx < (int)argValues.size()) && ((argValues[argExprIdx].mArgFlags & BfArgFlag_Cascade) != 0))
argCascades.Add(argValue);
if (expandedParamsArray)
{
@ -6773,8 +6784,14 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
}
auto func = moduleMethodInstance.mFunc;
BfTypedValue result = CreateCall(targetSrc, methodInstance, func, bypassVirtual, irArgs);
return result;
BfTypedValue callResult = CreateCall(targetSrc, methodInstance, func, bypassVirtual, irArgs);
if (argCascades.mSize == 1)
return argCascades[0];
if (argCascades.mSize > 1)
return mModule->CreateTuple(argCascades, {});
return callResult;
}
BfTypedValue BfExprEvaluator::MatchConstructor(BfAstNode* targetSrc, BfMethodBoundExpression* methodBoundExpr, BfTypedValue target, BfTypeInstance* targetType, BfResolvedArgs& argValues, bool callCtorBodyOnly, bool allowAppendAlloc, BfTypedValue* appendIndexValue)
@ -19376,7 +19393,11 @@ void BfExprEvaluator::PerformUnaryOperation_OnResult(BfExpression* unaryOpExpr,
}
}
break;
case BfUnaryOp_Cascade:
{
mModule->Fail("Illegal use of argument cascade expression", opToken);
}
break;
default:
mModule->Fail("INTERNAL ERROR: Unhandled unary operator", unaryOpExpr);
break;