prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
292 lines (201 loc) • 11.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _index = require("../../values/index.js");
var _index2 = require("../../methods/index.js");
var _singletons = require("../../singletons.js");
var _invariant = _interopRequireDefault(require("../../invariant.js"));
var _descriptors = require("../../descriptors.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 _default(realm, obj) {
// ECMA262 23.1.3.1
obj.defineNativeMethod("clear", 0, context => {
// 1. Let M be the this value.
let M = context.throwIfNotConcrete(); // 2. If Type(M) is not Object, throw a TypeError exception.
if (!(M instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. If M does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!M.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Let entries be the List that is the value of M's [[MapData]] internal slot.
realm.recordModifiedProperty(M.$MapData_binding);
let entries = M.$MapData;
(0, _invariant.default)(entries !== undefined); // 5. Repeat for each Record {[[Key]], [[Value]]} p that is an element of entries,
for (let p of entries) {
// a. Set p.[[Key]] to empty.
p.$Key = undefined; // b. Set p.[[Value]] to empty.
p.$Value = undefined;
} // 6. Return undefined.
return realm.intrinsics.undefined;
}); // ECMA262 23.1.3.3
obj.defineNativeMethod("delete", 1, (context, [key]) => {
// 1. Let M be the this value.
let M = context.throwIfNotConcrete(); // 2. If Type(M) is not Object, throw a TypeError exception.
if (!(M instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. If M does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!M.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Let entries be the List that is the value of M's [[MapData]] internal slot.
realm.recordModifiedProperty(M.$MapData_binding);
let entries = M.$MapData;
(0, _invariant.default)(entries !== undefined); // 5. Repeat for each Record {[[Key]], [[Value]]} p that is an element of entries,
for (let p of entries) {
// a. If p.[[Key]] is not empty and SameValueZero(p.[[Key]], key) is true, then
if (p.$Key !== undefined && (0, _index2.SameValueZeroPartial)(realm, p.$Key, key)) {
// i. Set p.[[Key]] to empty.
p.$Key = undefined; // ii. Set p.[[Value]] to empty.
p.$Value = undefined; // iii. Return true.
return realm.intrinsics.true;
}
} // 6. Return false.
return realm.intrinsics.false;
}); // ECMA262 23.1.3.4
obj.defineNativeMethod("entries", 0, context => {
// 1. Let M be the this value.
let M = context; // 2. Return ? CreateMapIterator(M, "key+value").
return (0, _index2.CreateMapIterator)(realm, M, "key+value");
}); // ECMA262 23.1.3.5
obj.defineNativeMethod("forEach", 1, (context, [callbackfn, thisArg]) => {
// 1. Let M be the this value.
let M = context.throwIfNotConcrete(); // 2. If Type(M) is not Object, throw a TypeError exception.
if (!(M instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. If M does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!M.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
if (!(0, _index2.IsCallable)(realm, callbackfn)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
let T = thisArg || realm.intrinsics.undefined; // 6. Let entries be the List that is the value of M's [[MapData]] internal slot.
let entries = M.$MapData;
(0, _invariant.default)(entries); // 7. Repeat for each Record {[[Key]], [[Value]]} e that is an element of entries, in original key insertion order
for (let e of entries) {
// a. If e.[[Key]] is not empty, then
if (e.$Key !== undefined) {
// i. Perform ? Call(callbackfn, T, « e.[[Value]], e.[[Key]], M »).
(0, _invariant.default)(e.$Value !== undefined);
(0, _index2.Call)(realm, callbackfn, T, [e.$Value, e.$Key, M]);
}
} // 8. Return undefined.
return realm.intrinsics.undefined;
}); // ECMA262 23.1.3.6
obj.defineNativeMethod("get", 1, (context, [key]) => {
// 1. Let M be the this value.
let M = context.throwIfNotConcrete(); // 2. If Type(M) is not Object, throw a TypeError exception.
if (!(M instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. If M does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!M.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Let entries be the List that is the value of M's [[MapData]] internal slot.
let entries = M.$MapData;
(0, _invariant.default)(entries !== undefined); // 5. Repeat for each Record {[[Key]], [[Value]]} p that is an element of entries,
for (let p of entries) {
// a. If p.[[Key]] is not empty and SameValueZero(p.[[Key]], key) is true, return p.[[Value]].
if (p.$Key !== undefined && (0, _index2.SameValueZeroPartial)(realm, p.$Key, key)) {
(0, _invariant.default)(p.$Value !== undefined);
return p.$Value;
}
} // 6. Return undefined.
return realm.intrinsics.undefined;
}); // ECMA262 23.1.3.7
obj.defineNativeMethod("has", 1, (context, [key]) => {
// 1. Let M be the this value.
let M = context.throwIfNotConcrete(); // 2. If Type(M) is not Object, throw a TypeError exception.
if (!(M instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. If M does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!M.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Let entries be the List that is the value of M's [[MapData]] internal slot.
let entries = M.$MapData;
(0, _invariant.default)(entries !== undefined); // 5. Repeat for each Record {[[Key]], [[Value]]} p that is an element of entries,
for (let p of entries) {
// a. If p.[[Key]] is not empty and SameValueZero(p.[[Key]], key) is true, return true.
if (p.$Key !== undefined && (0, _index2.SameValueZeroPartial)(realm, p.$Key, key)) {
return realm.intrinsics.true;
}
} // 6. Return false.
return realm.intrinsics.false;
}); // ECMA262 23.1.3.8
obj.defineNativeMethod("keys", 0, context => {
// 1. Let M be the this value.
let M = context; // 2. Return ? CreateMapIterator(M, "key").
return (0, _index2.CreateMapIterator)(realm, M, "key");
}); // ECMA262 23.1.3.9
obj.defineNativeMethod("set", 2, (context, [key, value]) => {
// 1. Let M be the this value.
let M = context.throwIfNotConcrete(); // 2. If Type(M) is not Object, throw a TypeError exception.
if (!(M instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. If M does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!M.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Let entries be the List that is the value of M's [[MapData]] internal slot.
realm.recordModifiedProperty(M.$MapData_binding);
let entries = M.$MapData;
(0, _invariant.default)(entries !== undefined); // 5. Repeat for each Record {[[Key]], [[Value]]} p that is an element of entries,
for (let p of entries) {
// a. If p.[[Key]] is not empty and SameValueZero(p.[[Key]], key) is true, then
if (p.$Key !== undefined && (0, _index2.SameValueZeroPartial)(realm, p.$Key, key)) {
// i. Set p.[[Value]] to value.
p.$Value = value; // ii. Return M.
return M;
}
} // 6. If key is -0, let key be +0.
key = key.throwIfNotConcrete();
if (key instanceof _index.NumberValue && Object.is(key.value, -0)) key = realm.intrinsics.zero; // 7. Let p be the Record {[[Key]]: key, [[Value]]: value}.
let p = {
$Key: key,
$Value: value
}; // 8. Append p as the last element of entries.
entries.push(p); // 9. Return M.
return M;
}); // ECMA262 23.1.3.10
obj.$DefineOwnProperty("size", new _descriptors.PropertyDescriptor({
configurable: true,
get: new _index.NativeFunctionValue(realm, undefined, "get size", 0, context => {
// 1. Let M be the this value.
let M = context.throwIfNotConcrete(); // 2. If Type(M) is not Object, throw a TypeError exception.
if (!(M instanceof _index.ObjectValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 3. If M does not have a [[MapData]] internal slot, throw a TypeError exception.
if (!M.$MapData) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
} // 4. Let entries be the List that is the value of M's [[MapData]] internal slot.
let entries = M.$MapData;
(0, _invariant.default)(entries !== undefined); // 5. Let count be 0.
let count = 0; // 6. For each Record {[[Key]], [[Value]]} p that is an element of entries
for (let p of entries) {
// a. If p.[[Key]] is not empty, set count to count+1.
if (p.$Key !== undefined) count++;
} // 7. Return count.
return new _index.NumberValue(realm, count);
})
})); // ECMA262 23.1.3.11
obj.defineNativeMethod("values", 0, context => {
// 1. Let M be the this value.
let M = context; // 2. Return ? CreateMapIterator(M, "value").
return (0, _index2.CreateMapIterator)(realm, M, "value");
}); // ECMA262 23.1.3.12
let entriesPropertyDescriptor = obj.$GetOwnProperty("entries");
(0, _invariant.default)(entriesPropertyDescriptor instanceof _descriptors.PropertyDescriptor);
_singletons.Properties.ThrowIfMightHaveBeenDeleted(entriesPropertyDescriptor);
obj.$DefineOwnProperty(realm.intrinsics.SymbolIterator, entriesPropertyDescriptor); // ECMA262 23.1.3.13
obj.defineNativeProperty(realm.intrinsics.SymbolToStringTag, new _index.StringValue(realm, "Map"), {
writable: false
});
}
//# sourceMappingURL=MapPrototype.js.map