예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
        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);
        }