Exemple #1
0
        private static IDynamic IndexOf(IEnvironment environment, IArgs args)
        {
            var obj    = environment.Context.ThisBinding.ConvertToObject();
            var length = (uint)obj.Get("length").ConvertToUInt32().BaseValue;

            if (length == 0)
            {
                return(environment.CreateNumber(-1));
            }

            var searchElement = args[0];
            var fromIndex     = (uint)Math.Max(Math.Floor(args[1].ConvertToNumber().BaseValue), 0D);

            if (fromIndex >= length)
            {
                return(environment.CreateNumber(-1));
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    if (obj.Get(key).Op_StrictEquals(searchElement).ConvertToBoolean().BaseValue)
                    {
                        return(environment.CreateNumber(i));
                    }
                }
            }

            return(environment.CreateNumber(-1));
        }
Exemple #2
0
        IDynamic Search(IEnvironment environment, IArgs args)
        {
            var o = environment.Context.ThisBinding;

            environment.CheckObjectCoercible(o);
            var s         = o.ConvertToString().BaseValue;
            var regexpArg = args[0];
            var regexpObj = regexpArg as NRegExp;

            if (regexpObj == null)
            {
                var constructor = (IConstructable)environment.RegExpConstructor;
                var pattern     = regexpArg.ConvertToString();
                regexpObj = (NRegExp)constructor.Construct(environment, environment.CreateArgs(new [] { pattern }));
            }
            var regExp = regexpObj.RegExpMatcher;
            var index  = 0;

            do
            {
                var result = regExp(s, index);
                if (result.success)
                {
                    return(environment.CreateNumber(index));
                }
            } while (++index < s.Length);
            return(environment.CreateNumber(-1));
        }
Exemple #3
0
        internal static IDynamic Min(IEnvironment environment, IArgs args)
        {
            if (args.IsEmpty)
            {
                return(environment.CreateNumber(double.PositiveInfinity));
            }
            if (args.Count == 1)
            {
                return(args[0].ConvertToNumber());
            }

            var numbers = new INumber[args.Count];

            for (int i = 0; i < numbers.Length; i++)
            {
                var number = args[i].ConvertToNumber();
                if (double.IsNaN(number.BaseValue))
                {
                    return(environment.CreateNumber(double.NaN));
                }
                numbers[i] = number;
            }

            INumber r = null;

            foreach (var n in numbers)
            {
                if (r == null || r.Op_Greaterthan(n).ConvertToBoolean().BaseValue)
                {
                    r = n;
                }
            }
            return(r);
        }
Exemple #4
0
        public IDynamic Op_PrefixIncrement()
        {
            StrictReferenceCondition();
            var oldNum = Value.ConvertToNumber();
            var newNum = _environment.CreateNumber(oldNum.BaseValue + 1.0);

            Value = newNum;
            return(newNum);
        }
Exemple #5
0
 internal static IDynamic Abs(IEnvironment environment, IArgs args)
 {
     double x = args[0].ConvertToNumber().BaseValue;
     if (double.IsNaN(x))
         return environment.CreateNumber(double.NaN);
     if (IsNegativeZero(x))
         return environment.CreateNumber(0.0);
     if (double.IsNegativeInfinity(x))
         return environment.CreateNumber(double.PositiveInfinity);
     return environment.CreateNumber(Math.Abs(x));
 }
Exemple #6
0
        IDynamic Exec(IEnvironment environment, IArgs args)
        {
            var         r          = (NRegExp)environment.Context.ThisBinding;
            var         s          = args[0].ConvertToString().BaseValue;
            var         length     = s.Length;
            var         global     = r.Get("global").ConvertToBoolean().BaseValue;
            var         i          = !global ? 0 : (int)r.Get("lastIndex").ConvertToInteger().BaseValue;
            int         beginIndex = 0;
            MatchResult result;

            while (true)
            {
                beginIndex = i;
                if (i < 0 || i > length)
                {
                    r.Put("length", environment.CreateNumber(0.0), true);
                    return(environment.Null);
                }
                result = r.RegExpMatcher(s, i);
                if (result.success)
                {
                    break;
                }
                i++;
            }

            if (global)
            {
                r.Put("length", environment.CreateNumber(result.matchState.endIndex), true);
            }

            var captures = result.matchState.captures;
            var n        = captures.Length;
            var array    = ((IConstructable)environment.ArrayConstructor).Construct(environment, environment.EmptyArgs);

            array.DefineOwnProperty("index", environment.CreateDataDescriptor(environment.CreateNumber(beginIndex), true, true, true), true);
            array.DefineOwnProperty("input", environment.CreateDataDescriptor(environment.CreateString(s), true, true, true), true);
            array.DefineOwnProperty("length", environment.CreateDataDescriptor(environment.CreateNumber(n + 1), null, null, null), true);

            IDynamic value = environment.CreateString(result.matchState.input.Substring(beginIndex, result.matchState.endIndex - beginIndex));
            var      desc  = environment.CreateDataDescriptor(value, true, true, true);

            array.DefineOwnProperty("0", desc, true);

            for (int index = 0; index < n; index++)
            {
                var v = captures[index];
                value = v == null ? (IDynamic)environment.Undefined : (IDynamic)environment.CreateString(v);
                desc  = environment.CreateDataDescriptor(value, true, true, true);
                array.DefineOwnProperty((index + 1).ToString(), desc, true);
            }

            return(array);
        }
Exemple #7
0
        internal static IDynamic Execute(IEnvironment environment, Func <double, double> func)
        {
            var time = GetTimeValue(environment);

            if (double.IsNaN(time))
            {
                return(environment.CreateNumber(double.NaN));
            }
            else
            {
                return(environment.CreateNumber(func(time)));
            }
        }
Exemple #8
0
 internal static IDynamic Acos(IEnvironment environment, IArgs args)
 {
     double x = args[0].ConvertToNumber().BaseValue;
     if (double.IsNaN(x))
         return environment.CreateNumber(double.NaN);
     if (x > 1.0)
         return environment.CreateNumber(double.NaN);
     if (x < -1.0)
         return environment.CreateNumber(double.NaN);
     if (x == 1.0)
         return environment.CreateNumber(0.0);
     return environment.CreateNumber(Math.Acos(x));
 }
