Handle createDateConstructor()

in lib/VM/JSLib/Date.cpp [104:376]


Handle<JSObject> createDateConstructor(Runtime &runtime) {
  auto datePrototype = Handle<JSObject>::vmcast(&runtime.datePrototype);
  auto cons = defineSystemConstructor<JSDate>(
      runtime,
      Predefined::getSymbolID(Predefined::Date),
      dateConstructor,
      datePrototype,
      7,
      CellKind::JSDateKind);

  // Date.prototype.xxx() methods.
  defineMethod(
      runtime,
      datePrototype,
      Predefined::getSymbolID(Predefined::valueOf),
      nullptr,
      datePrototypeGetTime,
      0);
  defineMethod(
      runtime,
      datePrototype,
      Predefined::getSymbolID(Predefined::getTime),
      nullptr,
      datePrototypeGetTime,
      0);

  auto defineToStringMethod = [&](SymbolID name, ToStringKind kind) {
    defineMethod(
        runtime,
        datePrototype,
        name,
        (void *)kind,
        datePrototypeToStringHelper,
        0);
  };

  defineToStringMethod(
      Predefined::getSymbolID(Predefined::toString),
      ToStringKind::DatetimeToString);
  defineToStringMethod(
      Predefined::getSymbolID(Predefined::toDateString),
      ToStringKind::DateToString);
  defineToStringMethod(
      Predefined::getSymbolID(Predefined::toTimeString),
      ToStringKind::TimeToString);
  defineToStringMethod(
      Predefined::getSymbolID(Predefined::toISOString),
      ToStringKind::ISOToString);
  defineToStringMethod(
      Predefined::getSymbolID(Predefined::toUTCString),
      ToStringKind::UTCToString);
  defineToStringMethod(
      Predefined::getSymbolID(Predefined::toGMTString),
      ToStringKind::UTCToString);

  auto defineToLocaleStringMethod = [&](SymbolID name,
                                        ToLocaleStringKind kind) {
    defineMethod(
        runtime,
        datePrototype,
        name,
        (void *)kind,
        datePrototypeToLocaleStringHelper,
        0);
  };

  defineToLocaleStringMethod(
      Predefined::getSymbolID(Predefined::toLocaleString),
      ToLocaleStringKind::DatetimeToLocaleString);
  defineToLocaleStringMethod(
      Predefined::getSymbolID(Predefined::toLocaleDateString),
      ToLocaleStringKind::DateToLocaleString);
  defineToLocaleStringMethod(
      Predefined::getSymbolID(Predefined::toLocaleTimeString),
      ToLocaleStringKind::TimeToLocaleString);

  auto defineGetterMethod = [&](SymbolID name, GetterKind kind) {
    defineMethod(
        runtime,
        datePrototype,
        name,
        (void *)kind,
        datePrototypeGetterHelper,
        0);
  };

  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getFullYear),
      GetterKind::GetFullYear);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getYear), GetterKind::GetYear);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getMonth), GetterKind::GetMonth);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getDate), GetterKind::GetDate);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getDay), GetterKind::GetDay);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getHours), GetterKind::GetHours);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getMinutes), GetterKind::GetMinutes);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getSeconds), GetterKind::GetSeconds);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getMilliseconds),
      GetterKind::GetMilliseconds);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCFullYear),
      GetterKind::GetUTCFullYear);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCMonth),
      GetterKind::GetUTCMonth);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCDate), GetterKind::GetUTCDate);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCDay), GetterKind::GetUTCDay);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCHours),
      GetterKind::GetUTCHours);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCMinutes),
      GetterKind::GetUTCMinutes);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCSeconds),
      GetterKind::GetUTCSeconds);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getUTCMilliseconds),
      GetterKind::GetUTCMilliseconds);
  defineGetterMethod(
      Predefined::getSymbolID(Predefined::getTimezoneOffset),
      GetterKind::GetTimezoneOffset);

  defineMethod(
      runtime,
      datePrototype,
      Predefined::getSymbolID(Predefined::setTime),
      nullptr,
      datePrototypeSetTime,
      1);

  auto defineSetterMethod =
      [&](SymbolID name, uint32_t length, bool isUTC, NativeFunctionPtr func) {
        defineMethod(
            runtime,
            datePrototype,
            name,
            reinterpret_cast<void *>(isUTC),
            func,
            length);
      };

  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setMilliseconds),
      1,
      false,
      datePrototypeSetMilliseconds);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setUTCMilliseconds),
      1,
      true,
      datePrototypeSetMilliseconds);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setSeconds),
      2,
      false,
      datePrototypeSetSeconds);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setUTCSeconds),
      2,
      true,
      datePrototypeSetSeconds);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setMinutes),
      3,
      false,
      datePrototypeSetMinutes);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setUTCMinutes),
      3,
      true,
      datePrototypeSetMinutes);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setHours),
      4,
      false,
      datePrototypeSetHours);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setUTCHours),
      4,
      true,
      datePrototypeSetHours);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setDate),
      1,
      false,
      datePrototypeSetDate);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setUTCDate),
      1,
      true,
      datePrototypeSetDate);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setMonth),
      2,
      false,
      datePrototypeSetMonth);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setUTCMonth),
      2,
      true,
      datePrototypeSetMonth);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setFullYear),
      3,
      false,
      datePrototypeSetFullYear);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setUTCFullYear),
      3,
      true,
      datePrototypeSetFullYear);
  defineSetterMethod(
      Predefined::getSymbolID(Predefined::setYear),
      1,
      false,
      datePrototypeSetYear);

  defineMethod(
      runtime,
      datePrototype,
      Predefined::getSymbolID(Predefined::toJSON),
      nullptr,
      datePrototypeToJSON,
      1);

  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  dpf.writable = 0;
  dpf.enumerable = 0;
  (void)defineMethod(
      runtime,
      datePrototype,
      Predefined::getSymbolID(Predefined::SymbolToPrimitive),
      Predefined::getSymbolID(Predefined::squareSymbolToPrimitive),
      nullptr,
      datePrototypeSymbolToPrimitive,
      1,
      dpf);

  // Date.xxx() methods.
  defineMethod(
      runtime,
      cons,
      Predefined::getSymbolID(Predefined::parse),
      nullptr,
      dateParse,
      1);
  defineMethod(
      runtime,
      cons,
      Predefined::getSymbolID(Predefined::UTC),
      nullptr,
      dateUTC,
      7);
  defineMethod(
      runtime,
      cons,
      Predefined::getSymbolID(Predefined::now),
      nullptr,
      dateNow,
      0);

  return cons;
}