/// <summary> /// Overriden indexer to optimize cases when we already have a number /// </summary> /// <param name="key">index</param> /// <returns>value</returns> public override JsInstance this[JsInstance key] { get { double keyNumber = key.ToNumber(); int i = (int)keyNumber; if (i == keyNumber && i >= 0) { // we have got an index return(this.get(i)); } else { return(base[key.ToString()]); } } set { double keyNumber = key.ToNumber(); int i = (int)keyNumber; if (i == keyNumber && i >= 0) { // we have got an index this.put(i, value); } else { base[key.ToString()] = value; } } }
public override JsInstance this[JsInstance key] { get { double number = key.ToNumber(); int i = (int)number; if ((double)i == number && i >= 0) { return(this.get(i)); } return(base[key.ToString()]); } set { double number = key.ToNumber(); int i = (int)number; if ((double)i == number && i >= 0) { this.put(i, value); } else { base[key.ToString()] = value; } } }
public JsException(JsInstance value) : base(value.ToString()) { Value = value; //if (value is JsDictionaryObject) // ((JsDictionaryObject)value)["jintException"] = new JsClr(this); }
/// <summary> /// 15.5.4.14 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance SplitImpl(JsDictionaryObject target, JsInstance[] parameters) { JsObject A = Global.ArrayClass.New(); string S = target.ToString(); if (parameters.Length == 0 || parameters[0] == JsUndefined.Instance) { A["0"] = Global.StringClass.New(S); } JsInstance separator = parameters[0]; int limit = parameters.Length > 1 ? Convert.ToInt32(parameters[1].ToNumber()) : Int32.MaxValue; int s = S.Length; string[] result; if (separator.Class == JsInstance.CLASS_REGEXP) { result = ((JsRegExp)parameters[0]).Regex.Split(S, limit); } else { result = S.Split(new string[] { separator.ToString() }, limit, StringSplitOptions.None); } for (int i = 0; i < result.Length; i++) { A[i.ToString()] = Global.StringClass.New(result[i]); } return(A); }
public JsInstance SplitImpl(JsDictionaryObject target, JsInstance[] parameters) { JsObject jsObject = (JsObject)this.Global.ArrayClass.New(); string input = target.ToString(); if (parameters.Length == 0 || parameters[0] == JsUndefined.Instance) { jsObject["0"] = (JsInstance)this.Global.StringClass.New(input); } JsInstance parameter = parameters[0]; int count = parameters.Length > 1 ? Convert.ToInt32(parameters[1].ToNumber()) : int.MaxValue; int length = input.Length; string[] strArray; if (parameter.Class == "RegExp") { strArray = ((JsRegExp)parameters[0]).Regex.Split(input, count); } else { strArray = input.Split(new string[1] { parameter.ToString() }, count, StringSplitOptions.None); } for (int index = 0; index < strArray.Length; ++index) { jsObject[index.ToString()] = (JsInstance)this.Global.StringClass.New(strArray[index]); } return((JsInstance)jsObject); }
public JsInstance Join(JsObject target, JsInstance[] parameters) { if (target is JsArray) { return((JsInstance)((JsArray)target).join(this.Global, parameters.Length != 0 ? parameters[0] : (JsInstance)JsUndefined.Instance)); } string str = parameters.Length == 0 || parameters[0] == JsUndefined.Instance ? "," : parameters[0].ToString(); if (target.Length == 0) { return((JsInstance)this.Global.StringClass.New()); } JsInstance jsInstance1 = target[0.ToString()]; StringBuilder stringBuilder = jsInstance1 != JsUndefined.Instance && jsInstance1 != JsNull.Instance ? new StringBuilder(jsInstance1.ToString()) : new StringBuilder(string.Empty); double number = target["length"].ToNumber(); for (int index = 1; (double)index < number; ++index) { stringBuilder.Append(str); JsInstance jsInstance2 = target[index.ToString()]; if (jsInstance2 != JsUndefined.Instance && jsInstance2 != JsNull.Instance) { stringBuilder.Append(jsInstance2.ToString()); } } return((JsInstance)this.Global.StringClass.New(stringBuilder.ToString())); }
public override void Delete(JsInstance key) { double number = key.ToNumber(); int key1 = (int)number; if ((double)key1 == number) { this.m_data.Remove(key1); } else { base.Delete(key.ToString()); } }
public override void Delete(JsInstance key) { double keyNumber = key.ToNumber(); int index = (int)keyNumber; if (index == keyNumber) { m_data.Remove(index); } else { base.Delete(key.ToString()); } }
public JsString join(IGlobal global, JsInstance separator) { if (this.length == 0) { return(global.StringClass.New()); } string separator1 = separator == JsUndefined.Instance ? "," : separator.ToString(); string[] strArray = new string[this.length]; for (int key = 0; key < this.length; ++key) { JsInstance jsInstance; strArray[key] = !this.m_data.TryGetValue(key, out jsInstance) || jsInstance == JsNull.Instance || jsInstance == JsUndefined.Instance ? "" : jsInstance.ToString(); } return(global.StringClass.New(string.Join(separator1, strArray))); }
public JsInstance ToFixedImpl(JsInstance target, JsInstance[] parameters) { int num = 0; if ((uint)parameters.Length > 0U) { num = Convert.ToInt32(parameters[0].ToNumber()); } if (num > 20 || num < 0) { throw new JsException((JsInstance)this.Global.SyntaxErrorClass.New("Fraction Digits must be greater than 0 and lesser than 20")); } if (target == this.Global.NaN) { return((JsInstance)this.Global.StringClass.New(target.ToString())); } return((JsInstance)this.Global.StringClass.New(target.ToNumber().ToString("f" + (object)num, (IFormatProvider)CultureInfo.InvariantCulture))); }
public JsString join(IGlobal global, JsInstance separator) { if (length == 0) { return(global.StringClass.New()); } string sep = separator == JsUndefined.Instance ? "," : separator.ToString(); string[] map = new string[length]; JsInstance item; for (int i = 0; i < length; i++) { map[i] = m_data.TryGetValue(i, out item) && item != JsNull.Instance && item != JsUndefined.Instance ? item.ToString() : ""; } return(global.StringClass.New(String.Join(sep, map))); }
/// <summary> /// 15.4.4.5 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance Join(JsObject target, JsInstance[] parameters) { if (target is JsArray) { return(((JsArray)target).join(Global, parameters.Length > 0 ? parameters[0] : JsUndefined.Instance)); } string separator = (parameters.Length == 0 || parameters[0] == JsUndefined.Instance) ? "," : parameters[0].ToString(); if (target.Length == 0) { return(Global.StringClass.New()); } JsInstance element0 = target[0.ToString()]; StringBuilder r; if (element0 == JsUndefined.Instance || element0 == JsNull.Instance) { r = new StringBuilder(string.Empty); } else { r = new StringBuilder(element0.ToString()); } var length = target["length"].ToNumber(); for (int k = 1; k < length; k++) { r.Append(separator); JsInstance element = target[k.ToString()]; if (element != JsUndefined.Instance && element != JsNull.Instance) { r.Append(element.ToString()); } } return(Global.StringClass.New(r.ToString())); }
/// <summary> /// 15.7.4.5 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance ToFixedImpl(JsInstance target, JsInstance[] parameters) { int fractions = 0; if (parameters.Length > 0) { fractions = Convert.ToInt32(parameters[0].ToNumber()); } if (fractions > 20 || fractions < 0) { throw new JsException(Global.SyntaxErrorClass.New("Fraction Digits must be greater than 0 and lesser than 20")); } if (target == Global.NaN) { return(Global.StringClass.New(target.ToString())); } return(Global.StringClass.New(target.ToNumber().ToString("f" + fractions, CultureInfo.InvariantCulture))); }
/// <summary> /// Overriden indexer to optimize cases when we already have a number /// </summary> /// <param name="key">index</param> /// <returns>value</returns> public override JsInstance this[JsInstance key] { get { double keyNumber = key.ToNumber(); int i = (int)keyNumber; if (i == keyNumber && i >= 0) { // we have got an index return this.get(i); } else { return base[key.ToString()]; } } set { double keyNumber = key.ToNumber(); int i = (int)keyNumber; if (i == keyNumber && i >= 0) { // we have got an index this.put(i, value); } else { base[key.ToString()] = value; } } }
public JsString join(IGlobal global, JsInstance separator) { if (length == 0) return global.StringClass.New(); string sep = separator == JsUndefined.Instance ? "," : separator.ToString(); string[] map = new string[length]; JsInstance item; for (int i = 0; i < length; i++) map[i] = m_data.TryGetValue(i, out item) && item != JsNull.Instance && item != JsUndefined.Instance ? item.ToString() : ""; return global.StringClass.New(String.Join(sep, map)); }
private static JsString GiveMeJavascript(JsNumber number, JsInstance instance) { return new JsString(number + instance.ToString(), JsNull.Instance); }
public override void Delete(JsInstance key) { double keyNumber = key.ToNumber(); int index = (int)keyNumber; if (index == keyNumber) m_data.Remove(index); else base.Delete(key.ToString()); }
/// <summary> /// 15.7.4.5 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance ToFixedImpl(JsInstance target, JsInstance[] parameters) { int fractions = 0; if (parameters.Length > 0) { fractions = Convert.ToInt32(parameters[0].ToNumber()); } if (fractions > 20 || fractions < 0) { throw new JsException(Global.SyntaxErrorClass.New("Fraction Digits must be greater than 0 and lesser than 20")); } if (target == Global.NaN) { return Global.StringClass.New(target.ToString()); } return Global.StringClass.New(target.ToNumber().ToString("f" + fractions, CultureInfo.InvariantCulture)); }
public JsInstance ReplaceImpl(JsDictionaryObject target, JsInstance[] parameters) { if (parameters.Length == 0) { return((JsInstance)this.Global.StringClass.New(target.ToString())); } JsInstance parameter = parameters[0]; JsInstance jsInstance = (JsInstance)JsUndefined.Instance; if (parameters.Length > 1) { jsInstance = parameters[1]; } string source = target.ToString(); JsFunction function = jsInstance as JsFunction; if (parameter.Class == "RegExp") { int count = ((JsRegExp)parameters[0]).IsGlobal ? int.MaxValue : 1; JsRegExp regexp = (JsRegExp)parameters[0]; int startat = regexp.IsGlobal ? 0 : Math.Max(0, (int)regexp["lastIndex"].ToNumber() - 1); if (regexp.IsGlobal) { regexp["lastIndex"] = (JsInstance)this.Global.NumberClass.New(0.0); } if (jsInstance is JsFunction) { return((JsInstance)this.Global.StringClass.New(((JsRegExp)parameters[0]).Regex.Replace(source, (MatchEvaluator)(m => { List <JsInstance> jsInstanceList = new List <JsInstance>(); if (!regexp.IsGlobal) { regexp["lastIndex"] = (JsInstance)this.Global.NumberClass.New((double)(m.Index + 1)); } jsInstanceList.Add((JsInstance)this.Global.StringClass.New(m.Value)); for (int index = 1; index < m.Groups.Count; ++index) { if (m.Groups[index].Success) { jsInstanceList.Add((JsInstance)this.Global.StringClass.New(m.Groups[index].Value)); } else { jsInstanceList.Add((JsInstance)JsUndefined.Instance); } } jsInstanceList.Add((JsInstance)this.Global.NumberClass.New((double)m.Index)); jsInstanceList.Add((JsInstance)this.Global.StringClass.New(source)); this.Global.Visitor.ExecuteFunction(function, (JsDictionaryObject)null, jsInstanceList.ToArray()); return this.Global.Visitor.Returned.ToString(); }), count, startat))); } string str = parameters[1].ToString(); return((JsInstance)this.Global.StringClass.New(((JsRegExp)parameters[0]).Regex.Replace(target.ToString(), (MatchEvaluator)(m => { if (!regexp.IsGlobal) { regexp["lastIndex"] = (JsInstance)this.Global.NumberClass.New((double)(m.Index + 1)); } string after = source.Substring(Math.Min(source.Length - 1, m.Index + m.Length)); return JsStringConstructor.EvaluateReplacePattern(m.Value, source.Substring(0, m.Index), after, str, m.Groups); }), count, startat))); } string matched = parameter.ToString(); int length = source.IndexOf(matched); if (length == -1) { return((JsInstance)this.Global.StringClass.New(source)); } if (jsInstance is JsFunction) { this.Global.Visitor.ExecuteFunction(function, (JsDictionaryObject)null, new List <JsInstance>() { (JsInstance)this.Global.StringClass.New(matched), (JsInstance)this.Global.NumberClass.New((double)length), (JsInstance)this.Global.StringClass.New(source) }.ToArray()); JsInstance result = this.Global.Visitor.Result; return((JsInstance)this.Global.StringClass.New(source.Substring(0, length) + result.ToString() + source.Substring(length + matched.Length))); } string before = source.Substring(0, length); string after1 = source.Substring(length + matched.Length); string replacePattern = JsStringConstructor.EvaluateReplacePattern(matched, before, after1, jsInstance.ToString(), (GroupCollection)null); return((JsInstance)this.Global.StringClass.New(before + replacePattern + after1)); }
/// <summary> /// 15.5.4.11 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance ReplaceImpl(JsDictionaryObject target, JsInstance[] parameters) { if (parameters.Length == 0) { return(Global.StringClass.New(target.ToString())); } JsInstance searchValue = parameters[0]; JsInstance replaceValue = JsUndefined.Instance; if (parameters.Length > 1) { replaceValue = parameters[1]; } string source = target.ToString(); JsFunction function = replaceValue as JsFunction; if (searchValue.Class == JsInstance.CLASS_REGEXP) { int count = ((JsRegExp)parameters[0]).IsGlobal ? int.MaxValue : 1; var regexp = ((JsRegExp)parameters[0]); int lastIndex = regexp.IsGlobal ? 0 : Math.Max(0, (int)regexp["lastIndex"].ToNumber() - 1); if (regexp.IsGlobal) { regexp["lastIndex"] = Global.NumberClass.New(0); } if (replaceValue is JsFunction) { string ret = ((JsRegExp)parameters[0]).Regex.Replace(source, delegate(Match m) { List <JsInstance> replaceParameters = new List <JsInstance>(); if (!regexp.IsGlobal) { regexp["lastIndex"] = Global.NumberClass.New(m.Index + 1); } replaceParameters.Add(Global.StringClass.New(m.Value)); for (int i = 1; i < m.Groups.Count; i++) { if (m.Groups[i].Success) { replaceParameters.Add(Global.StringClass.New(m.Groups[i].Value)); } else { replaceParameters.Add(JsUndefined.Instance); } } replaceParameters.Add(Global.NumberClass.New(m.Index)); replaceParameters.Add(Global.StringClass.New(source)); Global.Visitor.ExecuteFunction(function, null, replaceParameters.ToArray()); return(Global.Visitor.Returned.ToString()); }, count, lastIndex); return(Global.StringClass.New(ret)); } else { string str = parameters[1].ToString(); string ret = ((JsRegExp)parameters[0]).Regex.Replace(target.ToString(), delegate(Match m) { if (!regexp.IsGlobal) { regexp["lastIndex"] = Global.NumberClass.New(m.Index + 1); } string after = source.Substring(Math.Min(source.Length - 1, m.Index + m.Length)); return(EvaluateReplacePattern(m.Value, source.Substring(0, m.Index), after, str, m.Groups)); }, count, lastIndex); return(Global.StringClass.New(ret)); } } else { string search = searchValue.ToString(); int index = source.IndexOf(search); if (index != -1) { if (replaceValue is JsFunction) { List <JsInstance> replaceParameters = new List <JsInstance>(); replaceParameters.Add(Global.StringClass.New(search)); replaceParameters.Add(Global.NumberClass.New(index)); replaceParameters.Add(Global.StringClass.New(source)); Global.Visitor.ExecuteFunction(function, null, replaceParameters.ToArray()); replaceValue = Global.Visitor.Result; return(Global.StringClass.New(source.Substring(0, index) + replaceValue.ToString() + source.Substring(index + search.Length))); } else { string before = source.Substring(0, index); string after = source.Substring(index + search.Length); string newString = EvaluateReplacePattern(search, before, after, replaceValue.ToString(), null); return(Global.StringClass.New(before + newString + after)); } } else { return(Global.StringClass.New(source)); } } }
public JsBoolean Compare(JsInstance x, JsInstance y) { if (x.IsClr && y.IsClr) { return Global.BooleanClass.New(x.Value.Equals(y.Value)); } if (x.IsClr) { return Compare(x.ToPrimitive(Global), y); } if (y.IsClr) { return Compare(x, y.ToPrimitive(Global)); } if (x.Type == y.Type) { // if both are Objects but then only one is Clrs if (x == JsUndefined.Instance) { return Global.BooleanClass.True; } else if (x == JsNull.Instance) { return Global.BooleanClass.True; } else if (x.Type == JsInstance.TYPE_NUMBER) { if (x.ToNumber() == double.NaN) { return Global.BooleanClass.False; } else if (y.ToNumber() == double.NaN) { return Global.BooleanClass.False; } else if (x.ToNumber() == y.ToNumber()) { return Global.BooleanClass.True; } else { return Global.BooleanClass.False; } } else if (x.Type == JsInstance.TYPE_STRING) { return Global.BooleanClass.New(x.ToString() == y.ToString()); } else if (x.Type == JsInstance.TYPE_BOOLEAN) { return Global.BooleanClass.New(x.ToBoolean() == y.ToBoolean()); } else if (x.Type == JsInstance.TYPE_OBJECT ) { return Global.BooleanClass.New(x == y); } else { return Global.BooleanClass.New(x.Value.Equals(y.Value)); } } else if (x == JsNull.Instance && y == JsUndefined.Instance) { return Global.BooleanClass.True; } else if (x == JsUndefined.Instance && y == JsNull.Instance) { return Global.BooleanClass.True; } else if (x.Type == JsInstance.TYPE_NUMBER && y.Type == JsInstance.TYPE_STRING) { return Global.BooleanClass.New(x.ToNumber() == y.ToNumber()); } else if (x.Type == JsInstance.TYPE_STRING && y.Type == JsInstance.TYPE_NUMBER) { return Global.BooleanClass.New(x.ToNumber() == y.ToNumber()); } else if (x.Type == JsInstance.TYPE_BOOLEAN || y.Type == JsInstance.TYPE_BOOLEAN) { return Global.BooleanClass.New(x.ToNumber() == y.ToNumber()); } else if (y.Type == JsInstance.TYPE_OBJECT && (x.Type == JsInstance.TYPE_STRING || x.Type == JsInstance.TYPE_NUMBER)) { return Compare(x, y.ToPrimitive(Global)); } else if (x.Type == JsInstance.TYPE_OBJECT && (y.Type == JsInstance.TYPE_STRING || y.Type == JsInstance.TYPE_NUMBER)) { return Compare(x.ToPrimitive(Global), y); } else { return Global.BooleanClass.False; } }