コード例 #1
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static bool ToBoolean(JsValue o)
        {
            if (o.IsObject())
            {
                return true;
            }

            if (o == Undefined.Instance || o == Null.Instance)
            {
                return false;
            }
            
            if (o.IsBoolean())
            {
                return o.AsBoolean();
            }

            if (o.IsNumber())
            {
                var n = o.AsNumber();
                if (n.Equals(0) || double.IsNaN(n))
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }

            if (o.IsString())
            {
                var s = o.AsString();
                if (String.IsNullOrEmpty(s))
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }

            return true;
        }
コード例 #2
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-9.2
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static bool ToBoolean(JsValue o)
        {
            if (o.IsObject())
            {
                return(true);
            }

            if (o == Undefined.Instance || o == Null.Instance)
            {
                return(false);
            }

            if (o.IsBoolean())
            {
                return(o.AsBoolean());
            }

            if (o.IsNumber())
            {
                var n = o.AsNumber();
                if (n.Equals(0) || double.IsNaN(n))
                {
                    return(false);
                }
                else
                {
                    return(true);
                }
            }

            if (o.IsString())
            {
                var s = o.AsString();
                if (String.IsNullOrEmpty(s))
                {
                    return(false);
                }
                else
                {
                    return(true);
                }
            }

            return(true);
        }
コード例 #3
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-9.8
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static string ToString(JsValue o)
        {
            if (o == null)
            {
                return(null);
            }
            if (o.IsObject())
            {
                var p = o.AsObject() as IPrimitiveInstance;
                if (p != null)
                {
                    o = p.PrimitiveValue;
                }
            }

            if (o.IsString())
            {
                return(o.AsString());
            }

            if (o == Undefined.Instance)
            {
                return(Undefined.Text);
            }

            if (o == Null.Instance)
            {
                return(Null.Text);
            }

            if (o.IsBoolean())
            {
                return(o.AsBoolean() ? "true" : "false");
            }

            if (o.IsNumber())
            {
                return(NumberPrototype.ToNumberString(o.AsNumber()));
            }

            return(ToString(ToPrimitive(o, Types.String)));
        }
コード例 #4
0
        private static string GetValueString(JsValue jsValue, bool useLiterals)
        {
            string result;

            switch (jsValue.Type)
            {
            case Types.String:
                result = jsValue.AsString();
                break;

            case Types.Undefined:
                result = useLiterals ? "undefined" : null;
                break;

            case Types.Null:
                result = useLiterals ? "null" : null;
                break;

            case Types.Boolean:
                result = jsValue.AsBoolean().ToString();
                break;

            case Types.Number:
                result = jsValue.AsNumber().ToString();
                break;

            case Types.Object:
                result = jsValue.ToObject().ToString();
                break;

            case Types.None:
                result = string.Empty;
                break;

            default:
                result = jsValue.AsString();
                break;
            }

            return(result);
        }
コード例 #5
0
ファイル: PeriodMetric.cs プロジェクト: GrowingData/Mung
        public object UncastJsValue(JsValue value)
        {
            if (value.IsBoolean())
            {
                return(value.AsBoolean());
            }
            if (value.IsNumber())
            {
                return(value.AsNumber());
            }
            if (value.IsObject())
            {
                return(value.AsObject());
            }
            if (value.IsString())
            {
                return(value.AsString());
            }

            return(null);
        }
コード例 #6
0
ファイル: JavascriptMetric.cs プロジェクト: GrowingData/Mung
        public bool PassesFilter(string evtJson)
        {
            JsValue v = _context.ExecuteFunction("filter", new string[] { evtJson });

            if (!v.IsBoolean())
            {
                var details = string.Format(@"Error, unable to test filter for {0}, filter did not return a boolean value:
Initial script Javascript:
------
{1}
------

Message: {3}
In: {4}", Name,
                                            _context.JavaScript);

                throw new Exception(details);
            }

            return(v.AsBoolean());
        }
コード例 #7
0
ファイル: Cell.cs プロジェクト: windygu/wastedge-querier
        public void SetValue(JsValue arg)
        {
            switch (arg.Type)
            {
            case Types.Boolean:
                Cell.SetCellValue(arg.AsBoolean());
                break;

            case Types.String:
                Cell.SetCellValue(arg.AsString());
                break;

            case Types.Number:
                Cell.SetCellValue(arg.AsNumber());
                break;

            case Types.Object:
                if (arg.IsDate())
                {
                    Cell.SetCellValue(arg.AsDate().ToDateTime());
                }
                else
                {
                    double?value = arg.ConvertToDouble();
                    if (value.HasValue)
                    {
                        Cell.SetCellValue(value.Value);
                    }
                    else
                    {
                        Cell.SetCellValue((string)null);
                    }
                }
                break;

            default:
                Cell.SetCellValue((string)null);
                break;
            }
        }