Exemple #9
0
        IDynamic Exec(IEnvironment environment, IArgs args)
        {
            var r = (NRegExp)environment.Context.ThisBinding;
            var s = args[0].ConvertToString().BaseValue;
            var length = s.Length;
            var global = r.Get("global").ConvertToBoolean().BaseValue;
            var i = !global ? 0 : (int)r.Get("lastIndex").ConvertToInteger().BaseValue;
            int beginIndex = 0;
            MatchResult result;

            while (true)
            {
                beginIndex = i;
                if (i < 0 || i > length)
                {
                    r.Put("length", environment.CreateNumber(0.0), true);
                    return environment.Null;
                }
                result = r.RegExpMatcher(s, i);
                if (result.success) break;
                i++;
            }

            if (global)
            {
                r.Put("length", environment.CreateNumber(result.matchState.endIndex), true);
            }

            var captures = result.matchState.captures;
            var n = captures.Length;
            var array = ((IConstructable)environment.ArrayConstructor).Construct(environment, environment.EmptyArgs);

            array.DefineOwnProperty("index", environment.CreateDataDescriptor(environment.CreateNumber(beginIndex), true, true, true), true);
            array.DefineOwnProperty("input", environment.CreateDataDescriptor(environment.CreateString(s), true, true, true), true);
            array.DefineOwnProperty("length", environment.CreateDataDescriptor(environment.CreateNumber(n + 1), null, null, null), true);

            IDynamic value = environment.CreateString(result.matchState.input.Substring(beginIndex, result.matchState.endIndex - beginIndex));
            var desc = environment.CreateDataDescriptor(value, true, true, true);
            array.DefineOwnProperty("0", desc, true);

            for (int index = 0; index < n; index++)
            {
                var v = captures[index];
                value = v == null ? (IDynamic)environment.Undefined : (IDynamic)environment.CreateString(v);
                desc = environment.CreateDataDescriptor(value, true, true, true);
                array.DefineOwnProperty((index + 1).ToString(), desc, true);
            }

            return array;
        }
Exemple #10
0
        IDynamic CharCodeAt(IEnvironment environment, IArgs args)
        {
            var o = environment.Context.ThisBinding;

            environment.CheckObjectCoercible(o);
            var s        = o.ConvertToString().BaseValue;
            var position = (int)args[0].ConvertToInteger().BaseValue;

            if (position < 0 || position >= s.Length)
            {
                return(environment.CreateNumber(double.NaN));
            }
            return(environment.CreateNumber((double)s[position]));
        }
Exemple #11
0
        internal static IDynamic Tan(IEnvironment environment, IArgs args)
        {
            double x = args[0].ConvertToNumber().BaseValue;

            if (double.IsNaN(x) || double.IsInfinity(x))
            {
                return(environment.CreateNumber(double.NaN));
            }
            if (x == 0.0)
            {
                return(environment.CreateNumber(x));
            }
            return(environment.CreateNumber(Math.Tan(x)));
        }
Exemple #12
0
        internal static IDynamic Parse(IEnvironment environment, IArgs args)
        {
            var s = args[0].ConvertToString().BaseValue;

            DateTime result;

            if (!DateTime.TryParseExact(s, _startingDateFormats, _format, _styles, out result))
            {
                if (!DateTime.TryParse(s, _format, _styles, out result))
                {
                    return(environment.CreateNumber(double.NaN));
                }
            }
            return(environment.CreateNumber((result.ToUniversalTime() - _utcStart).TotalMilliseconds));
        }
Exemple #13
0
        private static IDynamic Push(IEnvironment environment, IArgs args)
        {
            var obj    = environment.Context.ThisBinding.ConvertToObject();
            var length = obj.Get("length").ConvertToUInt32().BaseValue;

            if (args.Count > 0)
            {
                for (int i = 0; i < args.Count; i++, length++)
                {
                    obj.Put(length.ToString(), args[i], true);
                }
                obj.Put("length", environment.CreateNumber(length), true);
            }
            return(environment.CreateNumber(length));
        }
Exemple #14
0
        private static IDynamic ForEach(IEnvironment environment, IArgs args)
        {
            var obj        = environment.Context.ThisBinding.ConvertToObject();
            var callArgs   = new IDynamic[] { null, null, obj };
            var length     = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;
            var thisArg    = args[1];

            if (callbackfn == null)
            {
                throw environment.CreateTypeError("The first parameter 'callbackfn' must be callable.");
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    callArgs[0] = obj.Get(key);
                    callArgs[1] = environment.CreateNumber(i);
                    callbackfn.Call(environment, thisArg, environment.CreateArgs(callArgs));
                }
            }

            return(environment.Undefined);
        }
Exemple #15
0
        private static IDynamic Unshift(IEnvironment environment, IArgs args)
        {
            var obj      = environment.Context.ThisBinding.ConvertToObject();
            var len      = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var argCount = (uint)args.Count;
            var k        = len;

            while (k > 0)
            {
                var from = (k - 1).ToString();
                var to   = (k + argCount - 1).ToString();
                if (obj.HasProperty(from))
                {
                    var fromValue = obj.Get(from);
                    obj.Put(to, fromValue, true);
                }
                else
                {
                    obj.Delete(to, true);
                }
                k--;
            }
            for (int i = 0; i < argCount; i++)
            {
                obj.Put(i.ToString(), args[i], true);
            }
            var newLength = environment.CreateNumber(len + argCount);

            obj.Put("length", newLength, true);
            return(newLength);
        }
