using Jint.Native.Function; using Jint.Native.Object; using Jint.Runtime; using Jint.Runtime.Descriptors; using Jint.Runtime.Interop; namespace Jint.Native.String { public sealed class StringConstructor : FunctionInstance, IConstructor { public StringConstructor(Engine engine) : base(engine, null, null, false) { } public static StringConstructor CreateStringConstructor(Engine engine) { var obj = new StringConstructor(engine); obj.Extensible = true; // The value of the [[Prototype]] internal property of the String constructor is the Function prototype object obj.Prototype = engine.Function.PrototypeObject; obj.PrototypeObject = StringPrototype.CreatePrototypeObject(engine, obj); obj.SetOwnProperty("length", new PropertyDescriptor(1, PropertyFlag.AllForbidden)); // The initial value of String.prototype is the String prototype object obj.SetOwnProperty("prototype", new PropertyDescriptor(obj.PrototypeObject, PropertyFlag.AllForbidden)); return obj; } public void Configure() { SetOwnProperty("fromCharCode", new PropertyDescriptor(new ClrFunctionInstance(Engine, FromCharCode, 1), PropertyFlag.NonEnumerable)); } private static JsValue FromCharCode(JsValue thisObj, JsValue[] arguments) { var chars = new char[arguments.Length]; for (var i = 0; i < chars.Length; i++ ) { chars[i] = (char)TypeConverter.ToUint16(arguments[i]); } return new System.String(chars); } public override JsValue Call(JsValue thisObject, JsValue[] arguments) { if (arguments.Length == 0) { return ""; } return TypeConverter.ToString(arguments[0]); } /// /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.2.1 /// /// /// public ObjectInstance Construct(JsValue[] arguments) { return Construct(arguments.Length > 0 ? TypeConverter.ToString(arguments[0]) : ""); } public StringPrototype PrototypeObject { get; private set; } public StringInstance Construct(string value) { return Construct(JsString.Create(value)); } public StringInstance Construct(JsString value) { var instance = new StringInstance(Engine) { Prototype = PrototypeObject, PrimitiveValue = value, Extensible = true, _length = new PropertyDescriptor(value.Length, PropertyFlag.AllForbidden) }; return instance; } } }