コード例 #8
0
ファイル: Utils.cs プロジェクト: russlank/Jint.Ex
        public static object GetItem(this Jint.Native.Array.ArrayInstance a, int index)
        {
            JsValue l = a.Get(index.ToString());

            if (l.IsNull())
            {
                return(null);
            }
            if (l.IsNumber())
            {
                return(l.AsNumber());
            }
            if (l.IsBoolean())
            {
                return(l.AsBoolean());
            }
            if (l.IsString())
            {
                return(l.AsString());
            }
            if (l.IsNumber())
            {
                return(l.AsNumber());
            }
            if (l.IsUndefined())
            {
                return("undefined");
            }
            if (l.IsObject())
            {
                return(l.AsObject());
            }
            if (l.IsRegExp())
            {
                return(l.AsObject());
            }

            throw new ArgumentException(string.Format("Cannot deal with JsValue {0}", l));
        }
コード例 #9
0
        public static ObjectInstance ToObject(Engine engine, JsValue value)
        {
            if (value.IsObject())
            {
                return(value.AsObject());
            }

            if (value == Undefined.Instance)
            {
                //throw new JavaScriptException(engine.TypeError);
                return(null);
            }

            if (value == Null.Instance)
            {
                //throw new JavaScriptException(engine.TypeError);
                return(null);
            }

            if (value.IsBoolean())
            {
                return(engine.Boolean.Construct(value.AsBoolean()));
            }

            if (value.IsNumber())
            {
                return(engine.Number.Construct(value.AsNumber()));
            }

            if (value.IsString())
            {
                return(engine.String.Construct(value.AsString()));
            }

            throw new JavaScriptException(engine.TypeError, value + " is not a object");
        }
コード例 #10
0
ファイル: JsonMapper.cs プロジェクト: purnadika/squidex
        public static IJsonValue Map(JsValue value)
        {
            if (value == null || value.IsNull() || value.IsUndefined())
            {
                return(JsonValue.Null);
            }

            if (value.IsString())
            {
                return(JsonValue.Create(value.AsString()));
            }

            if (value.IsBoolean())
            {
                return(JsonValue.Create(value.AsBoolean()));
            }

            if (value.IsNumber())
            {
                return(JsonValue.Create(value.AsNumber()));
            }

            if (value.IsDate())
            {
                return(JsonValue.Create(value.AsDate().ToString()));
            }

            if (value.IsRegExp())
            {
                return(JsonValue.Create(value.AsRegExp().Value?.ToString()));
            }

            if (value.IsArray())
            {
                var arr = value.AsArray();

                var result = JsonValue.Array();

                for (var i = 0; i < arr.GetLength(); i++)
                {
                    result.Add(Map(arr.Get(i.ToString())));
                }

                return(result);
            }

            if (value.IsObject())
            {
                var obj = value.AsObject();

                var result = JsonValue.Object();

                foreach (var kvp in obj.GetOwnProperties())
                {
                    result[kvp.Key] = Map(kvp.Value.Value);
                }

                return(result);
            }

            throw new ArgumentException("Invalid json type.", nameof(value));
        }
コード例 #11
0
        public static bool Equal(JsValue x, JsValue y)
        {
            var typex = x.Type;
            var typey = y.Type;

            if (typex == typey)
            {
                if (typex == Types.Undefined || typex == Types.Null)
                {
                    return(true);
                }

                if (typex == Types.Number)
                {
                    var nx = TypeConverter.ToNumber(x);
                    var ny = TypeConverter.ToNumber(y);

                    if (double.IsNaN(nx) || double.IsNaN(ny))
                    {
                        return(false);
                    }

                    if (nx.Equals(ny))
                    {
                        return(true);
                    }

                    return(false);
                }

                if (typex == Types.String)
                {
                    return(TypeConverter.ToString(x) == TypeConverter.ToString(y));
                }

                if (typex == Types.Boolean)
                {
                    return(x.AsBoolean() == y.AsBoolean());
                }

                if (typex == Types.Object)
                {
                    var xObject = x.AsObject();
                    var yObject = x.AsObject();

                    // How do I check if these are CLR instances? And if so, how do I consistently get the "inner value"?
                    return(xObject == yObject);
                }

                return(x == y);
            }

            if (x == Null.Instance && y == Undefined.Instance)
            {
                return(true);
            }

            if (x == Undefined.Instance && y == Null.Instance)
            {
                return(true);
            }

            if (typex == Types.Number && typey == Types.String)
            {
                return(Equal(x, TypeConverter.ToNumber(y)));
            }

            if (typex == Types.String && typey == Types.Number)
            {
                return(Equal(TypeConverter.ToNumber(x), y));
            }

            if (typex == Types.Boolean)
            {
                return(Equal(TypeConverter.ToNumber(x), y));
            }

            if (typey == Types.Boolean)
            {
                return(Equal(x, TypeConverter.ToNumber(y)));
            }

            if (typey == Types.Object && (typex == Types.String || typex == Types.Number))
            {
                return(Equal(x, TypeConverter.ToPrimitive(y)));
            }

            if (typex == Types.Object && (typey == Types.String || typey == Types.Number))
            {
                return(Equal(TypeConverter.ToPrimitive(x), y));
            }

            return(false);
        }