Exemple #16
0
        private static IDynamic Shift(IEnvironment environment, IArgs args)
        {
            var obj    = environment.Context.ThisBinding.ConvertToObject();
            var length = obj.Get("length").ConvertToUInt32().BaseValue;

            if (length == 0)
            {
                return(environment.Undefined);
            }
            var first = obj.Get("0");
            var from  = "";
            var to    = "";

            for (int i = 1; i < length; i++)
            {
                from = i.ToString();
                to   = (i - 1).ToString();
                if (obj.HasProperty(from))
                {
                    obj.Put(to, obj.Get(from), true);
                }
                else
                {
                    obj.Delete(to, true);
                }
            }
            obj.Delete((length - 1).ToString(), true);
            obj.Put("length", environment.CreateNumber(length - 1D), true);
            return(first);
        }
Exemple #17
0
        private static IDynamic Map(IEnvironment environment, IArgs args)
        {
            var result     = ((IConstructable)environment.ArrayConstructor).Construct(environment, environment.EmptyArgs);
            var obj        = environment.Context.ThisBinding.ConvertToObject();
            var callArgs   = new IDynamic[] { null, null, obj };
            var length     = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;
            var thisArg    = args[1];

            if (callbackfn == null)
            {
                throw environment.CreateTypeError("The first parameter 'callbackfn' must be callable.");
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    callArgs[0] = obj.Get(key);
                    callArgs[1] = environment.CreateNumber(i);
                    var value = callbackfn.Call(environment, thisArg, environment.CreateArgs(callArgs));
                    result.DefineOwnProperty(key, environment.CreateDataDescriptor(value, true, true, true), false);
                }
            }

            return(result);
        }
Exemple #18
0
        internal static IDynamic Now(IEnvironment environment, IArgs args)
        {
            var value         = environment.CreateNumber((DateTime.UtcNow - _utcStart).TotalMilliseconds);
            var constructArgs = environment.CreateArgs(new IDynamic[] { value });

            return(((IConstructable)environment.DateConstructor).Construct(environment, constructArgs));
        }
Exemple #19
0
        private static IDynamic Filter(IEnvironment environment, IArgs args)
        {
            var result     = ((IConstructable)environment.ArrayConstructor).Construct(environment, environment.EmptyArgs);
            var obj        = environment.Context.ThisBinding.ConvertToObject();
            var length     = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;
            var thisArg    = args[1];

            if (callbackfn == null)
            {
                throw environment.CreateTypeError("");
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    var value    = obj.Get(key);
                    var callArgs = environment.CreateArgs(new[] { value, environment.CreateNumber(i), obj });
                    var include  = callbackfn.Call(environment, thisArg, callArgs);
                    if (include.ConvertToBoolean().BaseValue)
                    {
                        result.DefineOwnProperty(key, environment.CreateDataDescriptor(value, true, true, true), false);
                    }
                }
            }

            return(result);
        }
Exemple #20
0
        internal static IDynamic SetTime(IEnvironment environment, IArgs args)
        {
            var dt = (NDate)environment.Context.ThisBinding;
            var v  = TimeClip(args[0].ConvertToNumber().BaseValue);

            dt.PrimitiveValue = environment.CreateNumber(v);
            return(dt.PrimitiveValue);
        }
Exemple #21
0
 protected sealed override IDynamic Call(IEnvironment environment, IArgs args)
 {
     if (args.Count > 0)
     {
         return(args[0].ConvertToNumber());
     }
     return(environment.CreateNumber(0.0));
 }
Exemple #22
0
 protected override sealed IDynamic Call(IEnvironment environment, IArgs args)
 {
     if (args.Count > 0)
     {
         return args[0].ConvertToNumber();
     }
     return environment.CreateNumber(0.0);
 }
Exemple #23
0
        internal static IDynamic Abs(IEnvironment environment, IArgs args)
        {
            double x = args[0].ConvertToNumber().BaseValue;

            if (double.IsNaN(x))
            {
                return(environment.CreateNumber(double.NaN));
            }
            if (IsNegativeZero(x))
            {
                return(environment.CreateNumber(0.0));
            }
            if (double.IsNegativeInfinity(x))
            {
                return(environment.CreateNumber(double.PositiveInfinity));
            }
            return(environment.CreateNumber(Math.Abs(x)));
        }
Exemple #24
0
        internal static IDynamic Asin(IEnvironment environment, IArgs args)
        {
            double x = args[0].ConvertToNumber().BaseValue;

            if (double.IsNaN(x))
            {
                return(environment.CreateNumber(double.NaN));
            }
            if (x > 1.0 || x < -1.0)
            {
                return(environment.CreateNumber(double.NaN));
            }
            if (x == 0.0)
            {
                return(environment.CreateNumber(x));
            }
            return(environment.CreateNumber(Math.Asin(x)));
        }
Exemple #25
0
        IDynamic LocaleCompare(IEnvironment environment, IArgs args)
        {
            var o = environment.Context.ThisBinding;

            environment.CheckObjectCoercible(o);
            var s    = o.ConvertToString().BaseValue;
            var that = args[0].ConvertToString().BaseValue;

            return(environment.CreateNumber((double)s.CompareTo(that)));
        }
Exemple #26
0
        internal static IDynamic Fact(IEnvironment environment, IArgs args)
        {
            double r = 1.0, n = Math.Truncate(args[0].ConvertToNumber().BaseValue);

            for (double i = n; i > 1; --i)
            {
                r *= i;
            }
            return(environment.CreateNumber(r));
        }
Exemple #27
0
        internal static IDynamic SetUTCDate(IEnvironment environment, IArgs args)
        {
            var dt      = (NDate)environment.Context.ThisBinding;
            var t       = ((INumber)dt.PrimitiveValue).BaseValue;
            var date    = args[0].ConvertToNumber().BaseValue;
            var newDate = MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t));
            var v       = TimeClip(newDate);

            return(dt.PrimitiveValue = environment.CreateNumber(v));
        }
Exemple #28
0
        internal static IDynamic SetUTCMilliseconds(IEnvironment environment, IArgs args)
        {
            var dt   = (NDate)environment.Context.ThisBinding;
            var t    = ((INumber)dt.PrimitiveValue).BaseValue;
            var ms   = args[0].ConvertToNumber().BaseValue;
            var time = MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms);
            var v    = TimeClip(MakeDate(Day(t), time));

            dt.PrimitiveValue = environment.CreateNumber(v);
            return(dt.PrimitiveValue);
        }
