/// <summary> /// 15.4.4.2 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance ToStringImpl(JsArray target, JsInstance[] parameters) { JsArray result = Global.ArrayClass.New(); for (int i = 0; i < target.Length; i++) { var obj = (JsDictionaryObject)target[i.ToString()]; if (ExecutionVisitor.IsNullOrUndefined(obj)) { result[i.ToString()] = Global.StringClass.New(); } else { var function = obj["toString"] as JsFunction; if (function != null) { Global.Visitor.ExecuteFunction(function, obj, parameters); result[i.ToString()] = Global.Visitor.Returned; } else { result[i.ToString()] = Global.StringClass.New(); } } } return Global.StringClass.New(result.ToString()); }
static void Main(string[] args) { JsGlobal dummy; JintEngine eng = new JintEngine(); JsArray root = null; root = new JsArray(); eng.GlobalScope["PersistentRoot"] = root; eng.SetDebugMode(true); eng.SetFunction("log" , new Jint.Delegates.Func<JsInstance, JsInstance>((JsInstance obj) => { Console.WriteLine(obj==null?"NULL":obj.Value==null?"NULL 2":obj.Value.ToString()); return JsUndefined.Instance; })); // ((JsFunction)eng.GlobalScope["log"]).Execute(eng.Visitor, null, new JsInstance[] { new JsUndefined() }); // Console.WriteLine("\r\n" + eng.Run(File.ReadAllText(@"Scripts\func_jsonifier.js"))); Console.WriteLine("\r\n" + eng.Run(File.ReadAllText(@"Scripts\test.js"))); while (true) { Console.Write("] "); var l = Console.ReadLine(); if (l.Length == 0) break; var res = eng.Run(l); Console.WriteLine(res == null ? "<.NET NULL>" : res.ToString()); } Console.WriteLine("Saving..."); // Console.ReadLine(); // root.Modify(); // s.Close(); // Console.Write("Enter to close"); // Console.ReadLine(); }
public JsArray New() { JsArray array = new JsArray(PrototypeProperty); //array.DefineOwnProperty("constructor", new ValueDescriptor(this) { Enumerable = false }); return array; }
/// <summary> /// 15.4.4.3 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance ToLocaleStringImpl(JsArray target, JsInstance[] parameters) { JsArray result = Global.ArrayClass.New(); for (int i = 0; i < target.Length; i++) { var obj = (JsDictionaryObject)target[i.ToString()]; Global.Visitor.ExecuteFunction((JsFunction)obj["toLocaleString"], obj, parameters); result[i.ToString()] = Global.Visitor.Returned; } return Global.StringClass.New(result.ToString()); }
/// <summary> /// 15.4.4.12 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance Splice(JsObject target, JsInstance[] parameters) { JsArray array = Global.ArrayClass.New(); int relativeStart = Convert.ToInt32(parameters[0].ToNumber()); int actualStart = relativeStart < 0 ? Math.Max(target.Length + relativeStart, 0) : Math.Min(relativeStart, target.Length); int actualDeleteCount = Math.Min(Math.Max(Convert.ToInt32(parameters[1].ToNumber()), 0), target.Length - actualStart); int len = target.Length; for (int k = 0; k < actualDeleteCount; k++) { string from = (relativeStart + k).ToString(); JsInstance result = null; if (target.TryGetProperty(from, out result)) { array.put(k, result); } } List <JsInstance> items = new List <JsInstance>(); items.AddRange(parameters); items.RemoveAt(0); items.RemoveAt(0); // use non-distructional copy, determine direction if (items.Count < actualDeleteCount) { for (int k = actualStart; k < len - actualDeleteCount; k++) { JsInstance result = null; string from = (k + actualDeleteCount).ToString(); string to = (k + items.Count).ToString(); if (target.TryGetProperty(from, out result)) { target[to] = result; } else { target.Delete(to); } } for (int k = target.Length; k > len - actualDeleteCount + items.Count; k--) { target.Delete((k - 1).ToString()); } target.Length = len - actualDeleteCount + items.Count; } else { for (int k = len - actualDeleteCount; k > actualStart; k--) { JsInstance result = null; string from = (k + actualDeleteCount - 1).ToString(); string to = (k + items.Count - 1).ToString(); if (target.TryGetProperty(from, out result)) { target[to] = result; } else { target.Delete(to); } } } for (int k = 0; k < items.Count; k++) { target[k.ToString()] = items[k]; } return(array); }
public JsInstance Splice(JsObject target, JsInstance[] parameters) { JsArray jsArray = this.Global.ArrayClass.New(); int int32 = Convert.ToInt32(parameters[0].ToNumber()); int num1 = int32 < 0 ? Math.Max(target.Length + int32, 0) : Math.Min(int32, target.Length); int num2 = Math.Min(Math.Max(Convert.ToInt32(parameters[1].ToNumber()), 0), target.Length - num1); int length1 = target.Length; int num3; for (int i = 0; i < num2; ++i) { num3 = int32 + i; string index = num3.ToString(); JsInstance result = (JsInstance)null; if (target.TryGetProperty(index, out result)) { jsArray.put(i, result); } } List <JsInstance> jsInstanceList = new List <JsInstance>(); jsInstanceList.AddRange((IEnumerable <JsInstance>)parameters); jsInstanceList.RemoveAt(0); jsInstanceList.RemoveAt(0); if (jsInstanceList.Count < num2) { for (int index1 = num1; index1 < length1 - num2; ++index1) { JsInstance result = (JsInstance)null; num3 = index1 + num2; string index2 = num3.ToString(); num3 = index1 + jsInstanceList.Count; string index3 = num3.ToString(); if (target.TryGetProperty(index2, out result)) { target[index3] = result; } else { target.Delete(index3); } } for (int length2 = target.Length; length2 > length1 - num2 + jsInstanceList.Count; --length2) { JsObject jsObject = target; num3 = length2 - 1; string index = num3.ToString(); jsObject.Delete(index); } target.Length = length1 - num2 + jsInstanceList.Count; } else { for (int index1 = length1 - num2; index1 > num1; --index1) { JsInstance result = (JsInstance)null; num3 = index1 + num2 - 1; string index2 = num3.ToString(); num3 = index1 + jsInstanceList.Count - 1; string index3 = num3.ToString(); if (target.TryGetProperty(index2, out result)) { target[index3] = result; } else { target.Delete(index3); } } } for (int index = 0; index < jsInstanceList.Count; ++index) { target[index.ToString()] = jsInstanceList[index]; } return((JsInstance)jsArray); }
/// <summary> /// 15.4.4.12 /// </summary> /// <param name="target"></param> /// <param name="parameters"></param> /// <returns></returns> public JsInstance Splice(JsObject target, JsInstance[] parameters) { JsArray array = Global.ArrayClass.New(); int relativeStart = Convert.ToInt32(parameters[0].ToNumber()); int actualStart = relativeStart < 0 ? Math.Max(target.Length + relativeStart, 0) : Math.Min(relativeStart, target.Length); int actualDeleteCount = Math.Min(Math.Max(Convert.ToInt32(parameters[1].ToNumber()), 0), target.Length - actualStart); int len = target.Length; for (int k = 0; k < actualDeleteCount; k++) { string from = (relativeStart + k).ToString(); JsInstance result = null; if (target.TryGetProperty(from, out result)) { array.DefineOwnProperty(k.ToString(), new ValueDescriptor(target, k.ToString(), result)); } } List <JsInstance> items = new List <JsInstance>(); items.AddRange(parameters); items.RemoveAt(0); items.RemoveAt(0); if (items.Count < actualDeleteCount) { for (int k = actualStart; k < len - actualDeleteCount; k++) { JsInstance result = null; string from = (k + actualDeleteCount).ToString(); string to = (k + items.Count).ToString(); if (target.TryGetProperty(from, out result)) { target[to] = result; } else { target.Delete(to); } } for (int k = target.Length; k > len - actualDeleteCount + items.Count; k--) { target.Delete((k - 1).ToString()); } } else { for (int k = len - actualDeleteCount; k > actualStart; k--) { JsInstance result = null; string from = (k + actualDeleteCount - 1).ToString(); string to = (k + items.Count - 1).ToString(); if (target.TryGetProperty(from, out result)) { target[to] = result; } else { target.Delete(to); } } if (target.length != int.MinValue && target.Prototype != Prototype) { target.length += len - actualDeleteCount + items.Count; } for (int k = 0; items.Count > 0; k++) { JsInstance e = items[0]; items.RemoveAt(0); target[k.ToString()] = e; } } return(array); }