Ignore:
Timestamp:
Oct 27, 2009, 3:01:41 PM (16 years ago)
Author:
[email protected]
Message:

JavaScriptCore: https://bugs.webkit.org/show_bug.cgi?id=30800
Cache recently computed date data.

Patch by Geoffrey Garen <[email protected]> on 2009-10-27
Reviewed by Darin Adler and Oliver Hunt.

SunSpider reports a ~0.5% speedup, mostly from date-format-tofte.js.

  • runtime/DateInstance.cpp:

(JSC::DateInstance::DateInstance):
(JSC::DateInstance::getGregorianDateTime): Use the shared cache.

  • runtime/DateInstance.h: Renamed m_cache to m_data, to avoid the confusion

of a "cache cache".

  • runtime/DatePrototype.cpp:

(JSC::formatLocaleDate):
(JSC::dateProtoFuncToString):
(JSC::dateProtoFuncToUTCString):
(JSC::dateProtoFuncToISOString):
(JSC::dateProtoFuncToDateString):
(JSC::dateProtoFuncToTimeString):
(JSC::dateProtoFuncGetFullYear):
(JSC::dateProtoFuncGetUTCFullYear):
(JSC::dateProtoFuncToGMTString):
(JSC::dateProtoFuncGetMonth):
(JSC::dateProtoFuncGetUTCMonth):
(JSC::dateProtoFuncGetDate):
(JSC::dateProtoFuncGetUTCDate):
(JSC::dateProtoFuncGetDay):
(JSC::dateProtoFuncGetUTCDay):
(JSC::dateProtoFuncGetHours):
(JSC::dateProtoFuncGetUTCHours):
(JSC::dateProtoFuncGetMinutes):
(JSC::dateProtoFuncGetUTCMinutes):
(JSC::dateProtoFuncGetSeconds):
(JSC::dateProtoFuncGetUTCSeconds):
(JSC::dateProtoFuncGetTimezoneOffset):
(JSC::setNewValueFromTimeArgs):
(JSC::setNewValueFromDateArgs):
(JSC::dateProtoFuncSetYear):
(JSC::dateProtoFuncGetYear): Pass an ExecState to these functions, so they
can access the DateInstanceCache.

  • runtime/JSGlobalData.h: Keep a DateInstanceCache.

JavaScriptGlue: Updated for JavaScriptCore export changes.

Patch by Geoffrey Garen <[email protected]> on 2009-10-27
Reviewed by Oliver Hunt.

  • ForwardingHeaders/wtf/DateMath.h: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/runtime/DateInstance.cpp

    r49886 r50174  
    3333namespace JSC {
    3434
    35 struct DateInstance::Cache {
    36     double m_gregorianDateTimeCachedForMS;
    37     GregorianDateTime m_cachedGregorianDateTime;
    38     double m_gregorianDateTimeUTCCachedForMS;
    39     GregorianDateTime m_cachedGregorianDateTimeUTC;
    40 };
    41 
    4235const ClassInfo DateInstance::info = {"Date", 0, 0, 0};
    4336
    4437DateInstance::DateInstance(NonNullPassRefPtr<Structure> structure)
    4538    : JSWrapperObject(structure)
    46     , m_cache(0)
    4739{
    4840}
     
    5042DateInstance::DateInstance(ExecState* exec, double time)
    5143    : JSWrapperObject(exec->lexicalGlobalObject()->dateStructure())
    52     , m_cache(0)
    5344{
    5445    setInternalValue(jsNumber(exec, timeClip(time)));
    5546}
    5647
    57 DateInstance::~DateInstance()
     48bool DateInstance::getGregorianDateTime(ExecState* exec, bool outputIsUTC, GregorianDateTime& t) const
    5849{
    59     delete m_cache;
    60 }
    61 
    62 bool DateInstance::getGregorianDateTime(bool outputIsUTC, GregorianDateTime& t) const
    63 {
    64     if (!m_cache) {
    65         m_cache = new Cache;
    66         m_cache->m_gregorianDateTimeCachedForMS = NaN;
    67         m_cache->m_gregorianDateTimeUTCCachedForMS = NaN;
    68     }
    69 
    7050    double milli = internalNumber();
    7151    if (isnan(milli))
    7252        return false;
    7353
     54    if (!m_data)
     55        m_data = exec->globalData().dateInstanceCache.add(milli);
     56
    7457    if (outputIsUTC) {
    75         if (m_cache->m_gregorianDateTimeUTCCachedForMS != milli) {
    76             WTF::msToGregorianDateTime(internalNumber(), true, m_cache->m_cachedGregorianDateTimeUTC);
    77             m_cache->m_gregorianDateTimeUTCCachedForMS = milli;
     58        if (m_data->m_gregorianDateTimeUTCCachedForMS != milli) {
     59            WTF::msToGregorianDateTime(internalNumber(), true, m_data->m_cachedGregorianDateTimeUTC);
     60            m_data->m_gregorianDateTimeUTCCachedForMS = milli;
    7861        }
    79         t.copyFrom(m_cache->m_cachedGregorianDateTimeUTC);
     62        t.copyFrom(m_data->m_cachedGregorianDateTimeUTC);
    8063    } else {
    81         if (m_cache->m_gregorianDateTimeCachedForMS != milli) {
    82             WTF::msToGregorianDateTime(internalNumber(), false, m_cache->m_cachedGregorianDateTime);
    83             m_cache->m_gregorianDateTimeCachedForMS = milli;
     64        if (m_data->m_gregorianDateTimeCachedForMS != milli) {
     65            WTF::msToGregorianDateTime(internalNumber(), false, m_data->m_cachedGregorianDateTime);
     66            m_data->m_gregorianDateTimeCachedForMS = milli;
    8467        }
    85         t.copyFrom(m_cache->m_cachedGregorianDateTime);
     68        t.copyFrom(m_data->m_cachedGregorianDateTime);
    8669    }
    87    
     70
    8871    return true;
    8972}
Note: See TracChangeset for help on using the changeset viewer.