Handle createSymbolConstructor()

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;
}