コード例 #12
0
ファイル: ArrayInstance.cs プロジェクト: Shuffle-Game/jint
        /// Implementation from ObjectInstance official specs as the one 
        /// in ObjectInstance is optimized for the general case and wouldn't work 
        /// for arrays
        public override void Put(string propertyName, JsValue value, bool throwOnError)
        {
            if (!CanPut(propertyName))
            {
                if (throwOnError)
                {
                    throw new JavaScriptException(Engine.TypeError);
                }

                return;
            }
            if (InternalArray != null)
            {
                int ind;
                if (int.TryParse(propertyName, out ind))
                {
                    object val;
                    switch (value.Type)
                    {
                        case Types.Undefined:
                            val = null;
                            break;
                        case Types.Null:
                            val = null;
                            break;
                        case Types.Boolean:
                            val = value.AsBoolean();
                            break;
                        case Types.String:
                            val = value.AsString();
                            break;
                        case Types.Number:
                            val = value.AsNumber();
                            break;
                        case Types.Object:
                            val = value;
                            var ow = ((JsValue)val).AsObject() as ObjectWrapper;
                            if (ow != null)
                            {
                                val = ow.Target;
                            }
                            break;
                        default:
                            throw new ArgumentOutOfRangeException();
                    }
                    if (ind >= InternalArray.Count)
                    {
                        for (int i = InternalArray.Count; i <= ind; i++)
                        {
                            if (val != null)
                                InternalArray.Add(GetDefault(val.GetType()));
                            else
                                InternalArray.Add(null);
                        }
                    }

                    InternalArray[ind] = val;
                }
            }

            var ownDesc = GetOwnProperty(propertyName);

            if (ownDesc.IsDataDescriptor())
            {
                var valueDesc = new PropertyDescriptor(value: value, writable: null, enumerable: null, configurable: null);
                DefineOwnProperty(propertyName, valueDesc, throwOnError);
                return;
            }

            // property is an accessor or inherited
            var desc = GetProperty(propertyName);

            if (desc.IsAccessorDescriptor())
            {
                var setter = desc.Set.Value.TryCast<ICallable>();
                setter.Call(new JsValue(this), new[] { value });
            }
            else
            {
                var newDesc = new PropertyDescriptor(value, true, true, true);
                DefineOwnProperty(propertyName, newDesc, throwOnError);
            }
        }
コード例 #13
0
        private object ToBlittableValue(JsValue v, string propertyKey, bool recursiveCall)
        {
            if (v.IsBoolean())
            {
                return(v.AsBoolean());
            }

            if (v.IsString())
            {
                const string RavenDataByteArrayToBase64 = "raven-data:byte[];base64,";
                var          valueAsObject = v.ToObject();
                var          value         = valueAsObject?.ToString();
                if (value != null && value.StartsWith(RavenDataByteArrayToBase64))
                {
                    value = value.Remove(0, RavenDataByteArrayToBase64.Length);
                    var byteArray = Convert.FromBase64String(value);
                    return(Encoding.UTF8.GetString(byteArray));
                }
                return(value);
            }

            if (v.IsNumber())
            {
                var num = v.AsNumber();

                KeyValuePair <object, JsValue> property;
                if (_propertiesByValue.TryGetValue(propertyKey, out property))
                {
                    var originalValue = property.Key;
                    if (originalValue is float || originalValue is int)
                    {
                        // If the current value is exactly as the original value, we can return the original value before we made the JS conversion,
                        // which will convert a Int64 to jsFloat.
                        var jsValue = property.Value;
                        if (jsValue.IsNumber() && Math.Abs(num - jsValue.AsNumber()) < double.Epsilon)
                        {
                            return(originalValue);
                        }

                        //We might have change the type of num from Integer to long in the script by design
                        //Making sure the number isn't a real float before returning it as integer
                        if (originalValue is int && (Math.Abs(num - Math.Floor(num)) <= double.Epsilon || Math.Abs(num - Math.Ceiling(num)) <= double.Epsilon))
                        {
                            return((long)num);
                        }
                        return(num); //float
                    }
                }

                // If we don't have the type, assume that if the number ending with ".0" it actually an integer.
                var integer = Math.Truncate(num);
                if (Math.Abs(num - integer) < double.Epsilon)
                {
                    return((long)integer);
                }
                return(num);
            }
            if (v.IsNull() || v.IsUndefined())
            {
                return(null);
            }
            if (v.IsArray())
            {
                var jsArray = v.AsArray();
                var array   = new DynamicJsonArray();

                foreach (var property in jsArray.GetOwnProperties())
                {
                    if (InheritedProperties.Contains(property.Key))
                    {
                        continue;
                    }

                    var jsInstance = property.Value.Value;
                    if (!jsInstance.HasValue)
                    {
                        continue;
                    }

                    var ravenJToken = ToBlittableValue(jsInstance.Value, propertyKey + "[" + property.Key + "]", recursiveCall);
                    if (ravenJToken == null)
                    {
                        continue;
                    }

                    array.Add(ravenJToken);
                }

                return(array);
            }
            if (v.IsDate())
            {
                return(v.AsDate().ToDateTime());
            }
            if (v.IsObject())
            {
                return(ToBlittable(v.AsObject(), propertyKey, recursiveCall));
            }
            if (v.IsRegExp())
            {
                return(null);
            }

            throw new NotSupportedException(v.Type.ToString());
        }
