internal override bool SetPrototypeOf(ScriptObject prototype) { //https://tc39.github.io/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-setprototypeof-v if (ProxyHandler == null) { throw Agent.CreateTypeError(); } Debug.Assert(ProxyTarget != null, nameof(ProxyTarget) + " != null"); var trap = Agent.GetMethod(ProxyHandler, "setPrototypeOf"); if (trap == null) { return(ProxyTarget.SetPrototypeOf(prototype)); } var booleanTrapResult = Agent.ToBoolean(Agent.Call(trap, ProxyHandler, ProxyTarget, prototype)); if (!booleanTrapResult) { return(false); } var extensibleTarget = ProxyTarget.IsExtensible; if (extensibleTarget) { return(true); } var targetPrototype = ProxyTarget.GetPrototypeOf(); if (prototype != targetPrototype) { throw Agent.CreateTypeError(); } return(true); }
internal override ScriptObject GetPrototypeOf() { //https://tc39.github.io/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-getprototypeof if (ProxyHandler == null) { throw Agent.CreateTypeError(); } Debug.Assert(ProxyTarget != null, nameof(ProxyTarget) + " != null"); var trap = Agent.GetMethod(ProxyHandler, "getPrototypeOf"); if (trap == null) { return(ProxyTarget.GetPrototypeOf()); } var handlerPrototype = Agent.Call(trap, ProxyHandler, ProxyTarget); if (handlerPrototype != ScriptValue.Null && !handlerPrototype.IsObject) { throw Agent.CreateTypeError(); } var extensibleTarget = ProxyTarget.IsExtensible; if (extensibleTarget) { return(handlerPrototype == ScriptValue.Null ? null : (ScriptObject)handlerPrototype); } var targetPrototype = ProxyTarget.GetPrototypeOf(); if (!handlerPrototype.SameValue(targetPrototype)) { throw Agent.CreateTypeError(); } return(handlerPrototype == ScriptValue.Null ? null : (ScriptObject)handlerPrototype); }