/// <summary>
        /// Makes a mapping of value from the script type to a host type
        /// </summary>
        /// <param name="value">The source value</param>
        /// <returns>The mapped value</returns>
        private static object MapToHostType(OriginalValue value)
        {
            if (value.IsNull)
            {
                return(null);
            }

            OriginalValueType valueType = value.ValueType;
            object            result;

            switch (valueType)
            {
            case OriginalValueType.NotExists:
            case OriginalValueType.NotExistsInObject:
            case OriginalValueType.Undefined:
                result = Undefined.Value;
                break;

            case OriginalValueType.Boolean:
            case OriginalValueType.Integer:
            case OriginalValueType.Double:
            case OriginalValueType.String:
            case OriginalValueType.Symbol:
            case OriginalValueType.Object:
            case OriginalValueType.Function:
            case OriginalValueType.Date:
            case OriginalValueType.Property:
            case OriginalValueType.SpreadOperatorResult:
                result = value.Value;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(result);
        }