internal static object[] BindArgumentsForScriptblockInvoke( RuntimeDefinedParameter[] parameters, object[] args, ExecutionContext context, bool dotting, Dictionary<string, PSVariable> backupWhenDotting, MutableTuple locals) { var boundParameters = new CommandLineParameters(); if (parameters.Length == 0) { return args; } for (int i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; object valueToBind; bool wasDefaulted = false; if (i >= args.Length) { valueToBind = parameter.Value; if (valueToBind is Compiler.DefaultValueExpressionWrapper) { // We pass in a null SessionStateInternal because the current scope is already set correctly. valueToBind = ((Compiler.DefaultValueExpressionWrapper)valueToBind).GetValue(context, null); } wasDefaulted = true; } else { valueToBind = args[i]; } bool valueSet = false; if (dotting && backupWhenDotting != null) { backupWhenDotting[parameter.Name] = context.EngineSessionState.GetVariableAtScope(parameter.Name, "local"); } else { valueSet = locals.TrySetParameter(parameter.Name, valueToBind); } if (!valueSet) { var variable = new PSVariable(parameter.Name, valueToBind, ScopedItemOptions.None, parameter.Attributes); context.EngineSessionState.SetVariable(variable, false, CommandOrigin.Internal); } if (!wasDefaulted) { boundParameters.Add(parameter.Name, valueToBind); boundParameters.MarkAsBoundPositionally(parameter.Name); } } locals.SetAutomaticVariable(AutomaticVariable.PSBoundParameters, boundParameters.GetValueToBindToPSBoundParameters(), context); var leftOverArgs = args.Length - parameters.Length; if (leftOverArgs <= 0) { return Utils.EmptyArray<object>(); } object[] result = new object[leftOverArgs]; Array.Copy(args, parameters.Length, result, 0, result.Length); return result; }
internal static object[] BindArgumentsForScripblockInvoke(RuntimeDefinedParameter[] parameters, object[] args, ExecutionContext context, bool dotting, Dictionary<string, PSVariable> backupWhenDotting, MutableTuple locals) { object value; CommandLineParameters commandLineParameter = new CommandLineParameters(); if ((int)parameters.Length != 0) { for (int i = 0; i < (int)parameters.Length; i++) { RuntimeDefinedParameter variableAtScope = parameters[i]; bool flag = false; if (i < (int)args.Length) { value = args[i]; } else { value = variableAtScope.Value; if (value as Compiler.DefaultValueExpressionWrapper != null) { value = ((Compiler.DefaultValueExpressionWrapper)value).GetValue(context, null, null); } flag = true; } bool flag1 = false; if (!dotting || backupWhenDotting == null) { flag1 = locals.TrySetParameter(variableAtScope.Name, value); } else { backupWhenDotting[variableAtScope.Name] = context.EngineSessionState.GetVariableAtScope(variableAtScope.Name, "local"); } if (!flag1) { PSVariable pSVariable = new PSVariable(variableAtScope.Name, value, ScopedItemOptions.None, variableAtScope.Attributes); context.EngineSessionState.SetVariable(pSVariable, false, CommandOrigin.Internal); } if (!flag) { commandLineParameter.Add(variableAtScope.Name, value); commandLineParameter.MarkAsBoundPositionally(variableAtScope.Name); } } locals.SetAutomaticVariable(AutomaticVariable.PSBoundParameters, commandLineParameter.GetValueToBindToPSBoundParameters(), context); int length = (int)args.Length - (int)parameters.Length; if (length > 0) { object[] objArray = new object[length]; Array.Copy(args, (int)parameters.Length, objArray, 0, (int)objArray.Length); return objArray; } else { return ScriptBlock.EmptyArray; } } else { return args; } }