Changeset 50174 in webkit for trunk/JavaScriptCore/runtime


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.
Location:
trunk/JavaScriptCore/runtime
Files:
4 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}
  • trunk/JavaScriptCore/runtime/DateInstance.h

    r49886 r50174  
    3434        DateInstance(ExecState*, double);
    3535        explicit DateInstance(NonNullPassRefPtr<Structure>);
    36         virtual ~DateInstance();
    3736
    3837        double internalNumber() const { return internalValue().uncheckedGetNumber(); }
     
    4544        static JS_EXPORTDATA const ClassInfo info;
    4645
    47         bool getGregorianDateTime(bool outputIsUTC, WTF::GregorianDateTime&) const;
     46        bool getGregorianDateTime(ExecState*, bool outputIsUTC, WTF::GregorianDateTime&) const;
    4847
    4948        static PassRefPtr<Structure> createStructure(JSValue prototype)
     
    5857        virtual const ClassInfo* classInfo() const { return &info; }
    5958
    60 
    61         struct Cache;
    62         mutable Cache* m_cache;
     59        mutable RefPtr<DateInstanceData> m_data;
    6360    };
    6461
  • trunk/JavaScriptCore/runtime/DatePrototype.cpp

    r49889 r50174  
    256256    GregorianDateTime gregorianDateTime;
    257257    const bool outputIsUTC = false;
    258     if (!dateObject->getGregorianDateTime(outputIsUTC, gregorianDateTime))
     258    if (!dateObject->getGregorianDateTime(exec, outputIsUTC, gregorianDateTime))
    259259        return jsNontrivialString(exec, "Invalid Date");
    260260    return formatLocaleDate(exec, gregorianDateTime, format);
     
    427427
    428428    GregorianDateTime t;
    429     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     429    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    430430        return jsNontrivialString(exec, "Invalid Date");
    431431    return jsNontrivialString(exec, formatDate(t) + " " + formatTime(t, outputIsUTC));
     
    442442
    443443    GregorianDateTime t;
    444     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     444    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    445445        return jsNontrivialString(exec, "Invalid Date");
    446446    return jsNontrivialString(exec, formatDateUTCVariant(t) + " " + formatTime(t, outputIsUTC));
     
    457457   
    458458    GregorianDateTime t;
    459     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     459    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    460460        return jsNontrivialString(exec, "Invalid Date");
    461461    // Maximum amount of space we need in buffer: 6 (max. digits in year) + 2 * 5 (2 characters each for month, day, hour, minute, second) + 4 (. + 3 digits for milliseconds)
     
    477477
    478478    GregorianDateTime t;
    479     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     479    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    480480        return jsNontrivialString(exec, "Invalid Date");
    481481    return jsNontrivialString(exec, formatDate(t));
     
    492492
    493493    GregorianDateTime t;
    494     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     494    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    495495        return jsNontrivialString(exec, "Invalid Date");
    496496    return jsNontrivialString(exec, formatTime(t, outputIsUTC));
     
    542542
    543543    GregorianDateTime t;
    544     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     544    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    545545        return jsNaN(exec);
    546546    return jsNumber(exec, 1900 + t.year);
     
    557557
    558558    GregorianDateTime t;
    559     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     559    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    560560        return jsNaN(exec);
    561561    return jsNumber(exec, 1900 + t.year);
     
    572572
    573573    GregorianDateTime t;
    574     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     574    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    575575        return jsNontrivialString(exec, "Invalid Date");
    576576    return jsNontrivialString(exec, formatDateUTCVariant(t) + " " + formatTime(t, outputIsUTC));
     
    587587
    588588    GregorianDateTime t;
    589     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     589    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    590590        return jsNaN(exec);
    591591    return jsNumber(exec, t.month);
     
    602602
    603603    GregorianDateTime t;
    604     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     604    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    605605        return jsNaN(exec);
    606606    return jsNumber(exec, t.month);
     
    617617
    618618    GregorianDateTime t;
    619     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     619    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    620620        return jsNaN(exec);
    621621    return jsNumber(exec, t.monthDay);
     
    632632
    633633    GregorianDateTime t;
    634     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     634    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    635635        return jsNaN(exec);
    636636    return jsNumber(exec, t.monthDay);
     
    647647
    648648    GregorianDateTime t;
    649     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     649    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    650650        return jsNaN(exec);
    651651    return jsNumber(exec, t.weekDay);
     
    662662
    663663    GregorianDateTime t;
    664     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     664    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    665665        return jsNaN(exec);
    666666    return jsNumber(exec, t.weekDay);
     
    677677
    678678    GregorianDateTime t;
    679     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     679    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    680680        return jsNaN(exec);
    681681    return jsNumber(exec, t.hour);
     
    692692
    693693    GregorianDateTime t;
    694     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     694    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    695695        return jsNaN(exec);
    696696    return jsNumber(exec, t.hour);
     
    707707
    708708    GregorianDateTime t;
    709     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     709    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    710710        return jsNaN(exec);
    711711    return jsNumber(exec, t.minute);
     
    722722
    723723    GregorianDateTime t;
    724     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     724    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    725725        return jsNaN(exec);
    726726    return jsNumber(exec, t.minute);
     
    737737
    738738    GregorianDateTime t;
    739     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     739    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    740740        return jsNaN(exec);
    741741    return jsNumber(exec, t.second);
     
    752752
    753753    GregorianDateTime t;
    754     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     754    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    755755        return jsNaN(exec);
    756756    return jsNumber(exec, t.second);
     
    797797
    798798    GregorianDateTime t;
    799     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     799    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    800800        return jsNaN(exec);
    801801    return jsNumber(exec, -gmtoffset(t) / minutesPerHour);
     
    833833
    834834    GregorianDateTime t;
    835     thisDateObj->getGregorianDateTime(inputIsUTC, t);
     835    thisDateObj->getGregorianDateTime(exec, inputIsUTC, t);
    836836
    837837    if (!fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t)) {
     
    869869        double secs = floor(milli / msPerSecond);
    870870        ms = milli - secs * msPerSecond;
    871         thisDateObj->getGregorianDateTime(inputIsUTC, t);
     871        thisDateObj->getGregorianDateTime(exec, inputIsUTC, t);
    872872    }
    873873   
     
    992992        double secs = floor(milli / msPerSecond);
    993993        ms = milli - secs * msPerSecond;
    994         thisDateObj->getGregorianDateTime(outputIsUTC, t);
     994        thisDateObj->getGregorianDateTime(exec, outputIsUTC, t);
    995995    }
    996996   
     
    10191019
    10201020    GregorianDateTime t;
    1021     if (!thisDateObj->getGregorianDateTime(outputIsUTC, t))
     1021    if (!thisDateObj->getGregorianDateTime(exec, outputIsUTC, t))
    10221022        return jsNaN(exec);
    10231023
  • trunk/JavaScriptCore/runtime/JSGlobalData.h

    r49328 r50174  
    3131
    3232#include "Collector.h"
     33#include "DateInstanceCache.h"
    3334#include "ExecutableAllocator.h"
    3435#include "JITStubs.h"
     
    117118        SmallStrings smallStrings;
    118119        NumericStrings numericStrings;
    119 
     120        DateInstanceCache dateInstanceCache;
     121       
    120122#if ENABLE(ASSEMBLER)
    121123        ExecutableAllocator executableAllocator;
Note: See TracChangeset for help on using the changeset viewer.