コード例 #14
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-9.3
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static double ToNumber(JsValue o)
        {
            // check number first as this is what is usually expected
            if (o.IsNumber())
            {
                return(o.AsNumber());
            }

            if (o.IsObject())
            {
                var p = o.AsObject() as IPrimitiveInstance;
                if (p != null)
                {
                    o = p.PrimitiveValue;
                }
            }

            if (o == Undefined.Instance)
            {
                return(double.NaN);
            }

            if (o == Null.Instance)
            {
                return(0);
            }

            if (o.IsBoolean())
            {
                return(o.AsBoolean() ? 1 : 0);
            }

            if (o.IsString())
            {
                var s = StringPrototype.TrimEx(o.AsString());

                if (String.IsNullOrEmpty(s))
                {
                    return(0);
                }

                if ("+Infinity".Equals(s) || "Infinity".Equals(s))
                {
                    return(double.PositiveInfinity);
                }

                if ("-Infinity".Equals(s))
                {
                    return(double.NegativeInfinity);
                }

                // todo: use a common implementation with JavascriptParser
                try
                {
                    if (!s.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
                    {
                        var start = s[0];
                        if (start != '+' && start != '-' && start != '.' && !char.IsDigit(start))
                        {
                            return(double.NaN);
                        }

                        double n = Double.Parse(s,
                                                NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign |
                                                NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite |
                                                NumberStyles.AllowExponent, CultureInfo.InvariantCulture);
                        if (s.StartsWith("-") && n.Equals(0))
                        {
                            return(-0.0);
                        }

                        return(n);
                    }

                    int i = int.Parse(s.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);

                    return(i);
                }
                catch (OverflowException)
                {
                    return(s.StartsWith("-") ? double.NegativeInfinity : double.PositiveInfinity);
                }
                catch
                {
                    return(double.NaN);
                }
            }

            return(ToNumber(ToPrimitive(o, Types.Number)));
        }
コード例 #15
0
        private RavenJToken ToRavenJToken(JsValue v, string propertyKey, bool recursiveCall)
        {
            if (v.IsBoolean())
            {
                return(new RavenJValue(v.AsBoolean()));
            }
            if (v.IsString())
            {
                const string RavenDataByteArrayToBase64 = "raven-data:byte[];base64,";
                var          valueAsObject = v.ToObject();
                var          value         = valueAsObject != null?valueAsObject.ToString() : null;

                if (value != null && value.StartsWith(RavenDataByteArrayToBase64))
                {
                    value = value.Remove(0, RavenDataByteArrayToBase64.Length);
                    var byteArray = Convert.FromBase64String(value);
                    return(new RavenJValue(byteArray));
                }
                return(new RavenJValue(value));
            }
            if (v.IsNumber())
            {
                var num = v.AsNumber();

                KeyValuePair <RavenJValue, JsValue> property;
                if (propertiesByValue.TryGetValue(propertyKey, out property))
                {
                    var originalValue = property.Key;
                    if (originalValue.Type == JTokenType.Float ||
                        originalValue.Type == JTokenType.Integer)
                    {
                        // If the current value is exactly as the original value, we can return the original value before we made the JS conversion,
                        // which will convert a Int64 to jsFloat.
                        var originalJsValue = property.Value;
                        if (originalJsValue.IsNumber() && Math.Abs(num - originalJsValue.AsNumber()) < double.Epsilon)
                        {
                            return(originalValue);
                        }

                        if (originalValue.Type == JTokenType.Integer)
                        {
                            return(new RavenJValue((long)num));
                        }
                        return(new RavenJValue(num));//float
                    }
                }

                // If we don't have the type, assume that if the number ending with ".0" it actually an integer.
                var integer = Math.Truncate(num);
                if (Math.Abs(num - integer) < double.Epsilon)
                {
                    return(new RavenJValue((long)integer));
                }
                return(new RavenJValue(num));
            }
            if (v.IsNull())
            {
                return(RavenJValue.Null);
            }
            if (v.IsUndefined())
            {
                return(RavenJValue.Null);
            }
            if (v.IsArray())
            {
                var jsArray = v.AsArray();
                var rja     = new RavenJArray();

                foreach (var property in jsArray.Properties)
                {
                    if (property.Key == "length")
                    {
                        continue;
                    }

                    var jsInstance = property.Value.Value;
                    if (!jsInstance.HasValue)
                    {
                        continue;
                    }

                    var ravenJToken = ToRavenJToken(jsInstance.Value, propertyKey + "[" + property.Key + "]", recursiveCall);
                    if (ravenJToken == null)
                    {
                        continue;
                    }

                    rja.Add(ravenJToken);
                }

                return(rja);
            }
            if (v.IsObject())
            {
                return(ToRavenJObject(v, propertyKey, recursiveCall));
            }
            if (v.IsRegExp())
            {
                return(null);
            }

            throw new NotSupportedException(v.Type.ToString());
        }
コード例 #16
0
 public static JsValue LogicalNot(JsValue val)
 {
     return(new JsBoolean(!val.AsBoolean().Value));
 }
コード例 #17
0
        public static ObjectInstance ToObject(Engine engine, JsValue value)
        {
            if (value.IsObject())
            {
                return value.AsObject();
            }

            if (value == Undefined.Instance)
            {
                throw new JavaScriptException(engine.TypeError);
            }

            if (value == Null.Instance)
            {
                throw new JavaScriptException(engine.TypeError);
            }

            if (value.IsBoolean())
            {
                return engine.Boolean.Construct(value.AsBoolean());
            }

            if (value.IsNumber())
            {
                return engine.Number.Construct(value.AsNumber());
            }

            if (value.IsString())
            {
                return engine.String.Construct(value.AsString());
            }

            throw new JavaScriptException(engine.TypeError);
        }
コード例 #18
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-9.8
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static string ToString(JsValue o)
        {
            if (o.IsObject())
            {
                var p = o.AsObject() as IPrimitiveInstance;
                if (p != null)
                {
                    o = p.PrimitiveValue;
                }
            }

            if (o.IsString())
            {
                return o.AsString();
            }

            if (o == Undefined.Instance)
            {
                return Undefined.Text;
            }

            if (o == Null.Instance)
            {
                return Null.Text;
            }
            
            if (o.IsBoolean())
            {
                return o.AsBoolean() ? "true" : "false";
            }

            if (o.IsNumber())
            {
                return NumberPrototype.ToNumberString(o.AsNumber());
            }

            return ToString(ToPrimitive(o, Types.String));
        }
コード例 #19
0
        /// <summary>
        /// http://www.ecma-international.org/ecma-262/5.1/#sec-9.3
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static double ToNumber(JsValue o)
        {
            // check number first as this is what is usually expected
            if (o.IsNumber())
            {
                return o.AsNumber();
            } 
            
            if (o.IsObject())
            {
                var p = o.AsObject() as IPrimitiveInstance;
                if (p != null)
                {
                    o = p.PrimitiveValue;
                }
            }

            if (o == Undefined.Instance)
            {
                return double.NaN;
            }

            if (o == Null.Instance)
            {
                return 0;
            }

            if (o.IsBoolean())
            {
                return o.AsBoolean() ? 1 : 0;
            }

            if (o.IsString())
            {
                var s = o.AsString().Trim();

                if (String.IsNullOrEmpty(s))
                {
                    return 0;
                }

                if ("+Infinity".Equals(s) || "Infinity".Equals(s))
                {
                    return double.PositiveInfinity;
                }

                if ("-Infinity".Equals(s))
                {
                    return double.NegativeInfinity;
                }

                // todo: use a common implementation with JavascriptParser
                try
                {
                    if (!s.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
                    {
                        var start = s[0];
                        if (start != '+' && start != '-' && start != '.' && !char.IsDigit(start))
                        {
                            return double.NaN;
                        }

                        double n = Double.Parse(s,
                            NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign |
                            NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite |
                            NumberStyles.AllowExponent, CultureInfo.InvariantCulture);
                        if (s.StartsWith("-") && n.Equals(0))
                        {
                            return -0.0;
                        }

                        return n;
                    }

                    int i = int.Parse(s.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
                 
                    return i;
                }
                catch (OverflowException)
                {
                    return s.StartsWith("-") ? double.NegativeInfinity : double.PositiveInfinity;
                }
                catch
                {
                    return double.NaN;
                }
            }

            return ToNumber(ToPrimitive(o, Types.Number));
        }
コード例 #20
0
ファイル: frmDebugger.cs プロジェクト: ringls/JintDebugger
        private LocalVariable GetLocalVariableJS(string key, JsValue value)
        {
            var result = new LocalVariable()
            {
                Name = key, TypeName = value.Type.ToString()
            };

            if (value.IsArray())
            {
                var trueValue = value.AsArray();
                if (trueValue.GetLength() > 0)
                {
                    var props = trueValue.GetOwnProperties();
                    foreach (var item in props)
                    {
                        var ch = GetLocalVariableJS(item.Key, item.Value.Value);
                        result.Children.Add(ch);
                    }
                }
                //result.Value=trueValue.
            }
            else if (value.IsBoolean())
            {
                var trueValue = value.AsBoolean();
                result.Value = trueValue.ToString();
            }
            else if (value.IsDate())
            {
                var trueValue = value.AsDate();
                result.Value = trueValue.ToDateTime().ToString("yyyy-MM-dd HH:mm:ss");
            }
            else if (value.IsNumber())
            {
                var trueValue = value.AsNumber();
                result.Value = trueValue.ToString();
            }
            else if (value.IsString())
            {
                var trueValue = value.AsString();
                result.Value = trueValue;
            }
            else if (value.IsObject())
            {
                var trueValue = value.AsObject();
                //判断对象是否原生JS
                if (trueValue.GetType().Name == "ObjectInstance")
                {
                    var props = trueValue.GetOwnProperties();
                    foreach (var item in props)
                    {
                        var ch = GetLocalVariableJS(item.Key, item.Value.Value);
                        result.Children.Add(ch);
                    }
                }
                else
                {
                    var csharpValue = value.ToObject();
                    if (csharpValue != null)
                    {
                        //只处理DapperRow
                        result = GetLocalVariableCSharp(key, csharpValue);
                        //csharpValue.
                    }
                }
            }
            return(result);
        }
コード例 #21
0
ファイル: DomConverter.cs プロジェクト: veersamrat/Optimus
 public static bool ConvertToBool(JsValue value) =>
 value.IsBoolean() ? value.AsBoolean()
                 : value.IsNumber() ? (int)value.AsNumber() != 0
                 : !value.IsNull() && !value.IsUndefined();
コード例 #22
0
ファイル: ExpressionIntepreter.cs プロジェクト: yzhou88/jint
        public static bool Equal(JsValue x, JsValue y)
        {
            var typex = x.Type;
            var typey = y.Type;

            if (typex == typey)
            {
                if (typex == Types.Undefined || typex == Types.Null)
                {
                    return(true);
                }

                if (typex == Types.Number)
                {
                    var nx = TypeConverter.ToNumber(x);
                    var ny = TypeConverter.ToNumber(y);

                    if (double.IsNaN(nx) || double.IsNaN(ny))
                    {
                        return(false);
                    }

                    if (nx.Equals(ny))
                    {
                        return(true);
                    }

                    return(false);
                }

                if (typex == Types.String)
                {
                    return(TypeConverter.ToString(x) == TypeConverter.ToString(y));
                }

                if (typex == Types.Boolean)
                {
                    return(x.AsBoolean() == y.AsBoolean());
                }

                return(x == y);
            }

            if (x == Null.Instance && y == Undefined.Instance)
            {
                return(true);
            }

            if (x == Undefined.Instance && y == Null.Instance)
            {
                return(true);
            }

            if (typex == Types.Number && typey == Types.String)
            {
                return(Equal(x, TypeConverter.ToNumber(y)));
            }

            if (typex == Types.String && typey == Types.Number)
            {
                return(Equal(TypeConverter.ToNumber(x), y));
            }

            if (typex == Types.Boolean)
            {
                return(Equal(TypeConverter.ToNumber(x), y));
            }

            if (typey == Types.Boolean)
            {
                return(Equal(x, TypeConverter.ToNumber(y)));
            }

            if (typey == Types.Object && (typex == Types.String || typex == Types.Number))
            {
                return(Equal(x, TypeConverter.ToPrimitive(y)));
            }

            if (typex == Types.Object && (typey == Types.String || typey == Types.Number))
            {
                return(Equal(TypeConverter.ToPrimitive(x), y));
            }

            return(false);
        }
コード例 #23
0
ファイル: DomConverter.cs プロジェクト: veersamrat/Optimus
 public static bool?ConvertToBoolOption(JsValue value) =>
 value.IsBoolean() ? value.AsBoolean()
                 : value.IsNumber() ? (int)value.AsNumber() != 0
                 : (value.IsNull() || value.IsUndefined()) ? (bool?)null : true;
コード例 #24
0
        public static bool StrictlyEqual(JsValue x, JsValue y)
        {
            var typea = x.Type;
            var typeb = y.Type;

            if (typea != typeb)
            {
                return(false);
            }

            if (typea == Types.Undefined || typea == Types.Null)
            {
                return(true);
            }

            if (typea == Types.None)
            {
                return(true);
            }

            if (typea == Types.Number)
            {
                var nx = x.AsNumber();
                var ny = y.AsNumber();

                if (double.IsNaN(nx) || double.IsNaN(ny))
                {
                    return(false);
                }

                if (nx.Equals(ny))
                {
                    return(true);
                }

                return(false);
            }

            if (typea == Types.String)
            {
                return(x.AsString() == y.AsString());
            }

            if (typea == Types.Boolean)
            {
                return(x.AsBoolean() == y.AsBoolean());
            }

            if (typea == Types.Object)
            {
                var xw = x.AsObject() as IObjectWrapper;

                if (xw != null)
                {
                    var yw = y.AsObject() as IObjectWrapper;
                    return(Object.Equals(xw.Target, yw.Target));
                }
            }

            return(x == y);
        }
コード例 #25
0
ファイル: DomConverter.cs プロジェクト: veersamrat/Optimus
        public object ConvertToObject(JsValue jsValue, Type targetType)
        {
            if (jsValue == _getEngine().Global)
            {
                return(_global);
            }

            if (jsValue.IsUndefined())
            {
                return(null);
            }

            if (jsValue.IsObject())
            {
                var obj = jsValue.AsObject();

                if (targetType == typeof(string))
                {
                    return(obj.ToString());
                }

                switch (obj)
                {
                case ClrObject clr:
                    return(clr.Target);

                case ObjectInstance objInst:
                    return(GetCreator(targetType)(objInst));
                }

                return(jsValue);
            }

            if (jsValue.IsBoolean())
            {
                var boolVal = jsValue.AsBoolean();
                if (targetType == typeof(string))
                {
                    return(boolVal ? "true" : "false");
                }

                return(boolVal);
            }


            if (jsValue.IsString())
            {
                return(jsValue.AsString());
            }

            if (jsValue.IsNumber())
            {
                var dbl = jsValue.AsNumber();

                if (targetType == typeof(sbyte))
                {
                    return((sbyte)dbl);
                }
                if (targetType == typeof(byte))
                {
                    return((byte)dbl);
                }
                if (targetType == typeof(int))
                {
                    return((int)dbl);
                }
                if (targetType == typeof(uint))
                {
                    return((uint)dbl);
                }
                if (targetType == typeof(short))
                {
                    return((short)dbl);
                }
                if (targetType == typeof(ushort))
                {
                    return((ushort)dbl);
                }
                if (targetType == typeof(long))
                {
                    return((long)dbl);
                }
                if (targetType == typeof(ulong))
                {
                    return((ulong)dbl);
                }
                if (targetType == typeof(float))
                {
                    return((float)dbl);
                }
                if (targetType == typeof(string))
                {
                    return(dbl.ToString(CultureInfo.InvariantCulture));
                }

                return(dbl);
            }


            return(null);
        }
コード例 #26
0
ファイル: PropertyAccessor.cs プロジェクト: yitaom2/ravendb
        private static object GetValue(JsValue jsValue)
        {
            if (jsValue.IsNull())
            {
                return(null);
            }
            if (jsValue.IsString())
            {
                return(jsValue.AsString());
            }
            if (jsValue.IsBoolean())
            {
                return(jsValue.AsBoolean());
            }
            if (jsValue.IsNumber())
            {
                return(jsValue.AsNumber());
            }
            if (jsValue.IsDate())
            {
                return(jsValue.AsDate());
            }
            if (jsValue is ObjectWrapper ow)
            {
                var target = ow.Target;
                switch (target)
                {
                case LazyStringValue lsv:
                    return(lsv);

                case LazyCompressedStringValue lcsv:
                    return(lcsv);

                case LazyNumberValue lnv:
                    return(lnv);    //should be already blittable supported type.
                }
                ThrowInvalidObject(jsValue);
            }
            else if (jsValue.IsArray())
            {
                var arr   = jsValue.AsArray();
                var array = new object[arr.GetLength()];
                var i     = 0;
                foreach ((var key, var val) in arr.GetOwnProperties())
                {
                    if (key == "length")
                    {
                        continue;
                    }

                    array[i++] = GetValue(val.Value);
                }

                return(array);
            }
            else if (jsValue.IsObject())
            {
                return(jsValue.AsObject());
            }
            if (jsValue.IsUndefined())
            {
                return(null);
            }

            ThrowInvalidObject(jsValue);
            return(null);
        }
コード例 #27
0
        public static bool Equal(JsValue x, JsValue y)
        {
            var typex = x.Type;
            var typey = y.Type;

            if (typex == typey)
            {
                if (typex == Types.Undefined || typex == Types.Null)
                {
                    return true;
                }

                if (typex == Types.Number)
                {
                    var nx = TypeConverter.ToNumber(x);
                    var ny = TypeConverter.ToNumber(y);

                    if (double.IsNaN(nx) || double.IsNaN(ny))
                    {
                        return false;
                    }

                    if (nx.Equals(ny))
                    {
                        return true;
                    }

                    return false;
                }

                if (typex == Types.String)
                {
                    return TypeConverter.ToString(x) == TypeConverter.ToString(y);
                }

                if (typex == Types.Boolean)
                {
                    return x.AsBoolean() == y.AsBoolean();
                }

                return x == y;
            }

            if (x == Null.Instance && y == Undefined.Instance)
            {
                return true;
            }

            if (x == Undefined.Instance && y == Null.Instance)
            {
                return true;
            }

            if (typex == Types.Number && typey == Types.String)
            {
                return Equal(x, TypeConverter.ToNumber(y));
            }

            if (typex == Types.String && typey == Types.Number)
            {
                return Equal(TypeConverter.ToNumber(x), y);
            }

            if (typex == Types.Boolean)
            {
                return Equal(TypeConverter.ToNumber(x), y);
            }

            if (typey == Types.Boolean)
            {
                return Equal(x, TypeConverter.ToNumber(y));
            }

            if (typey == Types.Object && (typex == Types.String || typex == Types.Number))
            {
                return Equal(x, TypeConverter.ToPrimitive(y));
            }

            if (typex == Types.Object && (typey == Types.String || typey == Types.Number))
            {
                return Equal(TypeConverter.ToPrimitive(x), y);
            }

            return false;
        }
コード例 #28
0
ファイル: JsonMapper.cs プロジェクト: vtan31/squidex
        public static JToken Map(JsValue value)
        {
            if (value == null || value.IsNull())
            {
                return(JValue.CreateNull());
            }

            if (value.IsUndefined())
            {
                return(JValue.CreateUndefined());
            }

            if (value.IsString())
            {
                return(new JValue(value.AsString()));
            }

            if (value.IsBoolean())
            {
                return(new JValue(value.AsBoolean()));
            }

            if (value.IsNumber())
            {
                return(new JValue(value.AsNumber()));
            }

            if (value.IsDate())
            {
                return(new JValue(value.AsDate().ToDateTime()));
            }

            if (value.IsRegExp())
            {
                return(JValue.CreateString(value.AsRegExp().Value?.ToString()));
            }

            if (value.IsArray())
            {
                var arr = value.AsArray();

                var target = new JArray();

                for (var i = 0; i < arr.GetLength(); i++)
                {
                    target.Add(Map(arr.Get(i.ToString())));
                }

                return(target);
            }

            if (value.IsObject())
            {
                var obj = value.AsObject();

                var target = new JObject();

                foreach (var kvp in obj.GetOwnProperties())
                {
                    target[kvp.Key] = Map(kvp.Value.Value);
                }

                return(target);
            }

            throw new ArgumentException("Invalid json type.", nameof(value));
        }
コード例 #29
0
        /// Implementation from ObjectInstance official specs as the one
        /// in ObjectInstance is optimized for the general case and wouldn't work
        /// for arrays
        public override void Put(string propertyName, JsValue value, bool throwOnError)
        {
            if (!CanPut(propertyName))
            {
                if (throwOnError)
                {
                    throw new JavaScriptException(Engine.TypeError);
                }

                return;
            }
            if (InternalArray != null)
            {
                int ind;
                if (int.TryParse(propertyName, out ind))
                {
                    object val;
                    switch (value.Type)
                    {
                    case Types.Undefined:
                        val = null;
                        break;

                    case Types.Null:
                        val = null;
                        break;

                    case Types.Boolean:
                        val = value.AsBoolean();
                        break;

                    case Types.String:
                        val = value.AsString();
                        break;

                    case Types.Number:
                        val = value.AsNumber();
                        break;

                    case Types.Object:
                        val = value;
                        var ow = ((JsValue)val).AsObject() as ObjectWrapper;
                        if (ow != null)
                        {
                            val = ow.Target;
                        }
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                    if (ind >= InternalArray.Count)
                    {
                        for (int i = InternalArray.Count; i <= ind; i++)
                        {
                            if (val != null)
                            {
                                InternalArray.Add(GetDefault(val.GetType()));
                            }
                            else
                            {
                                InternalArray.Add(null);
                            }
                        }
                    }

                    InternalArray[ind] = val;
                }
            }


            var ownDesc = GetOwnProperty(propertyName);

            if (ownDesc.IsDataDescriptor())
            {
                var valueDesc = new PropertyDescriptor(value: value, writable: null, enumerable: null, configurable: null);
                DefineOwnProperty(propertyName, valueDesc, throwOnError);
                return;
            }

            // property is an accessor or inherited
            var desc = GetProperty(propertyName);

            if (desc.IsAccessorDescriptor())
            {
                var setter = desc.Set.Value.TryCast <ICallable>();
                setter.Call(new JsValue(this), new[] { value });
            }
            else
            {
                var newDesc = new PropertyDescriptor(value, true, true, true);
                DefineOwnProperty(propertyName, newDesc, throwOnError);
            }
        }