using Jint.Native.Object;
using Jint.Runtime;
using Jint.Runtime.Interop;
namespace Jint.Native.Array
{
///
/// http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4
///
public sealed class ArrayPrototype : ObjectInstance
{
private ArrayPrototype(Engine engine) : base(engine)
{
}
public static ArrayPrototype CreatePrototypeObject(Engine engine, ArrayConstructor arrayConstructor)
{
var obj = new ArrayPrototype(engine) { Extensible = true };
obj.FastAddProperty("constructor", arrayConstructor, false, false, false);
return obj;
}
public void Configure()
{
// Array prototype functions
FastAddProperty("push", new ClrFunctionInstance(Engine, Push), false, false, false);
FastAddProperty("pop", new ClrFunctionInstance(Engine, Pop), false, false, false);
}
public object Push(object thisObject, object[] arguments)
{
var o = TypeConverter.ToObject(Engine, thisObject);
var lenVal = o.Get("length");
var n = TypeConverter.ToUint32(lenVal);
foreach (var e in arguments)
{
o.Put(TypeConverter.ToString(n), e, true);
n++;
}
o.Put("length", n, true);
return n;
}
public object Pop(object thisObject, object[] arguments)
{
var o = TypeConverter.ToObject(Engine, thisObject);
var lenVal = o.Get("length");
var len = TypeConverter.ToUint32(lenVal);
if (len == 0)
{
o.Put("length", 0, true);
return Undefined.Instance;
}
else
{
var indx = TypeConverter.ToString(len - 1);
var element = o.Get(indx);
o.Delete(indx, true);
o.Put("length", indx, true);
return element;
}
}
}
}