Esempio n. 1
0
 internal ScriptProxyObject([NotNull] Realm realm, [NotNull] ScriptObject target, [NotNull] ScriptObject handler) :
     base(realm, null, false, SpecialObjectType.None)
 {
     ProxyTarget  = target;
     ProxyHandler = handler;
 }
Esempio n. 2
0
        internal override ScriptValue Construct([NotNull] IReadOnlyList <ScriptValue> arguments, ScriptObject newTarget)
        {
            //https://tc39.github.io/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget
            if (ProxyHandler == null)
            {
                throw Agent.CreateTypeError();
            }
            Debug.Assert(ProxyTarget != null, nameof(ProxyTarget) + " != null");

            var trap = Agent.GetMethod(ProxyHandler, "construct");

            if (trap == null)
            {
                Debug.Assert(Agent.IsConstructor(ProxyTarget));
                return(Agent.Construct(ProxyTarget, arguments, newTarget));
            }

            var argumentArray = ArrayIntrinsics.CreateArrayFromList(Agent, arguments);
            var newObject     = Agent.Call(trap, ProxyHandler, ProxyTarget, argumentArray, newTarget);

            if (!newObject.IsObject)
            {
                throw Agent.CreateTypeError();
            }

            return(newObject);
        }
Esempio n. 3
0
        /// <inheritdoc />
        internal override ScriptValue Construct(IReadOnlyList <ScriptValue> arguments, ScriptObject newTarget)
        {
            //https://tc39.github.io/ecma262/#sec-bound-function-exotic-objects-construct-argumentslist-newtarget
            Debug.Assert(Agent.IsConstructor(BoundTargetFunction));

            if (this == newTarget)
            {
                newTarget = BoundTargetFunction;
            }

            if (arguments.Count == 0)
            {
                return(Agent.Construct(BoundTargetFunction, BoundArguments, newTarget));
            }

            if (BoundArguments.Count == 0)
            {
                return(Agent.Construct(BoundTargetFunction, arguments, newTarget));
            }

            var args = new ScriptValue[BoundArguments.Count + arguments.Count];

            for (var i = 0; i < BoundArguments.Count; i++)
            {
                args[i] = BoundArguments[i];
            }

            for (var i = 0; i < arguments.Count; i++)
            {
                args[i + BoundArguments.Count] = arguments[i];
            }

            return(Agent.Construct(BoundTargetFunction, args, newTarget));
        }