167 lines
6.1 KiB
JavaScript
167 lines
6.1 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.ProxyCall = ProxyCall;
|
|
exports.ProxyConstruct = ProxyConstruct;
|
|
exports.ProxyCreate = ProxyCreate;
|
|
|
|
var _index = require("../values/index.js");
|
|
|
|
var _is = require("./is.js");
|
|
|
|
var _get = require("./get.js");
|
|
|
|
var _construct = require("./construct.js");
|
|
|
|
var _call = require("./call.js");
|
|
|
|
var _singletons = require("../singletons.js");
|
|
|
|
var _invariant = require("../invariant.js");
|
|
|
|
var _invariant2 = _interopRequireDefault(_invariant);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
// ECMA262 9.5.12
|
|
/**
|
|
* Copyright (c) 2017-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
function ProxyCall(realm, O, thisArgument, argumentsList) {
|
|
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
|
|
var handler = O.$ProxyHandler;
|
|
|
|
// 2. If handler is null, throw a TypeError exception.
|
|
if (handler instanceof _index.NullValue) {
|
|
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
|
}
|
|
|
|
// 3. Assert: Type(handler) is Object.
|
|
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected an object");
|
|
|
|
// 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
|
|
var target = O.$ProxyTarget;
|
|
|
|
// 5. Let trap be ? GetMethod(handler, "apply").
|
|
var trap = (0, _get.GetMethod)(realm, handler, "apply");
|
|
|
|
// 6. If trap is undefined, then
|
|
if (trap instanceof _index.UndefinedValue) {
|
|
// a. Return ? Call(target, thisArgument, argumentsList).
|
|
return (0, _call.Call)(realm, target, thisArgument, argumentsList);
|
|
}
|
|
|
|
// 7. Let argArray be CreateArrayFromList(argumentsList).
|
|
var argArray = _singletons.Create.CreateArrayFromList(realm, argumentsList);
|
|
|
|
// 8. Return ? Call(trap, handler, « target, thisArgument, argArray »).
|
|
return (0, _call.Call)(realm, trap.throwIfNotConcrete(), handler, [target, thisArgument, argArray]);
|
|
}
|
|
|
|
// ECMA262 9.5.13
|
|
function ProxyConstruct(realm, O, argumentsList, newTarget) {
|
|
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
|
|
var handler = O.$ProxyHandler;
|
|
|
|
// 2. If handler is null, throw a TypeError exception.
|
|
if (handler instanceof _index.NullValue) {
|
|
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
|
}
|
|
|
|
// 3. Assert: Type(handler) is Object.
|
|
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected an object");
|
|
|
|
// 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
|
|
var target = O.$ProxyTarget;
|
|
(0, _invariant2.default)(target instanceof _index.ObjectValue);
|
|
|
|
// 5. Let trap be ? GetMethod(handler, "construct").
|
|
var trap = (0, _get.GetMethod)(realm, handler, "construct");
|
|
|
|
// 6. If trap is undefined, then
|
|
if (trap instanceof _index.UndefinedValue) {
|
|
// a. Assert: target has a [[Construct]] internal method.
|
|
(0, _invariant2.default)(target.$Construct, "expected construct method");
|
|
|
|
// b. Return ? Construct(target, argumentsList, newTarget).
|
|
return (0, _construct.Construct)(realm, target, argumentsList, newTarget);
|
|
}
|
|
|
|
// 7. Let argArray be CreateArrayFromList(argumentsList).
|
|
var argArray = _singletons.Create.CreateArrayFromList(realm, argumentsList);
|
|
|
|
// 8. Let newObj be ? Call(trap, handler, « target, argArray, newTarget »).
|
|
var newObj = (0, _call.Call)(realm, trap.throwIfNotConcrete(), handler, [target, argArray, newTarget]).throwIfNotConcrete();
|
|
|
|
// 9. If Type(newObj) is not Object, throw a TypeError exception.
|
|
if (!(newObj instanceof _index.ObjectValue)) {
|
|
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
|
}
|
|
|
|
// 10. Return newObj.
|
|
return newObj;
|
|
}
|
|
|
|
// ECMA262 9.5.14
|
|
function ProxyCreate(realm, target, handler) {
|
|
target = target.throwIfNotConcrete();
|
|
|
|
// 1. If Type(target) is not Object, throw a TypeError exception.
|
|
if (!(target instanceof _index.ObjectValue)) {
|
|
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
|
}
|
|
|
|
// 2. If target is a Proxy exotic object and the value of the [[ProxyHandler]] internal slot of target is null, throw a TypeError exception.
|
|
if (target instanceof _index.ProxyValue && (!target.$ProxyHandler || target.$ProxyHandler instanceof _index.NullValue)) {
|
|
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
|
}
|
|
|
|
handler = handler.throwIfNotConcrete();
|
|
// 3. If Type(handler) is not Object, throw a TypeError exception.
|
|
if (!(handler instanceof _index.ObjectValue)) {
|
|
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
|
}
|
|
|
|
// 4. If handler is a Proxy exotic object and the value of the [[ProxyHandler]] internal slot of handler is null, throw a TypeError exception.
|
|
if (handler instanceof _index.ProxyValue && (!handler.$ProxyHandler || handler.$ProxyHandler instanceof _index.NullValue)) {
|
|
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
|
}
|
|
|
|
// 5. Let P be a newly created object.
|
|
// 6. Set P's essential internal methods (except for [[Call]] and [[Construct]]) to the definitions specified in 9.5.
|
|
var P = new _index.ProxyValue(realm);
|
|
|
|
// 7. If IsCallable(target) is true, then
|
|
if ((0, _is.IsCallable)(realm, target)) {
|
|
// a. Set the [[Call]] internal method of P as specified in 9.5.12.
|
|
P.$Call = function (thisArgument, argsList) {
|
|
return ProxyCall(realm, P, thisArgument, argsList);
|
|
};
|
|
|
|
// b. If target has a [[Construct]] internal method, then
|
|
if (target.$Construct) {
|
|
// i. Set the [[Construct]] internal method of P as specified in 9.5.13.
|
|
P.$Construct = function (argumentsList, newTarget) {
|
|
return ProxyConstruct(realm, P, argumentsList, newTarget);
|
|
};
|
|
}
|
|
}
|
|
|
|
// 8. Set the [[ProxyTarget]] internal slot of P to target.
|
|
P.$ProxyTarget = target;
|
|
|
|
// 9. Set the [[ProxyHandler]] internal slot of P to handler.
|
|
P.$ProxyHandler = handler;
|
|
|
|
// 10. Return P.
|
|
return P;
|
|
}
|
|
//# sourceMappingURL=proxy.js.map
|