Exemple #29
0
        internal static IDynamic SetUTCSeconds(IEnvironment environment, IArgs args)
        {
            var dt    = (NDate)environment.Context.ThisBinding;
            var t     = ((INumber)dt.PrimitiveValue).BaseValue;
            var s     = args[0].ConvertToNumber().BaseValue;
            var milli = args.Count > 1 ? args[1].ConvertToNumber().BaseValue : MsFromTime(t);
            var date  = MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli));
            var u     = TimeClip(date);

            dt.PrimitiveValue = environment.CreateNumber(u);
            return(dt.PrimitiveValue);
        }
Exemple #30
0
        internal static IDynamic SetUTCFullYear(IEnvironment environment, IArgs args)
        {
            var dt      = (NDate)environment.Context.ThisBinding;
            var t       = ((INumber)dt.PrimitiveValue).BaseValue;
            var y       = args[0].ConvertToNumber().BaseValue;
            var m       = args.Count > 1 ? args[1].ConvertToNumber().BaseValue : MonthFromTime(t);
            var date    = args.Count > 2 ? args[2].ConvertToNumber().BaseValue : DateFromTime(t);
            var newDate = MakeDate(MakeDay(y, m, date), TimeWithinDay(t));
            var v       = TimeClip(newDate);

            return(dt.PrimitiveValue = environment.CreateNumber(v));
        }
Exemple #31
0
        IDynamic LastIndexOf(IEnvironment environment, IArgs args)
        {
            var o = environment.Context.ThisBinding;

            environment.CheckObjectCoercible(o);
            var s            = o.ConvertToString().BaseValue;
            var searchString = args[0].ConvertToString().BaseValue;
            var position     = args.Count > 1 ? (int)args[1].ConvertToInteger().BaseValue : int.MaxValue;
            var start        = Math.Min(Math.Max(position, 0), s.Length);

            return(environment.CreateNumber((double)s.LastIndexOf(searchString, start)));
        }
Exemple #32
0
        public override sealed IObject Construct(IEnvironment environment, IArgs args)
        {
            var patternArg = args[0];
            var flagsArg = args[1];
            var pattern = "";
            var flags = "";
            bool global, ignoreCase, multiline;

            var patternObject = patternArg as IObject;
            if (patternObject != null && patternObject.Class == "RegExp")
            {
                if (flagsArg.TypeCode != LanguageTypeCode.Undefined)
                {
                    throw environment.CreateTypeError("");
                }
                global = ((IBoolean)patternObject.Get("global")).BaseValue;
                ignoreCase = ((IBoolean)patternObject.Get("ignoreCase")).BaseValue;
                multiline = ((IBoolean)patternObject.Get("multiline")).BaseValue;
                pattern = ((IString)patternObject.Get("source")).BaseValue;
                if (global) flags += "g";
                if (ignoreCase) flags += "i";
                if (multiline) flags += "m";
            }
            else
            {
                if (patternArg.TypeCode != LanguageTypeCode.Undefined)
                {
                    pattern = patternArg.ConvertToString().BaseValue;
                }
                if (flagsArg.TypeCode != LanguageTypeCode.Undefined)
                {
                    flags = flagsArg.ConvertToString().BaseValue;
                }
                global = flags.Contains("g");
                ignoreCase = flags.Contains("i");
                multiline = flags.Contains("m");
            }

            var regExpObj = new NRegExp(environment);
            regExpObj.Class = "RegExp";
            regExpObj.Extensible = true;
            regExpObj.Prototype = environment.RegExpPrototype;
            regExpObj.Body = pattern;
            regExpObj.Flags = flags;
            regExpObj.RegExpMatcher = Machete.Compiler.RegExpParser.Parse(Environment, pattern, flags);
            regExpObj.DefineOwnProperty("source", environment.CreateDataDescriptor(environment.CreateString(pattern), false, false, false), false);
            regExpObj.DefineOwnProperty("global", environment.CreateDataDescriptor(environment.CreateBoolean(global), false, false, false), false);
            regExpObj.DefineOwnProperty("ignoreCase", environment.CreateDataDescriptor(environment.CreateBoolean(ignoreCase), false, false, false), false);
            regExpObj.DefineOwnProperty("multiline", environment.CreateDataDescriptor(environment.CreateBoolean(multiline), false, false, false), false);
            regExpObj.DefineOwnProperty("lastIndex", environment.CreateDataDescriptor(environment.CreateNumber(0.0), true, false, false), false);
            return regExpObj;
        }
Exemple #33
0
        public override IObject Construct(IEnvironment environment, IArgs args)
        {
            var r = new NDate(environment);

            r.Class      = "Date";
            r.Extensible = true;
            r.Prototype  = environment.DatePrototype;

            var    argCount  = args.Count;
            double timeValue = 0.0;

            if (argCount == 0)
            {
                timeValue = (DateTime.UtcNow - _utcStart).TotalMilliseconds;
            }
            else if (argCount == 1)
            {
                var value = args[0].ConvertToPrimitive(null);
                if (value.TypeCode == LanguageTypeCode.String)
                {
                    timeValue = Parse(environment, args).ConvertToNumber().BaseValue;
                }
                else
                {
                    timeValue = value.ConvertToNumber().BaseValue;
                }
            }
            else
            {
                var year    = args[0].ConvertToNumber().ConvertToInteger().BaseValue;
                var month   = args[1].ConvertToNumber().BaseValue;
                var date    = argCount > 2 ? args[2].ConvertToNumber().BaseValue : 1.0;
                var hours   = argCount > 3 ? args[3].ConvertToNumber().BaseValue : 0.0;
                var minutes = argCount > 4 ? args[4].ConvertToNumber().BaseValue : 0.0;
                var seconds = argCount > 5 ? args[5].ConvertToNumber().BaseValue : 0.0;
                var ms      = argCount > 6 ? args[6].ConvertToNumber().BaseValue : 0.0;

                if (!double.IsNaN(year) && year >= 0.0 && year <= 99)
                {
                    year = 1900.0 + year;
                }

                var dayPortion  = PDate.MakeDay(year, month, date);
                var timePortion = PDate.MakeTime(hours, minutes, seconds, ms);
                var dateValue   = PDate.MakeDate(dayPortion, timePortion);

                timeValue = PDate.TimeClip(PDate.UTC(dateValue));
            }

            r.PrimitiveValue = environment.CreateNumber(PDate.TimeClip(timeValue));
            return(r);
        }
