static void BuildArgumentValues( ILocalValueScope localValues, INamedExpressionTuple expressions, ILocalIdentifierScope argumentScope, ArgumentInstanceCollection arguments, IContext argumentContext, IContext functionContext) { var argN = 0; foreach (var expression in expressions.Tuple) { var argumentName = expression.Name; if (string.IsNullOrEmpty(argumentName)) { argumentName = arguments[argN].Name; argN++; } var argument = (IArgumentInstance)argumentScope[argumentName]; var value = Dynamic((dynamic)expression.Expression, argumentContext); var casted = ImplicitCast(value, argument.Type); localValues.Add(argument, casted); } for (; argN < arguments.Count; argN++) { var argument = arguments[argN]; var value = Dynamic((dynamic)argument.Argument.Value, functionContext); localValues.Add(argument, value); } }
static void BuildResultValues(LocalValueScope localValues, ArgumentInstanceCollection results, IContext functionContext) { foreach (var result in results) { var value = result.Argument.Value != null?Dynamic((dynamic)result.Argument.Value, functionContext) : CreateValue(result.Type); localValues.Add(result, value); } }
static void ExtractArgumentReferenceValues( ILocalValueScope localValues, INamedExpressionTuple expressions, ArgumentInstanceCollection arguments, IContext callerContext) { var argN = 0; foreach (var expression in expressions.Tuple) { var argument = arguments[argN]; argN++; if (argument.Argument.IsAssignable && expression.Expression is ITypedReference reference) { var referenceDecl = callerContext.Values[reference.Instance]; var value = localValues[argument]; var casted = ImplicitCast(value, referenceDecl.Type); Array.Copy(casted.Data, referenceDecl.Data, referenceDecl.Data.Length); } } }
static IExpression ExtractResultValues(ILocalValueScope localValues, IExpression result, ArgumentInstanceCollection results) { if (results.IsEmpty()) { return(null); } if (results.Count == 1 && results.First().Name == null) { return(result); } var expressionTuple = new NamedExpressionTuple(); foreach (var namedResult in results) { var value = localValues[namedResult]; expressionTuple.Tuple.Add( new NamedExpression { Name = namedResult.Name, Expression = value }); } return(expressionTuple); }