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)); }
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)); }
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); }
public IDynamic Op_PrefixIncrement() { StrictReferenceCondition(); var oldNum = Value.ConvertToNumber(); var newNum = _environment.CreateNumber(oldNum.BaseValue + 1.0); Value = newNum; return(newNum); }
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)); }
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); }
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))); } }
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)); }
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; }
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])); }
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))); }
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)); }
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)); }
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); }
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); }
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); }
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); }
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)); }
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); }
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); }
protected sealed override IDynamic Call(IEnvironment environment, IArgs args) { if (args.Count > 0) { return(args[0].ConvertToNumber()); } return(environment.CreateNumber(0.0)); }
protected override sealed IDynamic Call(IEnvironment environment, IArgs args) { if (args.Count > 0) { return args[0].ConvertToNumber(); } return environment.CreateNumber(0.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))); }
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))); }
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))); }
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)); }
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)); }
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); }
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); }
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)); }
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))); }
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; }
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); }
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))); }
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))); }
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; }
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; }
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); }
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; }
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)); } }
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; }
public static IJsValue Neg(IEnvironment environment, IJsValue value) { return environment.CreateNumber(-value.ToNumber()); }
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); }
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()); }
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)); }
internal static IDynamic ParseFloat(IEnvironment environment, IArgs args) { var text = args[0].ConvertToString().BaseValue; return environment.CreateNumber(Compiler.FloatParser.Parse(text)); }
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; }
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); }
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; }
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; }
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; }
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]); }
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)); }
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; }
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; } }
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; }
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); }
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; }
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)); }
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; }