Exemple #34
0
        internal static IDynamic Log(IEnvironment environment, IArgs args)
        {
            double x = args[0].ConvertToNumber().BaseValue;

            if (double.IsNaN(x) || x < 0.0)
            {
                return(environment.CreateNumber(double.NaN));
            }
            if (x == 0.0)
            {
                return(environment.CreateNumber(double.NegativeInfinity));
            }
            if (x == 1.0)
            {
                return(environment.CreateNumber(0.0));
            }
            if (double.IsPositiveInfinity(x))
            {
                return(environment.CreateNumber(double.PositiveInfinity));
            }
            return(environment.CreateNumber(Math.Log(x)));
        }
Exemple #35
0
        internal static IDynamic Atan(IEnvironment environment, IArgs args)
        {
            double x = args[0].ConvertToNumber().BaseValue;

            if (double.IsNaN(x))
            {
                return(environment.CreateNumber(double.NaN));
            }
            if (x == 0.0)
            {
                return(environment.CreateNumber(x));
            }
            if (double.IsPositiveInfinity(x))
            {
                return(environment.CreateNumber(Math.PI / 2.0));
            }
            if (double.IsNegativeInfinity(x))
            {
                return(environment.CreateNumber(-Math.PI / 2.0));
            }
            return(environment.CreateNumber(Math.Atan(x)));
        }
Exemple #36
0
 public override sealed IObject Construct(IEnvironment environment, IArgs args)
 {
     var obj = new NNumber(environment);
     obj.Class = "Number";
     obj.Extensible = true;
     obj.Prototype = environment.NumberPrototype;
     if (args.Count > 0)
     {
         obj.PrimitiveValue = args[0].ConvertToNumber();
     }
     else
     {
         obj.PrimitiveValue = environment.CreateNumber(0.0);
     }
     return obj;
 }
Exemple #37
0
        public override sealed IObject Construct(IEnvironment environment, IArgs args)
        {
            var obj = new NString(environment);
            {
                var str = args.Count > 0 ? args[0].ConvertToString() : environment.CreateString("");
                var len = environment.CreateNumber(str.BaseValue.Length);
                var lenDesc = environment.CreateDataDescriptor(len, false, false, false);

                obj.Class = "String";
                obj.Extensible = true;
                obj.Prototype = environment.StringPrototype;
                obj.PrimitiveValue = str;
                obj.DefineOwnProperty("length", lenDesc, false);
            }
            return obj;
        }
Exemple #38
0
 public static IJsValue ArithEval(IEnvironment environment, IJsValue lhs, IJsValue rhs,
                                  Func<double, double, double> mathOperator)
 {
     /*
     var l = lhs.ToNumber();
     if (double.IsNaN(l) || double.IsInfinity(l))
     {
         return environment.CreateNumber(double.NaN);
     }
     var r = rhs.ToNumber();
     if (double.IsNaN(r) || double.IsInfinity(r))
     {
         return environment.CreateNumber(double.NaN);
     }
     return environment.CreateNumber(mathOperator(l, r));
      */
     var v = mathOperator(lhs.ToNumber(), rhs.ToNumber());
     return environment.CreateNumber(double.IsInfinity(v) ? double.NaN : v);
 }
Exemple #39
0
        private static IDynamic Some(IEnvironment environment, IArgs args)
        {
            var obj = environment.Context.ThisBinding.ConvertToObject();
            var callArgs = new IDynamic[] { null, null, obj };
            var length = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;
            var thisArg = args[1];

            if (callbackfn == null)
            {
                throw environment.CreateTypeError("The first parameter 'callbackfn' must be callable.");
            }

            for (uint i = 0; i < length; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    callArgs[0] = obj.Get(key);
                    callArgs[1] = environment.CreateNumber(i);
                    if (callbackfn.Call(environment, thisArg, environment.CreateArgs(callArgs)).ConvertToBoolean().BaseValue)
                    {
                        return environment.True;
                    }
                }
            }

            return environment.False;
        }
Exemple #40
0
 internal static IDynamic Execute(IEnvironment environment, Func<double, double> func)
 {
     var time = GetTimeValue(environment);
     if (double.IsNaN(time))
     {
         return environment.CreateNumber(double.NaN);
     }
     else
     {
         return environment.CreateNumber(func(time));
     }
 }
Exemple #41
0
        private static IDynamic Bind(IEnvironment environment, IArgs args)
        {
            var callable = environment.Context.ThisBinding as ICallable;
            if (callable == null)
            {
                throw environment.CreateTypeError("");
            }

            var target = (IObject)callable;
            var thisArg = args[0];
            var callArgs = environment.EmptyArgs;
            var func = new NBoundFunction(environment);

            if (args.Count > 1)
            {
                callArgs = environment.CreateArgs(args.Skip(1));
            }

            func.Class = "Function";
            func.Extensible = true;
            func.Prototype = environment.FunctionPrototype;
            func.TargetFunction = target;
            func.BoundThis = thisArg;
            func.BoundArguments = callArgs;

            var length = 0.0;
            if (target.Class == "Function")
            {
                length = callArgs.Count - target.Get("length").ConvertToUInt32().BaseValue;
            }

            var lengthNum = environment.CreateNumber(length);
            var thrower = environment.ThrowTypeErrorFunction;
            var desc = environment.CreateDataDescriptor(lengthNum, false, false, false);

            func.DefineOwnProperty("length", desc, false);
            desc = environment.CreateAccessorDescriptor(thrower, thrower, false, false);
            func.DefineOwnProperty("caller", desc, false);
            func.DefineOwnProperty("arguments", desc, false);

            return func;
        }
