bool js::intl_FormatDateTime(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); MOZ_ASSERT(args.length() == 3); MOZ_ASSERT(args[0].isObject()); MOZ_ASSERT(args[1].isNumber()); MOZ_ASSERT(args[2].isBoolean()); Rooted<DateTimeFormatObject*> dateTimeFormat(cx); dateTimeFormat = &args[0].toObject().as<DateTimeFormatObject>(); ClippedTime x = TimeClip(args[1].toNumber()); if (!x.isValid()) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DATE_NOT_FINITE); return false; } // Obtain a cached UDateFormat object. void* priv = dateTimeFormat->getReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT).toPrivate(); UDateFormat* df = static_cast<UDateFormat*>(priv); if (!df) { df = NewUDateFormat(cx, dateTimeFormat); if (!df) return false; dateTimeFormat->setReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT, PrivateValue(df)); } // Use the UDateFormat to actually format the time stamp. return args[2].toBoolean() ? intl_FormatToPartsDateTime(cx, df, x, args.rval()) : intl_FormatDateTime(cx, df, x, args.rval()); }