#include "config.h"
#include "DateInstance.h"
#include "JSCInlines.h"
#include "JSDateMath.h"
namespace JSC {
const ClassInfo DateInstance::s_info = {"Date", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(DateInstance)};
DateInstance::DateInstance(VM& vm, Structure* structure)
: Base(vm, structure)
{
}
void DateInstance::finishCreation(VM& vm)
{
Base::finishCreation(vm);
ASSERT(inherits(vm, info()));
}
void DateInstance::finishCreation(VM& vm, double time)
{
Base::finishCreation(vm);
ASSERT(inherits(vm, info()));
m_internalNumber = timeClip(time);
}
String DateInstance::toStringName(const JSObject*, JSGlobalObject*)
{
return "Date"_s;
}
const GregorianDateTime* DateInstance::calculateGregorianDateTime(DateCache& cache) const
{
double milli = internalNumber();
if (std::isnan(milli))
return nullptr;
if (!m_data)
m_data = cache.cachedDateInstanceData(milli);
if (m_data->m_gregorianDateTimeCachedForMS != milli) {
cache.msToGregorianDateTime(milli, WTF::LocalTime, m_data->m_cachedGregorianDateTime);
m_data->m_gregorianDateTimeCachedForMS = milli;
}
return &m_data->m_cachedGregorianDateTime;
}
const GregorianDateTime* DateInstance::calculateGregorianDateTimeUTC(DateCache& cache) const
{
double milli = internalNumber();
if (std::isnan(milli))
return nullptr;
if (!m_data)
m_data = cache.cachedDateInstanceData(milli);
if (m_data->m_gregorianDateTimeUTCCachedForMS != milli) {
cache.msToGregorianDateTime(milli, WTF::UTCTime, m_data->m_cachedGregorianDateTimeUTC);
m_data->m_gregorianDateTimeUTCCachedForMS = milli;
}
return &m_data->m_cachedGregorianDateTimeUTC;
}
}