Exemple #42
0
 public static IJsValue Neg(IEnvironment environment, IJsValue value)
 {
     return environment.CreateNumber(-value.ToNumber());
 }
Exemple #43
0
 internal static IDynamic SetUTCMonth(IEnvironment environment, IArgs args)
 {
     var dt = (NDate)environment.Context.ThisBinding;
     var t = ((INumber)dt.PrimitiveValue).BaseValue;
     var m = args[0].ConvertToNumber().BaseValue;
     var date = args.Count > 1 ? args[1].ConvertToNumber().BaseValue : DateFromTime(t);
     var newDate = MakeDate(MakeDay(YearFromTime(t), m, date), TimeWithinDay(t));
     var v = TimeClip(newDate);
     return dt.PrimitiveValue = environment.CreateNumber(v);
 }
Exemple #44
0
        IDynamic Replace(IEnvironment environment, IArgs args)
        {
            var so = environment.Context.ThisBinding.ConvertToString();
            var s = so.BaseValue;
            var sb = new StringBuilder();
            var searchValueArg = args[0];
            var replaceValueArg = args[1];
            var replaceValueFunc = replaceValueArg as ICallable;
            var replaceValueString = replaceValueArg.ConvertToString();
            var matchSubstring = "";
            var i = 0;

            if (searchValueArg is NRegExp)
            {
                var regExpObj = (NRegExp)searchValueArg;
                var matcher = regExpObj.RegExpMatcher;

                Func<int, RegExpParser.MatchState, Func<string, string>> makeReplacer = null;

                if (replaceValueFunc != null)
                {
                    makeReplacer =
                        (startIndex, state) =>
                            v =>
                            {
                                var cArgs = new List<IDynamic>();
                                cArgs.Add(environment.CreateString(v));
                                foreach (var c in state.captures)
                                    cArgs.Add(c == null ? (IDynamic)environment.Null : environment.CreateString(c));
                                cArgs.Add(environment.CreateNumber(startIndex));
                                cArgs.Add(so);
                                var result =
                                    replaceValueFunc.Call(
                                        environment,
                                        environment.Undefined,
                                        environment.CreateArgs(cArgs)
                                    );
                                return result.ConvertToString().BaseValue;
                            };
                }
                else
                {
                    var replacer = MakeReplacer(replaceValueString.BaseValue);
                    makeReplacer = (_, state) => v => replacer(v, state);
                }

                var global = regExpObj.Flags.Contains("g");
                i = global ? (int)regExpObj.Get("lastIndex").ConvertToNumber().BaseValue : 0;

                do
                {
                    var r = matcher(s, i);
                    if (!r.success)
                    {
                        sb.Append(s[i++]);
                        continue;
                    }
                    matchSubstring = s.Substring(i, r.matchState.endIndex - i);
                    sb.Append(makeReplacer(i, r.matchState)(matchSubstring));
                    if (!global)
                        break;
                    i = r.matchState.endIndex;
                    regExpObj.Put("lastIndex", environment.CreateNumber(i), false);
                } while (i < s.Length);
            }
            else
            {
                Func<string, string> replace = null;

                if (replaceValueFunc == null)
                {
                    replace =  v => replaceValueString.BaseValue;
                }
                else
                {
                    replace =
                        v =>
                            replaceValueFunc.Call(
                                environment,
                                environment.Undefined,
                                environment.CreateArgs(
                                    new[] { environment.CreateString(v) }
                                )
                            )
                            .ConvertToString()
                            .BaseValue;
                }

                var searchValue = args[0].ConvertToString().BaseValue;
                var index = 0;

                do
                {
                    var resultIndex = s.IndexOf(searchValue, index);
                    if (resultIndex < 0)
                    {
                        sb.Append(s.Substring(index));
                        break;
                    }
                    matchSubstring = s.Substring(resultIndex, searchValue.Length);
                    sb.Append(replace(matchSubstring));
                    index = resultIndex + searchValue.Length;
                } while (index < s.Length);
            }

            return environment.CreateString(sb.ToString());
        }
Exemple #45
0
 IDynamic LocaleCompare(IEnvironment environment, IArgs args)
 {
     var o = environment.Context.ThisBinding;
     environment.CheckObjectCoercible(o);
     var s = o.ConvertToString().BaseValue;
     var that = args[0].ConvertToString().BaseValue;
     return environment.CreateNumber((double)s.CompareTo(that));
 }
Exemple #46
0
 internal static IDynamic ParseFloat(IEnvironment environment, IArgs args)
 {
     var text = args[0].ConvertToString().BaseValue;
     return environment.CreateNumber(Compiler.FloatParser.Parse(text));
 }
Exemple #47
0
 private static IDynamic Pop(IEnvironment environment, IArgs args)
 {
     var obj = environment.Context.ThisBinding.ConvertToObject();
     var length = obj.Get("length").ConvertToUInt32().BaseValue;
     if (length == 0.0) return environment.Undefined;
     var index = (length - 1).ToString();
     var element = obj.Get(index);
     obj.Delete(index, true);
     obj.Put("length", environment.CreateNumber(length - 1.0), true);
     return element;
 }
Exemple #48
0
 private static IDynamic Push(IEnvironment environment, IArgs args)
 {
     var obj = environment.Context.ThisBinding.ConvertToObject();
     var length = obj.Get("length").ConvertToUInt32().BaseValue;
     if (args.Count > 0)
     {
         for (int i = 0; i < args.Count; i++, length++)
         {
             obj.Put(length.ToString(), args[i], true);
         }
         obj.Put("length", environment.CreateNumber(length), true);
     }
     return environment.CreateNumber(length);
 }
