示例#1
0
        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);
        }
示例#2
0
        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);
        }