#include "config.h"
#include "DateInstance.h"
-#include "DateMath.h"
+#include "JSDateMath.h"
+#include "JSGlobalObject.h"
+#include "JSCInlines.h"
#include <math.h>
#include <wtf/MathExtras.h>
-namespace JSC {
+using namespace WTF;
-struct DateInstance::Cache {
- double m_gregorianDateTimeCachedForMS;
- GregorianDateTime m_cachedGregorianDateTime;
- double m_gregorianDateTimeUTCCachedForMS;
- GregorianDateTime m_cachedGregorianDateTimeUTC;
-};
+namespace JSC {
-const ClassInfo DateInstance::info = {"Date", 0, 0, 0};
+const ClassInfo DateInstance::s_info = {"Date", &JSWrapperObject::s_info, 0, 0, CREATE_METHOD_TABLE(DateInstance)};
-DateInstance::DateInstance(PassRefPtr<Structure> structure)
- : JSWrapperObject(structure)
- , m_cache(0)
+DateInstance::DateInstance(VM& vm, Structure* structure)
+ : JSWrapperObject(vm, structure)
{
}
-DateInstance::~DateInstance()
+void DateInstance::finishCreation(VM& vm)
{
- delete m_cache;
+ Base::finishCreation(vm);
+ ASSERT(inherits(info()));
+ setInternalValue(vm, jsNaN());
}
-void DateInstance::msToGregorianDateTime(double milli, bool outputIsUTC, GregorianDateTime& t) const
+void DateInstance::finishCreation(VM& vm, double time)
{
- if (!m_cache) {
- m_cache = new Cache;
- m_cache->m_gregorianDateTimeCachedForMS = NaN;
- m_cache->m_gregorianDateTimeUTCCachedForMS = NaN;
- }
-
- if (outputIsUTC) {
- if (m_cache->m_gregorianDateTimeUTCCachedForMS != milli) {
- JSC::msToGregorianDateTime(milli, true, m_cache->m_cachedGregorianDateTimeUTC);
- m_cache->m_gregorianDateTimeUTCCachedForMS = milli;
- }
- t.copyFrom(m_cache->m_cachedGregorianDateTimeUTC);
- } else {
- if (m_cache->m_gregorianDateTimeCachedForMS != milli) {
- JSC::msToGregorianDateTime(milli, false, m_cache->m_cachedGregorianDateTime);
- m_cache->m_gregorianDateTimeCachedForMS = milli;
- }
- t.copyFrom(m_cache->m_cachedGregorianDateTime);
- }
+ Base::finishCreation(vm);
+ ASSERT(inherits(info()));
+ setInternalValue(vm, jsNumber(timeClip(time)));
}
-bool DateInstance::getTime(GregorianDateTime& t, int& offset) const
+void DateInstance::destroy(JSCell* cell)
{
- double milli = internalNumber();
- if (isnan(milli))
- return false;
-
- msToGregorianDateTime(milli, false, t);
- offset = gmtoffset(t);
- return true;
+ static_cast<DateInstance*>(cell)->DateInstance::~DateInstance();
}
-bool DateInstance::getUTCTime(GregorianDateTime& t) const
+const GregorianDateTime* DateInstance::calculateGregorianDateTime(ExecState* exec) const
{
double milli = internalNumber();
- if (isnan(milli))
- return false;
-
- msToGregorianDateTime(milli, true, t);
- return true;
-}
+ if (std::isnan(milli))
+ return 0;
-bool DateInstance::getTime(double& milli, int& offset) const
-{
- milli = internalNumber();
- if (isnan(milli))
- return false;
-
- GregorianDateTime t;
- msToGregorianDateTime(milli, false, t);
- offset = gmtoffset(t);
- return true;
+ VM& vm = exec->vm();
+ if (!m_data)
+ m_data = vm.dateInstanceCache.add(milli);
+
+ if (m_data->m_gregorianDateTimeCachedForMS != milli) {
+ msToGregorianDateTime(vm, milli, false, m_data->m_cachedGregorianDateTime);
+ m_data->m_gregorianDateTimeCachedForMS = milli;
+ }
+ return &m_data->m_cachedGregorianDateTime;
}
-bool DateInstance::getUTCTime(double& milli) const
+const GregorianDateTime* DateInstance::calculateGregorianDateTimeUTC(ExecState* exec) const
{
- milli = internalNumber();
- if (isnan(milli))
- return false;
-
- return true;
+ double milli = internalNumber();
+ if (std::isnan(milli))
+ return 0;
+
+ VM& vm = exec->vm();
+ if (!m_data)
+ m_data = vm.dateInstanceCache.add(milli);
+
+ if (m_data->m_gregorianDateTimeUTCCachedForMS != milli) {
+ msToGregorianDateTime(vm, milli, true, m_data->m_cachedGregorianDateTimeUTC);
+ m_data->m_gregorianDateTimeUTCCachedForMS = milli;
+ }
+ return &m_data->m_cachedGregorianDateTimeUTC;
}
} // namespace JSC