prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
806 lines (612 loc) • 31.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
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 }; }
/**
* 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 (let i = 0; i < keys.length; ++i) {
if ((0, _abstract.SamePropertyKey)(realm, key, keys[i])) {
return i;
}
}
return -1;
}
class ProxyValue extends _index.ObjectValue {
constructor(realm) {
super(realm);
}
getTrackedPropertyNames() {
return ProxyValue.trackedPropertyNames;
}
isSimpleObject() {
return false;
}
// ECMA262 9.5.1
$GetPrototypeOf() {
let realm = this.$Realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
let 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.
let target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 5. Let trap be ? GetMethod(handler, "getPrototypeOf").
let 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 »).
let 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).
let extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 10. If extensibleTarget is true, return handlerProto.
if (extensibleTarget) return handlerProto;
// 11. Let targetProto be ? target.[[GetPrototypeOf]]().
let 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
$SetPrototypeOf(V) {
let 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.
let 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.
let target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "setPrototypeOf").
let 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 »)).
let 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).
let extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 11. If extensibleTarget is true, return true.
if (extensibleTarget) return true;
// 12. Let targetProto be ? target.[[GetPrototypeOf]]().
let 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
$IsExtensible() {
let realm = this.$Realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
let 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.
let target = this.$ProxyTarget;
// 5. Let trap be ? GetMethod(handler, "isExtensible").
let 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 »)).
let 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);
let 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
$PreventExtensions() {
let realm = this.$Realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
let 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.
let target = this.$ProxyTarget;
// 5. Let trap be ? GetMethod(handler, "preventExtensions").
let 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 »)).
let 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);
let 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
$GetOwnProperty(P) {
let 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.
let 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.
let target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor").
let 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 »).
let 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).
let 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).
let 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).
let extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 13. Let resultDesc be ? ToPropertyDescriptor(trapResultObj).
let resultDesc = _singletons.To.ToPropertyDescriptor(realm, trapResultObj);
// 14. Call CompletePropertyDescriptor(resultDesc).
_singletons.Properties.CompletePropertyDescriptor(realm, resultDesc);
// 15. Let valid be IsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc).
let 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
$DefineOwnProperty(P, Desc) {
let 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.
let 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.
let target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "defineProperty").
let 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).
let descObj = _singletons.Properties.FromPropertyDescriptor(realm, Desc);
// 9. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, P, descObj »)).
let 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).
let targetDesc = target.$GetOwnProperty(P);
// 12. Let extensibleTarget be ? IsExtensible(target).
let extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 13. If Desc has a [[Configurable]] field and if Desc.[[Configurable]] is false, then
let settingConfigFalse;
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
$HasProperty(P) {
let 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.
let 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.
let target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "has").
let 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 »)).
let 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).
let 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).
let 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
$Get(P, Receiver) {
let 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.
let 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.
let target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 6. Let trap be ? GetMethod(handler, "get").
let 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 »).
let 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).
let 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.
let 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
$Set(P, V, Receiver) {
let 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.
let 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.
let target = this.$ProxyTarget;
// 6. Let trap be ? GetMethod(handler, "set").
let 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 »)).
let 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);
let 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.
let 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
$Delete(P) {
let 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.
let 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.
let target = this.$ProxyTarget;
// 6. Let trap be ? GetMethod(handler, "deleteProperty").
let 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 »)).
let 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);
let 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
$OwnPropertyKeys() {
let realm = this.$Realm;
// 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
let 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.
let target = this.$ProxyTarget;
(0, _invariant2.default)(target instanceof _index.ObjectValue);
// 5. Let trap be ? GetMethod(handler, "ownKeys").
let 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 »).
let trapResultArray = (0, _call.Call)(realm, trap, handler, [target]);
// 8. Let trapResult be ? CreateListFromArrayLike(trapResultArray, « String, Symbol »).
let trapResult = _singletons.Create.CreateListFromArrayLike(realm, trapResultArray, ["String", "Symbol"]);
// 9. Let extensibleTarget be ? IsExtensible(target).
let extensibleTarget = (0, _is.IsExtensible)(realm, target);
// 10. Let targetKeys be ? target.[[OwnPropertyKeys]]().
let targetKeys = target.$OwnPropertyKeys();
// 11. Assert: targetKeys is a List containing only String and Symbol values.
for (let key of targetKeys) {
(0, _invariant2.default)(key instanceof _index.SymbolValue || key instanceof _index.StringValue, "expected string or symbol");
}
// 12. Let targetConfigurableKeys be a new empty List.
let targetConfigurableKeys = [];
// 13. Let targetNonconfigurableKeys be a new empty List.
let targetNonconfigurableKeys = [];
// 14. Repeat, for each element key of targetKeys,
for (let key of targetKeys) {
// a. Let desc be ? target.[[GetOwnProperty]](key).
let 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
if (extensibleTarget && !targetNonconfigurableKeys.length) {
// a. Return trapResult.
return trapResult;
}
// 16. Let uncheckedResultKeys be a new List which is a copy of trapResult.
let uncheckedResultKeys = trapResult.slice();
// 17. Repeat, for each key that is an element of targetNonconfigurableKeys,
for (let key of targetNonconfigurableKeys) {
// a. If key is not an element of uncheckedResultKeys, throw a TypeError exception.
let index = FindPropertyKey(realm, uncheckedResultKeys, key);
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.
if (extensibleTarget) return trapResult;
// 19. Repeat, for each key that is an element of targetConfigurableKeys,
for (let key of targetConfigurableKeys) {
// a. If key is not an element of uncheckedResultKeys, throw a TypeError exception.
let index = FindPropertyKey(realm, uncheckedResultKeys, key);
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.
if (uncheckedResultKeys.length) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 21. Return trapResult.
return trapResult;
}
}
exports.default = ProxyValue;
ProxyValue.trackedPropertyNames = _index.ObjectValue.trackedPropertyNames.concat(["$ProxyTarget", "$ProxyHandler"]);
//# sourceMappingURL=ProxyValue.js.map