Exemple #49
0
        private static IDynamic ReduceRight(IEnvironment environment, IArgs args)
        {
            var o = environment.Context.ThisBinding.ConvertToObject();
            var len = (uint)o.Get("length").ConvertToUInt32().BaseValue;
            var callbackfn = args[0] as ICallable;

            if (callbackfn == null)
                throw environment.CreateTypeError("");
            if (len == 0 && args.Count < 2)
                throw environment.CreateTypeError("");

            uint k = len - 1;
            var accumulator = args[1];
            if (args.Count < 2)
            {
                var found = false;
                for (;; k--)
                {
                    var key = k.ToString();
                    if (o.HasProperty(key))
                    {
                        found = true;
                        accumulator = o.Get(key);
                        k--;
                        break;
                    }
                    if (k == 0) break;
                }
                if (!found)
                    throw environment.CreateTypeError("");
            }
            for (;; k--)
            {
                var key = k.ToString();
                if (o.HasProperty(key))
                {
                    var callArgs = environment.CreateArgs(new[] { accumulator, o.Get(key), environment.CreateNumber(k), o });
                    accumulator = callbackfn.Call(environment, environment.Undefined, callArgs);
                }
                if (k == 0) break;
            }
            return accumulator;
        }
Exemple #50
0
 private static IDynamic Shift(IEnvironment environment, IArgs args)
 {
     var obj = environment.Context.ThisBinding.ConvertToObject();
     var length = obj.Get("length").ConvertToUInt32().BaseValue;
     if (length == 0)
     {
         return environment.Undefined;
     }
     var first = obj.Get("0");
     var from = "";
     var to = "";
     for (int i = 1; i < length; i++)
     {
         from = i.ToString();
         to = (i - 1).ToString();
         if (obj.HasProperty(from))
         {
             obj.Put(to, obj.Get(from), true);
         }
         else
         {
             obj.Delete(to, true);
         }
     }
     obj.Delete((length - 1).ToString(), true);
     obj.Put("length", environment.CreateNumber(length - 1D), true);
     return first;
 }
Exemple #51
0
 internal static IDynamic SetUTCSeconds(IEnvironment environment, IArgs args)
 {
     var dt = (NDate)environment.Context.ThisBinding;
     var t = ((INumber)dt.PrimitiveValue).BaseValue;
     var s = args[0].ConvertToNumber().BaseValue;
     var milli = args.Count > 1 ? args[1].ConvertToNumber().BaseValue : MsFromTime(t);
     var date = MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli));
     var u = TimeClip(date);
     dt.PrimitiveValue = environment.CreateNumber(u);
     return dt.PrimitiveValue;
 }
Exemple #52
0
 IDynamic CharCodeAt(IEnvironment environment, IArgs args)
 {
     var o = environment.Context.ThisBinding;
     environment.CheckObjectCoercible(o);
     var s = o.ConvertToString().BaseValue;
     var position = (int)args[0].ConvertToInteger().BaseValue;
     if (position < 0 || position >= s.Length)
     {
         return environment.CreateNumber(double.NaN);
     }
     return environment.CreateNumber((double)s[position]);
 }
Exemple #53
0
 IDynamic LastIndexOf(IEnvironment environment, IArgs args)
 {
     var o = environment.Context.ThisBinding;
     environment.CheckObjectCoercible(o);
     var s = o.ConvertToString().BaseValue;
     var searchString = args[0].ConvertToString().BaseValue;
     var position = args.Count > 1 ? (int)args[1].ConvertToInteger().BaseValue : int.MaxValue;
     var start = Math.Min(Math.Max(position, 0), s.Length);
     return environment.CreateNumber((double)s.LastIndexOf(searchString, start));
 }
Exemple #54
0
        private static IDynamic Sort(IEnvironment environment, IArgs args)
        {
            var obj = environment.Context.ThisBinding.ConvertToObject();
            var len = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
            var comparefn = args[0];

            var sortCompare = new Func<uint, uint, IDynamic>((j, k) =>
            {
                var jString = j.ToString();
                var kString = k.ToString();
                var hasJ = obj.HasProperty(jString);
                var hasK = obj.HasProperty(kString);
                if (!hasJ || !hasK)
                {
                    if (!hasJ && !hasK) return environment.CreateNumber(0);
                    else if (!hasJ) return environment.CreateNumber(1);
                    else return environment.CreateNumber(-1);
                }
                var x = obj.Get(jString);
                var y = obj.Get(kString);
                if (x is IUndefined || y is IUndefined)
                {
                    if (x is IUndefined && y is IUndefined) return environment.CreateNumber(0);
                    else if (x is IUndefined) return environment.CreateNumber(1);
                    else return environment.CreateNumber(-1);
                }

                if (comparefn.TypeCode != LanguageTypeCode.Undefined)
                {
                    var callable = comparefn as ICallable;
                    if (callable == null)
                    {
                        throw environment.CreateTypeError("");
                    }
                    return callable.Call(environment, environment.Undefined, environment.CreateArgs(new[] { x, y }));
                }

                var xString = x.ConvertToString();
                var yString = y.ConvertToString();
                var xLess = xString.Op_Lessthan(yString);
                if (((IBoolean)xLess).BaseValue) return environment.CreateNumber(-1);
                var yLess = yString.Op_Lessthan(xString);
                if (((IBoolean)yLess).BaseValue) return environment.CreateNumber(1);
                return environment.CreateNumber(0);
            });

            var items = new List<IDynamic>();
            for (uint i = 0; i < len; i++)
            {
                var key = i.ToString();
                if (obj.HasProperty(key))
                {
                    var value = obj.Get(key);
                    items.Add(value);
                    obj.Delete(key, true);
                }
            }

            items.Sort((x, y) =>
            {
                if (x is IUndefined || y is IUndefined)
                {
                    if (x is IUndefined && y is IUndefined) return 0;
                    else if (x is IUndefined) return 1;
                    else return -1;
                }

                if (comparefn.TypeCode != LanguageTypeCode.Undefined)
                {
                    var callable = comparefn as ICallable;
                    if (callable == null)
                    {
                        throw environment.CreateTypeError("");
                    }
                    var result = callable.Call(environment, environment.Undefined, environment.CreateArgs(new[] { x, y }));
                    var number = result.ConvertToInteger();
                    if (double.IsNaN(number.BaseValue) || double.IsInfinity(number.BaseValue))
                    {
                        return 0;
                    }
                    return (int)number.BaseValue;
                }

                var xString = x.ConvertToString();
                var yString = y.ConvertToString();
                var xLess = xString.Op_Lessthan(yString);
                if (((IBoolean)xLess).BaseValue) return -1;
                var yLess = yString.Op_Lessthan(xString);
                if (((IBoolean)yLess).BaseValue) return 1;
                return 0;
            });

            for (int i = 0; i < items.Count; i++)
            {
                var key = i.ToString();
                obj.Put(key, items[i], true);
            }

            return obj;
        }
