Files
asciidisco.com/build/node_modules/prepack/lib/values/ProxyValue.js
2023-08-01 13:49:46 +02:00

948 lines
40 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _realm = require("../realm.js");
var _index = require("./index.js");
var _invariant = require("../invariant.js");
var _invariant2 = _interopRequireDefault(_invariant);
var _abstract = require("../methods/abstract.js");
var _get = require("../methods/get.js");
var _is = require("../methods/is.js");
var _singletons = require("../singletons.js");
var _call = require("../methods/call.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**
* 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 FindPropertyKey(realm, keys, key) {
for (var i = 0; i < keys.length; ++i) {
if ((0, _abstract.SamePropertyKey)(realm, key, keys[i])) {
return i;
}
}
return -1;
}
var ProxyValue = function (_ObjectValue) {
_inherits(ProxyValue, _ObjectValue);
function ProxyValue(realm) {
_classCallCheck(this, ProxyValue);
// $FlowFixMe TODO #1022: exotics should not have $Realm
var _this = _possibleConstructorReturn(this, (ProxyValue.__proto__ || Object.getPrototypeOf(ProxyValue)).call(this, realm));
_this.$Realm = undefined;
_this.realm = realm;
return _this;
}
_createClass(ProxyValue, [{
key: "getTrackedBindings",
value: function getTrackedBindings() {
return ProxyValue.trackedPropertyNames;
}
}, {
key: "isSimpleObject",
value: function isSimpleObject() {
return false;
}
// ECMA262 9.5.1
}, {
key: "$GetPrototypeOf",
value: function $GetPrototypeOf() {
var realm = this.realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$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 = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 5. Let trap be ? GetMethod(handler, "getPrototypeOf").
var trap = (0, _get.GetMethod)(realm, handler, "getPrototypeOf");
// 6. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[GetPrototypeOf]]().
return target.$GetPrototypeOf();
}
// 7. Let handlerProto be ? Call(trap, handler, « target »).
var handlerProto = (0, _call.Call)(realm, trap, handler, [target]);
// 8. If Type(handlerProto) is neither Object nor Null, throw a TypeError exception.
if (!(handlerProto instanceof _index.ObjectValue) && !(handlerProto instanceof _index.NullValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 9. Let extensibleTarget be ? IsExtensible(target).
var extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 10. If extensibleTarget is true, return handlerProto.
if (extensibleTarget) return handlerProto;
// 11. Let targetProto be ? target.[[GetPrototypeOf]]().
var targetProto = target.$GetPrototypeOf();
// 12. If SameValue(handlerProto, targetProto) is false, throw a TypeError exception.
if (!(0, _abstract.SameValue)(realm, handlerProto, targetProto)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 13. Return handlerProto.
return handlerProto;
}
// ECMA262 9.5.2
}, {
key: "$SetPrototypeOf",
value: function $SetPrototypeOf(V) {
var realm = this.realm;
// 1. Assert: Either Type(V) is Object or Type(V) is Null.
(0, _invariant2.default)(V instanceof _index.ObjectValue || V instanceof _index.NullValue, "expected object or null");
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$ProxyHandler;
// 3. If handler is null, throw a TypeError exception.
if (handler instanceof _index.NullValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 4. Assert: Type(handler) is Object.
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected object");
// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "setPrototypeOf").
var trap = (0, _get.GetMethod)(realm, handler, "setPrototypeOf");
// 7. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[SetPrototypeOf]](V).
return target.$SetPrototypeOf(V);
}
// 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, V »)).
var booleanTrapResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, trap, handler, [target, V]));
// 9. If booleanTrapResult is false, return false.
if (!booleanTrapResult) return false;
// 10. Let extensibleTarget be ? IsExtensible(target).
var extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 11. If extensibleTarget is true, return true.
if (extensibleTarget) return true;
// 12. Let targetProto be ? target.[[GetPrototypeOf]]().
var targetProto = target.$GetPrototypeOf();
// 13. If SameValue(V, targetProto) is false, throw a TypeError exception.
if (!(0, _abstract.SameValue)(realm, V, targetProto)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 14. Return true.
return true;
}
// ECMA262 9.5.3
}, {
key: "$IsExtensible",
value: function $IsExtensible() {
var realm = this.realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$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 object");
// 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
// 5. Let trap be ? GetMethod(handler, "isExtensible").
var trap = (0, _get.GetMethod)(realm, handler, "isExtensible");
// 6. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[IsExtensible]]().
(0, _invariant2.default)(target instanceof _index.ObjectValue);
return target.$IsExtensible();
}
// 7. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target »)).
var booleanTrapResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, trap, handler, [target]));
// 8. Let targetResult be ? target.[[IsExtensible]]().
(0, _invariant2.default)(target instanceof _index.ObjectValue);
var targetResult = target.$IsExtensible();
// 9. If SameValue(booleanTrapResult, targetResult) is false, throw a TypeError exception.
if (booleanTrapResult !== targetResult) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 10. Return booleanTrapResult.
return booleanTrapResult;
}
// ECMA262 9.5.4
}, {
key: "$PreventExtensions",
value: function $PreventExtensions() {
var realm = this.realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$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 object");
// 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
// 5. Let trap be ? GetMethod(handler, "preventExtensions").
var trap = (0, _get.GetMethod)(realm, handler, "preventExtensions");
// 6. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[PreventExtensions]]().
(0, _invariant2.default)(target instanceof _index.ObjectValue);
return target.$PreventExtensions();
}
// 7. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target »)).
var booleanTrapResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, trap, handler, [target]));
// 8. If booleanTrapResult is true, then
if (booleanTrapResult) {
// a. Let targetIsExtensible be ? target.[[IsExtensible]]().
(0, _invariant2.default)(target instanceof _index.ObjectValue);
var targetIsExtensible = target.$IsExtensible();
// b. If targetIsExtensible is true, throw a TypeError exception.
if (targetIsExtensible) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
// 9. Return booleanTrapResult.
return booleanTrapResult;
}
// ECMA262 9.5.5
}, {
key: "$GetOwnProperty",
value: function $GetOwnProperty(P) {
var realm = this.realm;
// 1. Assert: IsPropertyKey(P) is true.
(0, _invariant2.default)((0, _is.IsPropertyKey)(realm, P), "expected property key");
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$ProxyHandler;
// 3. If handler is null, throw a TypeError exception.
if (handler instanceof _index.NullValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 4. Assert: Type(handler) is Object.
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected object");
// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor").
var trap = (0, _get.GetMethod)(realm, handler, "getOwnPropertyDescriptor");
// 7. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[GetOwnProperty]](P).
return target.$GetOwnProperty(P);
}
// 8. Let trapResultObj be ? Call(trap, handler, « target, P »).
var trapResultObj = (0, _call.Call)(realm, trap, handler, [target, typeof P === "string" ? new _index.StringValue(realm, P) : P]);
// 9. If Type(trapResultObj) is neither Object nor Undefined, throw a TypeError exception.
if (!(trapResultObj instanceof _index.ObjectValue) && !(trapResultObj instanceof _index.UndefinedValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 10. Let targetDesc be ? target.[[GetOwnProperty]](P).
var targetDesc = target.$GetOwnProperty(P);
// 11. If trapResultObj is undefined, then
if (trapResultObj instanceof _index.UndefinedValue) {
// a. If targetDesc is undefined, return undefined.
if (!targetDesc) return undefined;
_singletons.Properties.ThrowIfMightHaveBeenDeleted(targetDesc.value);
// b. If targetDesc.[[Configurable]] is false, throw a TypeError exception.
if (!targetDesc.configurable) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// c. Let extensibleTarget be ? IsExtensible(target).
var _extensibleTarget = (0, _is.IsExtensible)(realm, target);
// d. Assert: Type(extensibleTarget) is Boolean.
(0, _invariant2.default)(typeof _extensibleTarget === "boolean", "expected boolean");
// e. If extensibleTarget is false, throw a TypeError exception.
if (!_extensibleTarget) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// f. Return undefined.
return undefined;
}
// 12. Let extensibleTarget be ? IsExtensible(target).
var extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 13. Let resultDesc be ? ToPropertyDescriptor(trapResultObj).
var resultDesc = _singletons.To.ToPropertyDescriptor(realm, trapResultObj);
// 14. Call CompletePropertyDescriptor(resultDesc).
_singletons.Properties.CompletePropertyDescriptor(realm, resultDesc);
// 15. Let valid be IsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc).
var valid = _singletons.Properties.IsCompatiblePropertyDescriptor(realm, extensibleTarget, resultDesc, targetDesc);
// 16. If valid is false, throw a TypeError exception.
if (!valid) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 17. If resultDesc.[[Configurable]] is false, then
if (!resultDesc.configurable) {
// a. If targetDesc is undefined or targetDesc.[[Configurable]] is true, then
if (!targetDesc || targetDesc.configurable) {
// i. Throw a TypeError exception.
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
// 18. Return resultDesc.
return resultDesc;
}
// ECMA262 9.5.6
}, {
key: "$DefineOwnProperty",
value: function $DefineOwnProperty(P, Desc) {
var realm = this.realm;
// 1. Assert: IsPropertyKey(P) is true.
(0, _invariant2.default)((0, _is.IsPropertyKey)(realm, P), "expected property key");
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$ProxyHandler;
// 3. If handler is null, throw a TypeError exception.
if (handler instanceof _index.NullValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 4. Assert: Type(handler) is Object.
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected object");
// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "defineProperty").
var trap = (0, _get.GetMethod)(realm, handler, "defineProperty");
// 7. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[DefineOwnProperty]](P, Desc).
return target.$DefineOwnProperty(P, Desc);
}
// 8. Let descObj be FromPropertyDescriptor(Desc).
var descObj = _singletons.Properties.FromPropertyDescriptor(realm, Desc);
// 9. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, P, descObj »)).
var booleanTrapResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, trap, handler, [target, typeof P === "string" ? new _index.StringValue(realm, P) : P, descObj]));
// 10. If booleanTrapResult is false, return false.
if (!booleanTrapResult) return false;
// 11. Let targetDesc be ? target.[[GetOwnProperty]](P).
var targetDesc = target.$GetOwnProperty(P);
// 12. Let extensibleTarget be ? IsExtensible(target).
var extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 13. If Desc has a [[Configurable]] field and if Desc.[[Configurable]] is false, then
var settingConfigFalse = void 0;
if ("configurable" in Desc && !Desc.configurable) {
// a. Let settingConfigFalse be true.
settingConfigFalse = true;
} else {
// 14. Else let settingConfigFalse be false.
settingConfigFalse = false;
}
// 15. If targetDesc is undefined, then
if (!targetDesc) {
// a. If extensibleTarget is false, throw a TypeError exception.
if (!extensibleTarget) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// b. If settingConfigFalse is true, throw a TypeError exception.
if (settingConfigFalse) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
} else {
// 16. Else targetDesc is not undefined,
_singletons.Properties.ThrowIfMightHaveBeenDeleted(targetDesc.value);
// a. If IsCompatiblePropertyDescriptor(extensibleTarget, Desc, targetDesc) is false, throw a TypeError exception.
if (!_singletons.Properties.IsCompatiblePropertyDescriptor(realm, extensibleTarget, Desc, targetDesc)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// b. If settingConfigFalse is true and targetDesc.[[Configurable]] is true, throw a TypeError exception.
if (settingConfigFalse && targetDesc.configurable) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
// 17. Return true.
return true;
}
// ECMA262 9.5.7
}, {
key: "$HasProperty",
value: function $HasProperty(P) {
var realm = this.realm;
// 1. Assert: IsPropertyKey(P) is true.
(0, _invariant2.default)((0, _is.IsPropertyKey)(realm, P), "expected property key");
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$ProxyHandler;
// 3. If handler is null, throw a TypeError exception.
if (handler instanceof _index.NullValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 4. Assert: Type(handler) is Object.
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected object");
// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "has").
var trap = (0, _get.GetMethod)(realm, handler, "has");
// 7. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[HasProperty]](P).
return target.$HasProperty(P);
}
// 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, P »)).
var booleanTrapResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, trap, handler, [target, typeof P === "string" ? new _index.StringValue(realm, P) : P]));
// 9. If booleanTrapResult is false, then
if (!booleanTrapResult) {
// a. Let targetDesc be ? target.[[GetOwnProperty]](P).
var targetDesc = target.$GetOwnProperty(P);
// b. If targetDesc is not undefined, then
if (targetDesc) {
_singletons.Properties.ThrowIfMightHaveBeenDeleted(targetDesc.value);
// i. If targetDesc.[[Configurable]] is false, throw a TypeError exception.
if (!targetDesc.configurable) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// ii. Let extensibleTarget be ? IsExtensible(target).
var extensibleTarget = (0, _is.IsExtensible)(realm, target);
// iii. If extensibleTarget is false, throw a TypeError exception.
if (!extensibleTarget) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
}
// 10. Return booleanTrapResult.
return booleanTrapResult;
}
// ECMA262 9.5.8
}, {
key: "$Get",
value: function $Get(P, Receiver) {
var realm = this.realm;
// 1. Assert: IsPropertyKey(P) is true.
(0, _invariant2.default)((0, _is.IsPropertyKey)(realm, P), "expected property key");
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$ProxyHandler;
// 3. If handler is null, throw a TypeError exception.
if (handler instanceof _index.NullValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 4. Assert: Type(handler) is Object.
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected object");
// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "get").
var trap = (0, _get.GetMethod)(realm, handler, "get");
// 7. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[Get]](P, Receiver).
return target.$Get(P, Receiver);
}
// 8. Let trapResult be ? Call(trap, handler, « target, P, Receiver »).
var trapResult = (0, _call.Call)(realm, trap, handler, [target, typeof P === "string" ? new _index.StringValue(realm, P) : P, Receiver]);
// 9. Let targetDesc be ? target.[[GetOwnProperty]](P).
var targetDesc = target.$GetOwnProperty(P);
// 10. If targetDesc is not undefined, then
if (targetDesc) {
_singletons.Properties.ThrowIfMightHaveBeenDeleted(targetDesc.value);
// a. If IsDataDescriptor(targetDesc) is true and targetDesc.[[Configurable]] is false and targetDesc.[[Writable]] is false, then
if ((0, _is.IsDataDescriptor)(realm, targetDesc) && targetDesc.configurable === false && targetDesc.writable === false) {
// i. If SameValue(trapResult, targetDesc.[[Value]]) is false, throw a TypeError exception.
var targetValue = targetDesc.value || realm.intrinsics.undefined;
(0, _invariant2.default)(targetValue instanceof _index.Value);
if (!(0, _abstract.SameValuePartial)(realm, trapResult, targetValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
// b. If IsAccessorDescriptor(targetDesc) is true and targetDesc.[[Configurable]] is false and targetDesc.[[Get]] is undefined, then
if ((0, _is.IsAccessorDescriptor)(realm, targetDesc) && targetDesc.configurable === false && (!targetDesc.get || targetDesc.get instanceof _index.UndefinedValue)) {
// i. If trapResult is not undefined, throw a TypeError exception.
if (!(trapResult instanceof _index.UndefinedValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
}
// 11. Return trapResult.
return trapResult;
}
// ECMA262 9.5.9
}, {
key: "$Set",
value: function $Set(P, V, Receiver) {
var realm = this.realm;
// 1. Assert: IsPropertyKey(P) is true.
(0, _invariant2.default)((0, _is.IsPropertyKey)(realm, P), "expected property key");
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$ProxyHandler;
// 3. If handler is null, throw a TypeError exception.
if (handler instanceof _index.NullValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 4. Assert: Type(handler) is Object.
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected object");
// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
// 6. Let trap be ? GetMethod(handler, "set").
var trap = (0, _get.GetMethod)(realm, handler, "set");
// 7. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[Set]](P, V, Receiver).
(0, _invariant2.default)(target instanceof _index.ObjectValue);
return target.$Set(P, V, Receiver);
}
// 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, P, V, Receiver »)).
var booleanTrapResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, trap, handler, [target, typeof P === "string" ? new _index.StringValue(realm, P) : P, V, Receiver]));
// 9. If booleanTrapResult is false, return false.
if (!booleanTrapResult) return false;
// 10. Let targetDesc be ? target.[[GetOwnProperty]](P).
(0, _invariant2.default)(target instanceof _index.ObjectValue);
var targetDesc = target.$GetOwnProperty(P);
// 11. If targetDesc is not undefined, then
if (targetDesc) {
_singletons.Properties.ThrowIfMightHaveBeenDeleted(targetDesc.value);
// a. If IsDataDescriptor(targetDesc) is true and targetDesc.[[Configurable]] is false and targetDesc.[[Writable]] is false, then
if ((0, _is.IsDataDescriptor)(realm, targetDesc) && !targetDesc.configurable && !targetDesc.writable) {
// i. If SameValue(V, targetDesc.[[Value]]) is false, throw a TypeError exception.
var targetValue = targetDesc.value || realm.intrinsics.undefined;
(0, _invariant2.default)(targetValue instanceof _index.Value);
if (!(0, _abstract.SameValuePartial)(realm, V, targetValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
// b. If IsAccessorDescriptor(targetDesc) is true and targetDesc.[[Configurable]] is false, then
if ((0, _is.IsAccessorDescriptor)(realm, targetDesc) && !targetDesc.configurable) {
// i. If targetDesc.[[Set]] is undefined, throw a TypeError exception.
if (!targetDesc.set || targetDesc.set instanceof _index.UndefinedValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
}
}
// 12. Return true.
return true;
}
// ECMA262 9.5.10
}, {
key: "$Delete",
value: function $Delete(P) {
var realm = this.realm;
// 1. Assert: IsPropertyKey(P) is true.
(0, _invariant2.default)((0, _is.IsPropertyKey)(realm, P), "expected property key");
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$ProxyHandler;
// 3. If handler is null, throw a TypeError exception.
if (handler instanceof _index.NullValue) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 4. Assert: Type(handler) is Object.
(0, _invariant2.default)(handler instanceof _index.ObjectValue, "expected object");
// 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
// 6. Let trap be ? GetMethod(handler, "deleteProperty").
var trap = (0, _get.GetMethod)(realm, handler, "deleteProperty");
// 7. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[Delete]](P).
(0, _invariant2.default)(target instanceof _index.ObjectValue);
return target.$Delete(P);
}
// 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, P »)).
var booleanTrapResult = _singletons.To.ToBooleanPartial(realm, (0, _call.Call)(realm, trap, handler, [target, typeof P === "string" ? new _index.StringValue(realm, P) : P]));
// 9. If booleanTrapResult is false, return false.
if (!booleanTrapResult) return false;
// 10. Let targetDesc be ? target.[[GetOwnProperty]](P).
(0, _invariant2.default)(target instanceof _index.ObjectValue);
var targetDesc = target.$GetOwnProperty(P);
// 11. If targetDesc is undefined, return true.
if (!targetDesc) return true;
_singletons.Properties.ThrowIfMightHaveBeenDeleted(targetDesc.value);
// 12. If targetDesc.[[Configurable]] is false, throw a TypeError exception.
if (!targetDesc.configurable) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 13. Return true.
return true;
}
// ECMA262 9.5.11
}, {
key: "$OwnPropertyKeys",
value: function $OwnPropertyKeys() {
var realm = this.realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
var handler = this.$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 object");
// 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
var target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 5. Let trap be ? GetMethod(handler, "ownKeys").
var trap = (0, _get.GetMethod)(realm, handler, "ownKeys");
// 6. If trap is undefined, then
if (trap instanceof _index.UndefinedValue) {
// a. Return ? target.[[OwnPropertyKeys]]().
return target.$OwnPropertyKeys();
}
// 7. Let trapResultArray be ? Call(trap, handler, « target »).
var trapResultArray = (0, _call.Call)(realm, trap, handler, [target]);
// 8. Let trapResult be ? CreateListFromArrayLike(trapResultArray, « String, Symbol »).
var trapResult = _singletons.Create.CreateListFromArrayLike(realm, trapResultArray, ["String", "Symbol"]);
// 9. Let extensibleTarget be ? IsExtensible(target).
var extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 10. Let targetKeys be ? target.[[OwnPropertyKeys]]().
var targetKeys = target.$OwnPropertyKeys();
// 11. Assert: targetKeys is a List containing only String and Symbol values.
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = targetKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var key = _step.value;
(0, _invariant2.default)(key instanceof _index.SymbolValue || key instanceof _index.StringValue, "expected string or symbol");
}
// 12. Let targetConfigurableKeys be a new empty List.
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var targetConfigurableKeys = [];
// 13. Let targetNonconfigurableKeys be a new empty List.
var targetNonconfigurableKeys = [];
// 14. Repeat, for each element key of targetKeys,
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = targetKeys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var _key = _step2.value;
// a. Let desc be ? target.[[GetOwnProperty]](key).
var desc = target.$GetOwnProperty(_key);
if (desc) _singletons.Properties.ThrowIfMightHaveBeenDeleted(desc.value);
// b. If desc is not undefined and desc.[[Configurable]] is false, then
if (desc && desc.configurable === false) {
// i. Append key as an element of targetNonconfigurableKeys.
targetNonconfigurableKeys.push(_key);
} else {
// c. Else,
// i. Append key as an element of targetConfigurableKeys.
targetConfigurableKeys.push(_key);
}
}
// 15. If extensibleTarget is true and targetNonconfigurableKeys is empty, then
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
if (extensibleTarget && !targetNonconfigurableKeys.length) {
// a. Return trapResult.
return trapResult;
}
// 16. Let uncheckedResultKeys be a new List which is a copy of trapResult.
var uncheckedResultKeys = trapResult.slice();
// 17. Repeat, for each key that is an element of targetNonconfigurableKeys,
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = targetNonconfigurableKeys[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var _key2 = _step3.value;
// a. If key is not an element of uncheckedResultKeys, throw a TypeError exception.
var index = FindPropertyKey(realm, uncheckedResultKeys, _key2);
if (index < 0) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "key is not an element of uncheckedResultKeys");
}
// b. Remove key from uncheckedResultKeys.
uncheckedResultKeys.splice(index, 1);
}
// 18. If extensibleTarget is true, return trapResult.
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
if (extensibleTarget) return trapResult;
// 19. Repeat, for each key that is an element of targetConfigurableKeys,
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = targetConfigurableKeys[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
var _key3 = _step4.value;
// a. If key is not an element of uncheckedResultKeys, throw a TypeError exception.
var index = FindPropertyKey(realm, uncheckedResultKeys, _key3);
if (index < 0) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "key is not an element of uncheckedResultKeys");
}
// b. Remove key from uncheckedResultKeys.
uncheckedResultKeys.splice(index, 1);
}
// 20. If uncheckedResultKeys is not empty, throw a TypeError exception.
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4.return) {
_iterator4.return();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
if (uncheckedResultKeys.length) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 21. Return trapResult.
return trapResult;
}
}]);
return ProxyValue;
}(_index.ObjectValue);
ProxyValue.trackedPropertyNames = _index.ObjectValue.trackedPropertyNames.concat(["$ProxyTarget", "$ProxyHandler"]);
exports.default = ProxyValue;
//# sourceMappingURL=ProxyValue.js.map