Changeset 59386 in webkit


Ignore:
Timestamp:
May 13, 2010 2:32:26 PM (14 years ago)
Author:
weinig@apple.com
Message:

Fix for https://bugs.webkit.org/show_bug.cgi?id=38221
Memory issues due to the changes in 36556 (increased CSSPrimitiveValue size).
Part of <rdar://problem/7921275>

Reviewed by Darin Adler.

  • Use an external cache to speedup cssText for CSSPrimitiveValue instead of an extra member variable.
  • css/CSSPrimitiveValue.cpp:

(WebCore::cssTextCache):
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
(WebCore::CSSPrimitiveValue::cleanup):
(WebCore::CSSPrimitiveValue::cssText):

  • css/CSSPrimitiveValue.h:

(WebCore::CSSPrimitiveValue::):

  • css/CSSPrimitiveValueMappings.h:

(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):

Location:
trunk/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r59385 r59386  
     12010-05-13  Sam Weinig  <sam@webkit.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Fix for https://bugs.webkit.org/show_bug.cgi?id=38221
     6        Memory issues due to the changes in 36556 (increased CSSPrimitiveValue size).
     7        Part of <rdar://problem/7921275>
     8
     9        - Use an external cache to speedup cssText for CSSPrimitiveValue instead
     10          of an extra member variable.
     11
     12        * css/CSSPrimitiveValue.cpp:
     13        (WebCore::cssTextCache):
     14        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     15        (WebCore::CSSPrimitiveValue::cleanup):
     16        (WebCore::CSSPrimitiveValue::cssText):
     17        * css/CSSPrimitiveValue.h:
     18        (WebCore::CSSPrimitiveValue::):
     19        * css/CSSPrimitiveValueMappings.h:
     20        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     21
    1222010-05-13  Enrica Casucci  <enrica@apple.com>
    223
  • trunk/WebCore/css/CSSPrimitiveValue.cpp

    r57105 r59386  
    4646namespace WebCore {
    4747
     48typedef HashMap<const CSSPrimitiveValue*, String> CSSTextCache;
     49static CSSTextCache& cssTextCache()
     50{
     51    DEFINE_STATIC_LOCAL(CSSTextCache, cache, ());
     52    return cache;
     53}
     54
    4855// A more stylish solution than sharing would be to turn CSSPrimitiveValue (or CSSValues in general) into non-virtual,
    4956// non-refcounted simple type with value semantics. In practice these sharing tricks get similar memory benefits
     
    146153CSSPrimitiveValue::CSSPrimitiveValue()
    147154    : m_type(0)
     155    , m_hasCachedCSSText(false)
    148156{
    149157}
     
    151159CSSPrimitiveValue::CSSPrimitiveValue(int ident)
    152160    : m_type(CSS_IDENT)
     161    , m_hasCachedCSSText(false)
    153162{
    154163    m_value.ident = ident;
     
    157166CSSPrimitiveValue::CSSPrimitiveValue(double num, UnitTypes type)
    158167    : m_type(type)
     168    , m_hasCachedCSSText(false)
    159169{
    160170    m_value.num = num;
     
    163173CSSPrimitiveValue::CSSPrimitiveValue(const String& str, UnitTypes type)
    164174    : m_type(type)
     175    , m_hasCachedCSSText(false)
    165176{
    166177    if ((m_value.string = str.impl()))
     
    170181CSSPrimitiveValue::CSSPrimitiveValue(RGBA32 color)
    171182    : m_type(CSS_RGBCOLOR)
     183    , m_hasCachedCSSText(false)
    172184{
    173185    m_value.rgbcolor = color;
     
    175187
    176188CSSPrimitiveValue::CSSPrimitiveValue(const Length& length)
     189    : m_hasCachedCSSText(false)
    177190{
    178191    switch (length.type()) {
     
    266279
    267280    m_type = 0;
    268     m_cachedCSSText = String();
     281    if (m_hasCachedCSSText) {
     282        cssTextCache().remove(this);
     283        m_hasCachedCSSText = false;
     284    }
    269285}
    270286
     
    634650    // FIXME: return the original value instead of a generated one (e.g. color
    635651    // name if it was specified) - check what spec says about this
    636     if (!m_cachedCSSText.isNull())
    637         return m_cachedCSSText;
     652
     653    if (m_hasCachedCSSText) {
     654        ASSERT(cssTextCache().contains(this));
     655        return cssTextCache().get(this);
     656    }
    638657
    639658    String text;
     
    838857            break;
    839858    }
    840     m_cachedCSSText = text;
     859    cssTextCache().set(this, text);
     860    m_hasCachedCSSText = true;
    841861    return text;
    842862}
  • trunk/WebCore/css/CSSPrimitiveValue.h

    r56744 r59386  
    201201    virtual unsigned short cssValueType() const;
    202202
    203     int m_type;
     203    int m_type : 31;
     204    mutable unsigned m_hasCachedCSSText : 1;
    204205    union {
    205206        int ident;
     
    212213        DashboardRegion* region;
    213214    } m_value;
    214     mutable String m_cachedCSSText;
    215215};
    216216
  • trunk/WebCore/css/CSSPrimitiveValueMappings.h

    r58228 r59386  
    4545template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBorderStyle e)
    4646    : m_type(CSS_IDENT)
     47    , m_hasCachedCSSText(false)
    4748{
    4849    switch (e) {
     
    8788template<> inline CSSPrimitiveValue::CSSPrimitiveValue(CompositeOperator e)
    8889    : m_type(CSS_IDENT)
     90    , m_hasCachedCSSText(false)
    8991{
    9092    switch (e) {
     
    173175template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ControlPart e)
    174176    : m_type(CSS_IDENT)
     177    , m_hasCachedCSSText(false)
    175178{
    176179    switch (e) {
     
    338341template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillAttachment e)
    339342    : m_type(CSS_IDENT)
     343    , m_hasCachedCSSText(false)
    340344{
    341345    switch (e) {
     
    369373template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillBox e)
    370374    : m_type(CSS_IDENT)
     375    , m_hasCachedCSSText(false)
    371376{
    372377    switch (e) {
     
    409414template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillRepeat e)
    410415    : m_type(CSS_IDENT)
     416    , m_hasCachedCSSText(false)
    411417{
    412418    switch (e) {
     
    445451template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxAlignment e)
    446452    : m_type(CSS_IDENT)
     453    , m_hasCachedCSSText(false)
    447454{
    448455    switch (e) {
     
    491498template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxDirection e)
    492499    : m_type(CSS_IDENT)
     500    , m_hasCachedCSSText(false)
    493501{
    494502    switch (e) {
     
    517525template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxLines e)
    518526    : m_type(CSS_IDENT)
     527    , m_hasCachedCSSText(false)
    519528{
    520529    switch (e) {
     
    543552template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxOrient e)
    544553    : m_type(CSS_IDENT)
     554    , m_hasCachedCSSText(false)
    545555{
    546556    switch (e) {
     
    571581template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECaptionSide e)
    572582    : m_type(CSS_IDENT)
     583    , m_hasCachedCSSText(false)
    573584{
    574585    switch (e) {
     
    607618template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EClear e)
    608619    : m_type(CSS_IDENT)
     620    , m_hasCachedCSSText(false)
    609621{
    610622    switch (e) {
     
    643655template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECursor e)
    644656    : m_type(CSS_IDENT)
     657    , m_hasCachedCSSText(false)
    645658{
    646659    switch (e) {
     
    767780template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDisplay e)
    768781    : m_type(CSS_IDENT)
     782    , m_hasCachedCSSText(false)
    769783{
    770784    switch (e) {
     
    843857template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EEmptyCell e)
    844858    : m_type(CSS_IDENT)
     859    , m_hasCachedCSSText(false)
    845860{
    846861    switch (e) {
     
    869884template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFloat e)
    870885    : m_type(CSS_IDENT)
     886    , m_hasCachedCSSText(false)
    871887{
    872888    switch (e) {
     
    901917template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EKHTMLLineBreak e)
    902918    : m_type(CSS_IDENT)
     919    , m_hasCachedCSSText(false)
    903920{
    904921    switch (e) {
     
    927944template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStylePosition e)
    928945    : m_type(CSS_IDENT)
     946    , m_hasCachedCSSText(false)
    929947{
    930948    switch (e) {
     
    945963template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStyleType e)
    946964    : m_type(CSS_IDENT)
     965    , m_hasCachedCSSText(false)
    947966{
    948967    switch (e) {
     
    11931212template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarginCollapse e)
    11941213    : m_type(CSS_IDENT)
     1214    , m_hasCachedCSSText(false)
    11951215{
    11961216    switch (e) {
     
    12241244template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeBehavior e)
    12251245    : m_type(CSS_IDENT)
     1246    , m_hasCachedCSSText(false)
    12261247{
    12271248    switch (e) {
     
    12601281template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeDirection e)
    12611282    : m_type(CSS_IDENT)
     1283    , m_hasCachedCSSText(false)
    12621284{
    12631285    switch (e) {
     
    13131335template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMatchNearestMailBlockquoteColor e)
    13141336    : m_type(CSS_IDENT)
     1337    , m_hasCachedCSSText(false)
    13151338{
    13161339    switch (e) {
     
    13391362template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ENBSPMode e)
    13401363    : m_type(CSS_IDENT)
     1364    , m_hasCachedCSSText(false)
    13411365{
    13421366    switch (e) {
     
    13651389template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EOverflow e)
    13661390    : m_type(CSS_IDENT)
     1391    , m_hasCachedCSSText(false)
    13671392{
    13681393    switch (e) {
     
    14111436template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPageBreak e)
    14121437    : m_type(CSS_IDENT)
     1438    , m_hasCachedCSSText(false)
    14131439{
    14141440    switch (e) {
     
    14441470template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPosition e)
    14451471    : m_type(CSS_IDENT)
     1472    , m_hasCachedCSSText(false)
    14461473{
    14471474    switch (e) {
     
    14801507template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EResize e)
    14811508    : m_type(CSS_IDENT)
     1509    , m_hasCachedCSSText(false)
    14821510{
    14831511    switch (e) {
     
    15191547template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETableLayout e)
    15201548    : m_type(CSS_IDENT)
     1549    , m_hasCachedCSSText(false)
    15211550{
    15221551    switch (e) {
     
    15451574template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAlign e)
    15461575    : m_type(CSS_IDENT)
     1576    , m_hasCachedCSSText(false)
    15471577{
    15481578    switch (e) {
     
    15881618template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextSecurity e)
    15891619    : m_type(CSS_IDENT)
     1620    , m_hasCachedCSSText(false)
    15901621{
    15911622    switch (e) {
     
    16241655template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextTransform e)
    16251656    : m_type(CSS_IDENT)
     1657    , m_hasCachedCSSText(false)
    16261658{
    16271659    switch (e) {
     
    16601692template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUnicodeBidi e)
    16611693    : m_type(CSS_IDENT)
     1694    , m_hasCachedCSSText(false)
    16621695{
    16631696    switch (e) {
     
    16911724template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserDrag e)
    16921725    : m_type(CSS_IDENT)
     1726    , m_hasCachedCSSText(false)
    16931727{
    16941728    switch (e) {
     
    17221756template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserModify e)
    17231757    : m_type(CSS_IDENT)
     1758    , m_hasCachedCSSText(false)
    17241759{
    17251760    switch (e) {
     
    17431778template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserSelect e)
    17441779    : m_type(CSS_IDENT)
     1780    , m_hasCachedCSSText(false)
    17451781{
    17461782    switch (e) {
     
    17711807template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EVisibility e)
    17721808    : m_type(CSS_IDENT)
     1809    , m_hasCachedCSSText(false)
    17731810{
    17741811    switch (e) {
     
    18021839template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWhiteSpace e)
    18031840    : m_type(CSS_IDENT)
     1841    , m_hasCachedCSSText(false)
    18041842{
    18051843    switch (e) {
     
    18481886template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWordBreak e)
    18491887    : m_type(CSS_IDENT)
     1888    , m_hasCachedCSSText(false)
    18501889{
    18511890    switch (e) {
     
    18791918template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWordWrap e)
    18801919    : m_type(CSS_IDENT)
     1920    , m_hasCachedCSSText(false)
    18811921{
    18821922    switch (e) {
     
    19051945template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextDirection e)
    19061946    : m_type(CSS_IDENT)
     1947    , m_hasCachedCSSText(false)
    19071948{
    19081949    switch (e) {
     
    19311972template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPointerEvents e)
    19321973    : m_type(CSS_IDENT)
     1974    , m_hasCachedCSSText(false)
    19331975{
    19341976    switch (e) {
     
    19972039template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontSmoothingMode smoothing)
    19982040    : m_type(CSS_IDENT)
     2041    , m_hasCachedCSSText(false)
    19992042{
    20002043    switch (smoothing) {
     
    20362079template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextRenderingMode e)
    20372080    : m_type(CSS_IDENT)
     2081    , m_hasCachedCSSText(false)
    20382082{
    20392083    switch (e) {
     
    20722116template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ColorSpace space)
    20732117    : m_type(CSS_IDENT)
     2118    , m_hasCachedCSSText(false)
    20742119{
    20752120    switch (space) {
     
    21002145template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineCap e)
    21012146    : m_type(CSS_IDENT)
     2147    , m_hasCachedCSSText(false)
    21022148{
    21032149    switch (e) {
     
    21312177template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineJoin e)
    21322178    : m_type(CSS_IDENT)
     2179    , m_hasCachedCSSText(false)
    21332180{
    21342181    switch (e) {
     
    21622209template<> inline CSSPrimitiveValue::CSSPrimitiveValue(WindRule e)
    21632210    : m_type(CSS_IDENT)
     2211    , m_hasCachedCSSText(false)
    21642212{
    21652213    switch (e) {
     
    21892237template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EAlignmentBaseline e)
    21902238    : m_type(CSS_IDENT)
     2239    , m_hasCachedCSSText(false)
    21912240{
    21922241    switch (e) {
     
    22652314template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorInterpolation e)
    22662315    : m_type(CSS_IDENT)
     2316    , m_hasCachedCSSText(false)
    22672317{
    22682318    switch (e) {
     
    22962346template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorRendering e)
    22972347    : m_type(CSS_IDENT)
     2348    , m_hasCachedCSSText(false)
    22982349{
    22992350    switch (e) {
     
    23272378template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDominantBaseline e)
    23282379    : m_type(CSS_IDENT)
     2380    , m_hasCachedCSSText(false)
    23292381{
    23302382    switch (e) {
     
    24032455template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EImageRendering e)
    24042456    : m_type(CSS_IDENT)
     2457    , m_hasCachedCSSText(false)
    24052458{
    24062459    switch (e) {
     
    24342487template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EShapeRendering e)
    24352488    : m_type(CSS_IDENT)
     2489    , m_hasCachedCSSText(false)
    24362490{
    24372491    switch (e) {
     
    24702524template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAnchor e)
    24712525    : m_type(CSS_IDENT)
     2526    , m_hasCachedCSSText(false)
    24722527{
    24732528    switch (e) {
     
    25012556template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWritingMode e)
    25022557    : m_type(CSS_IDENT)
     2558    , m_hasCachedCSSText(false)
    25032559{
    25042560    switch (e) {
Note: See TracChangeset for help on using the changeset viewer.