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 RebuildToNetTypes(ILocalValueScope localValues, object netValues, FieldToDecl fields) { if (netValues == null) { return; } foreach (var field in fields) { var fieldValue = localValues[field.Value]; var converter = fieldValue.Type.GetToNetType(); var netValue = converter(fieldValue.Data); field.Key.SetValue(netValues, netValue); } }
static void NetTypesToRebuild(object netValues, FieldToDecl fields, ILocalValueScope localValues) { if (netValues == null) { return; } foreach (var field in fields) { if (field.Key.GetCustomAttributes(typeof(ArgumentAssignable)).Any()) { var netValue = field.Key.GetValue(netValues); var fieldValue = localValues[field.Value]; var converter = fieldValue.Type.GetFromNetType(); converter(netValue, fieldValue.Data); } } }
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); }
internal Context(ILocalIdentifierScope idScope, ILocalValueScope valueScope) { _identifiers = new ParentedIdentifierScope(idScope); _values = new ParentValueScope(valueScope); }
internal ParentValueScope(ILocalValueScope local) { _local = local; }