/// <summary>
        /// Creates a new declarative scope for use inside a function body.
        /// </summary>
        /// <param name="parentScope"> A reference to the parent scope.  Can not be <c>null</c>. </param>
        /// <param name="functionName"> The name of the function.  Can be empty for an anonymous function. </param>
        /// <param name="argumentNames"> The names of each of the function arguments. </param>
        /// <returns> A new DeclarativeScope instance. </returns>
        internal static DeclarativeScope CreateFunctionScope(Scope parentScope, string functionName, IEnumerable <string> argumentNames)
        {
            if (parentScope == null)
            {
                throw new ArgumentNullException("parentScope", @"Function scopes must have a parent scope.");
            }
            if (functionName == null)
            {
                throw new ArgumentNullException("functionName");
            }
            if (argumentNames == null)
            {
                throw new ArgumentNullException("argumentNames");
            }
            var result = new DeclarativeScope(parentScope, 0);

            if (string.IsNullOrEmpty(functionName) == false)
            {
                result.DeclareVariable(functionName, null, true, false);
            }
            result.DeclareVariable("this", null, true, false);
            result.DeclareVariable("arguments", null, true, false);
            foreach (var argumentName in argumentNames)
            {
                result.DeclareVariable(argumentName, null, true, false);
            }
            return(result);
        }
        /// <summary>
        /// Creates a new declarative scope for use inside a catch statement.
        /// </summary>
        /// <param name="parentScope"> A reference to the parent scope.  Can not be <c>null</c>. </param>
        /// <param name="catchVariableName"> The name of the catch variable. </param>
        /// <returns> A new DeclarativeScope instance. </returns>
        internal static DeclarativeScope CreateCatchScope(Scope parentScope, string catchVariableName)
        {
            if (parentScope == null)
            {
                throw new ArgumentNullException("parentScope", @"Catch scopes must have a parent scope.");
            }
            if (catchVariableName == null)
            {
                throw new ArgumentNullException("catchVariableName");
            }
            var result = new DeclarativeScope(parentScope, 0);

            result.DeclareVariable(catchVariableName, null, true, false);
            result.CanDeclareVariables = false; // Only the catch variable can be declared in this scope.
            return(result);
        }
        /// <summary>
        /// Creates a new declarative scope for use at runtime.
        /// </summary>
        /// <param name="parentScope"> A reference to the parent scope.  Can not be <c>null</c>. </param>
        /// <param name="declaredVariableNames"> The names of variables that were declared in this scope. </param>
        /// <returns> A new DeclarativeScope instance. </returns>
        public static DeclarativeScope CreateRuntimeScope(Scope parentScope, string[] declaredVariableNames)
        {
            if (parentScope == null)
            {
                throw new ArgumentNullException("parentScope", @"Function scopes must have a parent scope.");
            }
            if (declaredVariableNames == null)
            {
                throw new ArgumentNullException("declaredVariableNames");
            }
            var result = new DeclarativeScope(parentScope, declaredVariableNames.Length);

            foreach (string variableName in declaredVariableNames)
            {
                result.DeclareVariable(variableName, null, true, false);
            }
            result.m_values = new object[result.DeclaredVariableCount];
            return(result);
        }