using Jint.Runtime;
using Jint.Runtime.Descriptors;
using Jint.Runtime.Interop;
namespace Jint.Native.Boolean
{
///
/// http://www.ecma-international.org/ecma-262/5.1/#sec-15.6.4
///
public sealed class BooleanPrototype : BooleanInstance
{
private BooleanPrototype(Engine engine) : base(engine)
{
}
public static BooleanPrototype CreatePrototypeObject(Engine engine, BooleanConstructor booleanConstructor)
{
var obj = new BooleanPrototype(engine);
obj.Prototype = engine.Object.PrototypeObject;
obj.PrimitiveValue = false;
obj.Extensible = true;
obj.SetOwnProperty("constructor", new PropertyDescriptor(booleanConstructor, PropertyFlag.NonEnumerable));
return obj;
}
public void Configure()
{
FastAddProperty("toString", new ClrFunctionInstance(Engine, ToBooleanString), true, false, true);
FastAddProperty("valueOf", new ClrFunctionInstance(Engine, ValueOf), true, false, true);
}
private JsValue ValueOf(JsValue thisObj, JsValue[] arguments)
{
var B = thisObj;
if (B.IsBoolean())
{
return B;
}
var o = B.TryCast();
if (!ReferenceEquals(o, null))
{
return o.PrimitiveValue;
}
throw new JavaScriptException(Engine.TypeError);
}
private JsValue ToBooleanString(JsValue thisObj, JsValue[] arguments)
{
var b = ValueOf(thisObj, Arguments.Empty);
return ((JsBoolean) b)._value ? "true" : "false";
}
}
}