in lib/VM/JSLib/Symbol.cpp [23:175]
Handle<JSObject> createSymbolConstructor(Runtime &runtime) {
auto symbolPrototype = Handle<JSObject>::vmcast(&runtime.symbolPrototype);
auto cons = defineSystemConstructor<JSSymbol>(
runtime,
Predefined::getSymbolID(Predefined::Symbol),
symbolConstructor,
symbolPrototype,
0,
CellKind::JSSymbolKind);
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::predefinedFor),
nullptr,
symbolFor,
1);
defineMethod(
runtime,
cons,
Predefined::getSymbolID(Predefined::keyFor),
nullptr,
symbolKeyFor,
1);
// Well-known symbols.
DefinePropertyFlags dpf{};
dpf.writable = 0;
dpf.enumerable = 0;
dpf.configurable = 0;
dpf.setWritable = 0;
dpf.setEnumerable = 0;
dpf.setConfigurable = 0;
dpf.setValue = 1;
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::hasInstance),
runtime.makeHandle(
Predefined::getSymbolID(Predefined::SymbolHasInstance)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::iterator),
runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolIterator)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::isConcatSpreadable),
runtime.makeHandle(
Predefined::getSymbolID(Predefined::SymbolIsConcatSpreadable)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::toPrimitive),
runtime.makeHandle(
Predefined::getSymbolID(Predefined::SymbolToPrimitive)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::toStringTag),
runtime.makeHandle(
Predefined::getSymbolID(Predefined::SymbolToStringTag)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::match),
runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolMatch)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::matchAll),
runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolMatchAll)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::search),
runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolSearch)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::replace),
runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolReplace)),
dpf);
defineProperty(
runtime,
cons,
Predefined::getSymbolID(Predefined::split),
runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolSplit)),
dpf);
// Symbol.prototype.xxx methods.
void *ctx = nullptr;
defineAccessor(
runtime,
symbolPrototype,
Predefined::getSymbolID(Predefined::description),
ctx,
symbolPrototypeDescriptionGetter,
nullptr,
false,
true);
defineMethod(
runtime,
symbolPrototype,
Predefined::getSymbolID(Predefined::toString),
ctx,
symbolPrototypeToString,
0);
defineMethod(
runtime,
symbolPrototype,
Predefined::getSymbolID(Predefined::valueOf),
ctx,
symbolPrototypeValueOf,
0);
dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
dpf.writable = 0;
dpf.enumerable = 0;
defineProperty(
runtime,
symbolPrototype,
Predefined::getSymbolID(Predefined::SymbolToStringTag),
runtime.getPredefinedStringHandle(Predefined::Symbol),
dpf);
(void)defineMethod(
runtime,
symbolPrototype,
Predefined::getSymbolID(Predefined::SymbolToPrimitive),
Predefined::getSymbolID(Predefined::squareSymbolToPrimitive),
nullptr,
symbolPrototypeValueOf,
1,
dpf);
return cons;
}