internal ScriptProxyObject([NotNull] Realm realm, [NotNull] ScriptObject target, [NotNull] ScriptObject handler) : base(realm, null, false, SpecialObjectType.None) { ProxyTarget = target; ProxyHandler = handler; }
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); }
/// <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)); }