using Jint.Native.Errors; using Jint.Native.Object; using Jint.Parser.Ast; using Jint.Runtime.Environments; namespace Jint.Native.Function { public abstract class FunctionInstance : ObjectInstance, ICallable { private readonly Engine _engine; protected FunctionInstance(Engine engine, ObjectInstance prototype, Identifier[] parameters, LexicalEnvironment scope, bool strict) : base(prototype) { _engine = engine; FormalParameters = parameters; Scope = scope; Strict = strict; } /// /// Executed when a function object is used as a function /// /// /// /// public abstract object Call(object thisObject, object[] arguments); public LexicalEnvironment Scope { get; private set; } public Identifier[] FormalParameters { get; private set; } public bool Strict { get; private set; } // todo: implement public object TargetFunction { get; set; } // todo: implement public object BoundThis { get; set; } // todo: implement public object BoundArgs { get; set; } public bool HasInstance(object instance) { var v = instance as ObjectInstance; if (v == null) { return false; } while (true) { v = v.Prototype; if (v == null) { return false; } if (v == this.Prototype) { return true; } } return false; } public override string Class { get { return "Function"; } } /// /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.5.4 /// /// /// public override object Get(string propertyName) { var v = base.Get(propertyName); var f = v as FunctionInstance; if (propertyName == "caller" && f != null && f.Strict) { throw new TypeError(); } return v; } } }