Пример #1
0
        private bool TryGetErrorProperty <T>(JavaScriptValueSafeHandle error, string propertyName, out T value)
        {
            JsErrorCode innerError;

            innerError = LibChakraCore.JsCreatePropertyId(propertyName, (ulong)propertyName.Length, out JavaScriptPropertyIdSafeHandle propertyHandle);
            innerError = LibChakraCore.JsHasProperty(error, propertyHandle, out bool hasProperty);

            if (hasProperty == true)
            {
                innerError = LibChakraCore.JsGetProperty(error, propertyHandle, out JavaScriptValueSafeHandle propertyValue);
                innerError = LibChakraCore.JsGetValueType(propertyValue, out JsValueType propertyType);
                switch (propertyType)
                {
                case JsValueType.Number:
                    innerError = LibChakraCore.JsNumberToDouble(propertyValue, out double doubleValue);
                    value      = (T)Convert.ChangeType(doubleValue, typeof(T));
                    return(true);

                case JsValueType.String:
                    var strValue = Helpers.GetStringUtf8(propertyValue, releaseHandle: true);
                    value = (T)Convert.ChangeType(strValue, typeof(T));
                    return(true);

                default:
                    value = default(T);
                    return(false);
                }
            }

            value = default(T);
            return(false);
        }
Пример #2
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="JsScriptException"/> class.
        /// </summary>
        /// <param name="code">The error code returned.</param>
        /// <param name="error">The JavaScript error object.</param>
        /// <param name="message">The error message.</param>
        public JsScriptException(JsErrorCode code, JavaScriptValueSafeHandle error, string message) :
            base(code, message)
        {
            m_error   = error;
            m_message = message;

            //Don't use our helper errors class in order to prevent recursive errors.
            JsErrorCode innerError;

            //Get the error object type
            innerError = LibChakraCore.JsGetValueType(error, out JsValueType errorType);

            switch (errorType)
            {
            case JsValueType.Object:
                if (TryGetErrorProperty(error, ColumnNumberPropertyName, out int metadataColumnValue))
                {
                    ColumnNumber = metadataColumnValue;
                }

                if (TryGetErrorProperty(error, LineNumberPropertyName, out int metadataLineValue))
                {
                    LineNumber = metadataLineValue;
                }
                if (TryGetErrorProperty(error, "source", out string metadataScriptSourceValue))
                {
                    ScriptSource = metadataScriptSourceValue;
                }
                if (TryGetErrorProperty(error, "url", out string metadataUrlValue))
                {
                    Name = metadataUrlValue;
                }
                break;

            case JsValueType.Error:
                //Get the message of the Script Error.
                if (TryGetErrorProperty(error, MessagePropertyName, out string errrorMessageValue))
                {
                    m_message = errrorMessageValue;
                }

                if (TryGetErrorProperty(error, ColumnNumberPropertyName, out int errorColumnValue))
                {
                    ColumnNumber = errorColumnValue;
                }

                if (TryGetErrorProperty(error, LineNumberPropertyName, out int errorLineValue))
                {
                    LineNumber = errorLineValue;
                }

                if (TryGetErrorProperty(error, NamePropertyName, out string errorNameValue))
                {
                    Name = errorNameValue;
                }

                break;

            case JsValueType.String:
                m_message = Helpers.GetStringUtf8(error);
                break;
            }
        }