prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
118 lines (90 loc) • 4.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (realm) {
// ECMA262 19.4.1.1
let func = new _index.NativeFunctionValue(realm, "Symbol", "Symbol", 0, (context, [description], argCount, NewTarget) => {
// 1. If NewTarget is not undefined, throw a TypeError exception.
if (NewTarget) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
}
// 2. If description is undefined, let descString be undefined.
let descString;
if (!description || description instanceof _index.UndefinedValue) {
descString = undefined;
} else if (description instanceof _index.AbstractValue) {
descString = description;
} else {
// 3. Else, let descString be ? ToString(description).
descString = _singletons.To.ToStringPartial(realm, description);
descString = new _index.StringValue(realm, descString);
}
// 4. Return a new unique Symbol value whose [[Description]] value is descString.
return new _index.SymbolValue(realm, descString);
});
// ECMA262 19.4.2.1
func.defineNativeMethod("for", 1, (context, [key]) => {
// 1. Let stringKey be ? ToString(key).
let stringKey = _singletons.To.ToStringPartial(realm, key);
stringKey = new _index.StringValue(realm, stringKey);
// 2. For each element e of the GlobalSymbolRegistry List,
for (let e of realm.globalSymbolRegistry) {
// a. If SameValue(e.[[Key]], stringKey) is true, return e.[[Symbol]].
if (e.$Key === stringKey.value) {
return e.$Symbol;
}
}
// 3. Assert: GlobalSymbolRegistry does not currently contain an entry for stringKey.
// 4. Let newSymbol be a new unique Symbol value whose [[Description]] value is stringKey.
let newSymbol = new _index.SymbolValue(realm, stringKey);
// 5. Append the Record { [[Key]]: stringKey, [[Symbol]]: newSymbol } to the GlobalSymbolRegistry List.
realm.globalSymbolRegistry.push({ $Key: stringKey.value, $Symbol: newSymbol });
// 6. Return newSymbol.
return newSymbol;
});
// ECMA262 19.4.2.2
func.defineNativeMethod("keyFor", 1, (context, [sym]) => {
// 1. If Type(sym) is not Symbol, throw a TypeError exception.
if (!(sym instanceof _index.SymbolValue)) {
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError, "Type(sym) is not Symbol");
}
// 2. For each element e of the GlobalSymbolRegistry List (see 19.4.2.1),
for (let e of realm.globalSymbolRegistry) {
// a. If SameValue(e.[[Symbol]], sym) is true, return e.[[Key]].
if ((0, _abstract.SameValue)(realm, e.$Symbol, sym) === true) {
return new _index.StringValue(realm, e.$Key);
}
}
// 3. Assert: GlobalSymbolRegistry does not currently contain an entry for sym.
// 4. Return undefined.
return realm.intrinsics.undefined;
});
// ECMA262 19.4.2.3
func.defineNativeConstant("isConcatSpreadable", realm.intrinsics.SymbolIsConcatSpreadable);
// ECMA262 19.4.2.10
func.defineNativeConstant("species", realm.intrinsics.SymbolSpecies);
// ECMA262 19.4.2.8
func.defineNativeConstant("replace", realm.intrinsics.SymbolReplace);
// ECMA262 19.4.2.4
func.defineNativeConstant("iterator", realm.intrinsics.SymbolIterator);
// ECMA262 19.4.2.2
func.defineNativeConstant("hasInstance", realm.intrinsics.SymbolHasInstance);
// ECMA262 19.4.2.12
func.defineNativeConstant("toPrimitive", realm.intrinsics.SymbolToPrimitive);
// ECMA262 19.4.2.13
func.defineNativeConstant("toStringTag", realm.intrinsics.SymbolToStringTag);
// ECMA262 19.4.2.14
func.defineNativeConstant("unscopables", realm.intrinsics.SymbolUnscopables);
// ECMA262 19.4.2.6
func.defineNativeConstant("match", realm.intrinsics.SymbolMatch);
// ECMA262 19.4.2.11
func.defineNativeConstant("split", realm.intrinsics.SymbolSplit);
// ECMA262 19.4.2.9
func.defineNativeConstant("search", realm.intrinsics.SymbolSearch);
return func;
};
var _index = require("../../values/index.js");
var _singletons = require("../../singletons.js");
var _abstract = require("../../methods/abstract.js");
//# sourceMappingURL=Symbol.js.map