Esempio n. 1
0
        internal static object SetVariableValue(VariablePath variablePath, object value, ExecutionContext executionContext, AttributeBaseAst[] attributeAsts)
        {
            SessionStateInternal sessionState = executionContext.EngineSessionState;
            CommandOrigin        origin       = sessionState.CurrentScope.ScopeOrigin;

            if (!variablePath.IsVariable)
            {
                sessionState.SetVariable(variablePath, value, true, origin);
                return(value);
            }

            // Variable assignment is traced only if trace level 2 is specified.
            if (executionContext.PSDebugTraceLevel > 1)
            {
                executionContext.Debugger.TraceVariableSet(variablePath.UnqualifiedPath, value);
            }

            if (variablePath.IsUnscopedVariable)
            {
                variablePath = variablePath.CloneAndSetLocal();
            }

            SessionStateScope scope;
            PSVariable        var = sessionState.GetVariableItem(variablePath, out scope, origin);

            if (var == null)
            {
                var attributes = attributeAsts == null
                                     ? new Collection <Attribute>()
                                     : GetAttributeCollection(attributeAsts);
                var = new PSVariable(variablePath.UnqualifiedPath, value, ScopedItemOptions.None, attributes);

                // Marking untrusted values for assignments in 'ConstrainedLanguage' mode is done in
                // SessionStateScope.SetVariable.
                sessionState.SetVariable(variablePath, var, false, origin);

                if (executionContext._debuggingMode > 0)
                {
                    executionContext.Debugger.CheckVariableWrite(variablePath.UnqualifiedPath);
                }
            }
            else
            {
                if (attributeAsts != null)
                {
                    // Use bytewise operation directly instead of 'var.IsReadOnly || var.IsConstant' on
                    // a hot path (setting variable with type constraint) to get better performance.
                    if ((var.Options & (ScopedItemOptions.ReadOnly | ScopedItemOptions.Constant)) != ScopedItemOptions.None)
                    {
                        SessionStateUnauthorizedAccessException e =
                            new SessionStateUnauthorizedAccessException(
                                var.Name,
                                SessionStateCategory.Variable,
                                "VariableNotWritable",
                                SessionStateStrings.VariableNotWritable);
                        throw e;
                    }

                    var attributes = GetAttributeCollection(attributeAsts);
                    value = PSVariable.TransformValue(attributes, value);
                    if (!PSVariable.IsValidValue(attributes, value))
                    {
                        ValidationMetadataException e = new ValidationMetadataException(
                            "ValidateSetFailure",
                            null,
                            Metadata.InvalidValueFailure,
                            var.Name,
                            ((value != null) ? value.ToString() : "$null"));

                        throw e;
                    }

                    var.SetValueRaw(value, true);
                    // Don't update the PSVariable's attributes until we successfully set the value
                    var.Attributes.Clear();
                    var.AddParameterAttributesNoChecks(attributes);

                    if (executionContext._debuggingMode > 0)
                    {
                        executionContext.Debugger.CheckVariableWrite(variablePath.UnqualifiedPath);
                    }
                }
                else
                {
                    // The setter will handle checking for variable writes.
                    var.Value = value;
                }

                if (executionContext.LanguageMode == PSLanguageMode.ConstrainedLanguage)
                {
                    // Mark untrusted values for assignments to 'Global:' variables, and 'Script:' variables in
                    // a module scope, if it's necessary.
                    ExecutionContext.MarkObjectAsUntrustedForVariableAssignment(var, scope, sessionState);
                }
            }

            return(value);
        }