ArrayPrototype.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Jint.Native.Object;
  2. using Jint.Runtime;
  3. using Jint.Runtime.Interop;
  4. namespace Jint.Native.Array
  5. {
  6. /// <summary>
  7. /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4
  8. /// </summary>
  9. public sealed class ArrayPrototype : ObjectInstance
  10. {
  11. private ArrayPrototype(Engine engine) : base(engine)
  12. {
  13. }
  14. public static ArrayPrototype CreatePrototypeObject(Engine engine, ArrayConstructor arrayConstructor)
  15. {
  16. var obj = new ArrayPrototype(engine) { Extensible = true };
  17. obj.FastAddProperty("constructor", arrayConstructor, false, false, false);
  18. // Array prototype functions
  19. obj.FastAddProperty("push", new ClrFunctionInstance<ArrayInstance, object>(engine, obj.Push), false, false, false);
  20. obj.FastAddProperty("pop", new ClrFunctionInstance<ArrayInstance, object>(engine, obj.Pop), false, false, false);
  21. return obj;
  22. }
  23. public object Push(object thisObject, object[] arguments)
  24. {
  25. var o = TypeConverter.ToObject(Engine, thisObject);
  26. var lenVal = o.Get("length");
  27. var n = TypeConverter.ToUint32(lenVal);
  28. foreach (var e in arguments)
  29. {
  30. o.Put(TypeConverter.ToString(n), e, true);
  31. n++;
  32. }
  33. o.Put("length", n, true);
  34. return n;
  35. }
  36. public object Pop(object thisObject, object[] arguments)
  37. {
  38. var o = TypeConverter.ToObject(Engine, thisObject);
  39. var lenVal = o.Get("length");
  40. var len = TypeConverter.ToUint32(lenVal);
  41. if (len == 0)
  42. {
  43. o.Put("length", 0, true);
  44. return Undefined.Instance;
  45. }
  46. else
  47. {
  48. var indx = TypeConverter.ToString(len - 1);
  49. var element = o.Get(indx);
  50. o.Delete(indx, true);
  51. o.Put("length", indx, true);
  52. return element;
  53. }
  54. }
  55. }
  56. }