internal ScriptFunctionInstance( Engine engine, JintFunctionDefinition function, LexicalEnvironment scope, FunctionThisMode thisMode) : base(engine, function, scope, thisMode) { _function = function; _prototype = _engine.Function.PrototypeObject; _length = new LazyPropertyDescriptor(() => JsNumber.Create(function.Initialize(engine, this).Length), PropertyFlag.Configurable); var proto = new ObjectInstanceWithConstructor(engine, this) { _prototype = _engine.Object.PrototypeObject }; _prototypeDescriptor = new PropertyDescriptor(proto, PropertyFlag.OnlyWritable); if (!function.Strict && !engine._isStrict) { DefineOwnProperty(CommonProperties.Arguments, engine._callerCalleeArgumentsThrowerConfigurable); DefineOwnProperty(CommonProperties.Caller, new PropertyDescriptor(Undefined, PropertyFlag.Configurable)); } }
/// <summary> /// http://www.ecma-international.org/ecma-262/5.1/#sec-13.2 /// </summary> /// <param name="engine"></param> /// <param name="functionDeclaration"></param> /// <param name="scope"></param> /// <param name="strict"></param> public ScriptFunctionInstance( Engine engine, IFunction functionDeclaration, LexicalEnvironment scope, bool strict) : base(engine, functionDeclaration.Id?.Name ?? "", GetParameterNames(functionDeclaration), scope, strict) { _functionDeclaration = functionDeclaration; Extensible = true; Prototype = _engine.Function.PrototypeObject; _length = new PropertyDescriptor(JsNumber.Create(_formalParameters.Length), PropertyFlag.AllForbidden); var proto = new ObjectInstanceWithConstructor(engine, this) { Extensible = true, Prototype = _engine.Object.PrototypeObject }; _prototype = new PropertyDescriptor(proto, PropertyFlag.OnlyWritable); if (_functionDeclaration.Id != null) { DefineOwnProperty("name", new PropertyDescriptor(_functionDeclaration.Id.Name, PropertyFlag.None), false); } if (strict) { var thrower = engine.Function.ThrowTypeError; const PropertyFlag flags = PropertyFlag.EnumerableSet | PropertyFlag.ConfigurableSet; DefineOwnProperty("caller", new GetSetPropertyDescriptor(thrower, thrower, flags), false); DefineOwnProperty("arguments", new GetSetPropertyDescriptor(thrower, thrower, flags), false); } }