Exemple #55
0
 IDynamic Match(IEnvironment environment, IArgs args)
 {
     var o = environment.Context.ThisBinding;
     environment.CheckObjectCoercible(o);
     var dynS = o.ConvertToString();
     var s = dynS.BaseValue;
     var regexpArg = args[0];
     var regexpObj = regexpArg as NRegExp;
     if (regexpObj == null)
     {
         var constructor = (IConstructable)environment.RegExpConstructor;
         var pattern = regexpArg.ConvertToString();
         regexpObj = (NRegExp)constructor.Construct(environment, environment.CreateArgs(new [] { pattern }));
     }
     var exec = ((ICallable)regexpObj.Get("exec"));
     var execArgs = environment.CreateArgs(new [] { dynS });
     if (!regexpObj.Get("global").ConvertToBoolean().BaseValue)
     {
         return exec.Call(environment, regexpObj, execArgs);
     }
     else
     {
         var constructor = (IConstructable)environment.ArrayConstructor;
         var array = constructor.Construct(environment, environment.EmptyArgs);
         var previousLastIndex = 0;
         var lastMatch = true;
         var n = 0;
         while (lastMatch)
         {
             var result = exec.Call(environment, regexpObj, execArgs);
             switch (result.TypeCode)
             {
                 case LanguageTypeCode.Null:
                     lastMatch = false;
                     break;
                 default:
                     var thisIndex = (int)regexpObj.Get("lastIndex").ConvertToNumber().BaseValue;
                     if (thisIndex == previousLastIndex)
                     {
                         thisIndex += 1;
                         regexpObj.Put("lastIndex", environment.CreateNumber(thisIndex), false);
                         previousLastIndex = thisIndex;
                     }
                     else
                     {
                         previousLastIndex = thisIndex;
                     }
                     var matchStr = ((IObject)result).Get("0");
                     var desc = environment.CreateDataDescriptor(matchStr, true, true, true);
                     array.DefineOwnProperty(n.ToString(), desc, true);
                     n++;
                     break;
             }
         }
         if (n == 0)
         {
             return environment.Null;
         }
         return array;
     }
 }
Exemple #56
0
 internal static IDynamic SetTime(IEnvironment environment, IArgs args)
 {
     var dt = (NDate)environment.Context.ThisBinding;
     var v = TimeClip(args[0].ConvertToNumber().BaseValue);
     dt.PrimitiveValue = environment.CreateNumber(v);
     return dt.PrimitiveValue;
 }
Exemple #57
0
 IDynamic Search(IEnvironment environment, IArgs args)
 {
     var o = environment.Context.ThisBinding;
     environment.CheckObjectCoercible(o);
     var s = o.ConvertToString().BaseValue;
     var regexpArg = args[0];
     var regexpObj = regexpArg as NRegExp;
     if (regexpObj == null)
     {
         var constructor = (IConstructable)environment.RegExpConstructor;
         var pattern = regexpArg.ConvertToString();
         regexpObj = (NRegExp)constructor.Construct(environment, environment.CreateArgs(new [] { pattern }));
     }
     var regExp = regexpObj.RegExpMatcher;
     var index = 0;
     do
     {
         var result = regExp(s, index);
         if (result.success)
         {
             return environment.CreateNumber(index);
         }
     } while (++index < s.Length);
     return environment.CreateNumber(-1);
 }
Exemple #58
0
 internal static IDynamic SetUTCMilliseconds(IEnvironment environment, IArgs args)
 {
     var dt = (NDate)environment.Context.ThisBinding;
     var t = ((INumber)dt.PrimitiveValue).BaseValue;
     var ms = args[0].ConvertToNumber().BaseValue;
     var time = MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms);
     var v = TimeClip(MakeDate(Day(t), time));
     dt.PrimitiveValue = environment.CreateNumber(v);
     return dt.PrimitiveValue;
 }
Exemple #59
0
        internal static IDynamic ParseInt(IEnvironment environment, IArgs args)
        {
            var text = args[0].ConvertToString().BaseValue;
            var radix = 0.0;

            if (args.Count > 1)
            {
                radix = args[1].ConvertToNumber().BaseValue;
                if (double.IsNaN(radix) || double.IsInfinity(radix) || radix < 2.0 || radix > 36.0)
                {
                    radix = 0.0;
                }
            }

            return environment.CreateNumber(Compiler.IntParser.Parse(text, (int)radix));
        }
Exemple #60
0
 private static IDynamic Unshift(IEnvironment environment, IArgs args)
 {
     var obj = environment.Context.ThisBinding.ConvertToObject();
     var len = (uint)obj.Get("length").ConvertToUInt32().BaseValue;
     var argCount = (uint)args.Count;
     var k = len;
     while (k > 0)
     {
         var from = (k - 1).ToString();
         var to = (k + argCount - 1).ToString();
         if (obj.HasProperty(from))
         {
             var fromValue = obj.Get(from);
             obj.Put(to, fromValue, true);
         }
         else
         {
             obj.Delete(to, true);
         }
         k--;
     }
     for (int i = 0; i < argCount; i++)
     {
         obj.Put(i.ToString(), args[i], true);
     }
     var newLength = environment.CreateNumber(len + argCount);
     obj.Put("length", newLength, true);
     return newLength;
 }