Changeset 59386 in webkit
- Timestamp:
- May 13, 2010 2:32:26 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r59385 r59386 1 2010-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 1 22 2010-05-13 Enrica Casucci <enrica@apple.com> 2 23 -
trunk/WebCore/css/CSSPrimitiveValue.cpp
r57105 r59386 46 46 namespace WebCore { 47 47 48 typedef HashMap<const CSSPrimitiveValue*, String> CSSTextCache; 49 static CSSTextCache& cssTextCache() 50 { 51 DEFINE_STATIC_LOCAL(CSSTextCache, cache, ()); 52 return cache; 53 } 54 48 55 // A more stylish solution than sharing would be to turn CSSPrimitiveValue (or CSSValues in general) into non-virtual, 49 56 // non-refcounted simple type with value semantics. In practice these sharing tricks get similar memory benefits … … 146 153 CSSPrimitiveValue::CSSPrimitiveValue() 147 154 : m_type(0) 155 , m_hasCachedCSSText(false) 148 156 { 149 157 } … … 151 159 CSSPrimitiveValue::CSSPrimitiveValue(int ident) 152 160 : m_type(CSS_IDENT) 161 , m_hasCachedCSSText(false) 153 162 { 154 163 m_value.ident = ident; … … 157 166 CSSPrimitiveValue::CSSPrimitiveValue(double num, UnitTypes type) 158 167 : m_type(type) 168 , m_hasCachedCSSText(false) 159 169 { 160 170 m_value.num = num; … … 163 173 CSSPrimitiveValue::CSSPrimitiveValue(const String& str, UnitTypes type) 164 174 : m_type(type) 175 , m_hasCachedCSSText(false) 165 176 { 166 177 if ((m_value.string = str.impl())) … … 170 181 CSSPrimitiveValue::CSSPrimitiveValue(RGBA32 color) 171 182 : m_type(CSS_RGBCOLOR) 183 , m_hasCachedCSSText(false) 172 184 { 173 185 m_value.rgbcolor = color; … … 175 187 176 188 CSSPrimitiveValue::CSSPrimitiveValue(const Length& length) 189 : m_hasCachedCSSText(false) 177 190 { 178 191 switch (length.type()) { … … 266 279 267 280 m_type = 0; 268 m_cachedCSSText = String(); 281 if (m_hasCachedCSSText) { 282 cssTextCache().remove(this); 283 m_hasCachedCSSText = false; 284 } 269 285 } 270 286 … … 634 650 // FIXME: return the original value instead of a generated one (e.g. color 635 651 // 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 } 638 657 639 658 String text; … … 838 857 break; 839 858 } 840 m_cachedCSSText = text; 859 cssTextCache().set(this, text); 860 m_hasCachedCSSText = true; 841 861 return text; 842 862 } -
trunk/WebCore/css/CSSPrimitiveValue.h
r56744 r59386 201 201 virtual unsigned short cssValueType() const; 202 202 203 int m_type; 203 int m_type : 31; 204 mutable unsigned m_hasCachedCSSText : 1; 204 205 union { 205 206 int ident; … … 212 213 DashboardRegion* region; 213 214 } m_value; 214 mutable String m_cachedCSSText;215 215 }; 216 216 -
trunk/WebCore/css/CSSPrimitiveValueMappings.h
r58228 r59386 45 45 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBorderStyle e) 46 46 : m_type(CSS_IDENT) 47 , m_hasCachedCSSText(false) 47 48 { 48 49 switch (e) { … … 87 88 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(CompositeOperator e) 88 89 : m_type(CSS_IDENT) 90 , m_hasCachedCSSText(false) 89 91 { 90 92 switch (e) { … … 173 175 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ControlPart e) 174 176 : m_type(CSS_IDENT) 177 , m_hasCachedCSSText(false) 175 178 { 176 179 switch (e) { … … 338 341 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillAttachment e) 339 342 : m_type(CSS_IDENT) 343 , m_hasCachedCSSText(false) 340 344 { 341 345 switch (e) { … … 369 373 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillBox e) 370 374 : m_type(CSS_IDENT) 375 , m_hasCachedCSSText(false) 371 376 { 372 377 switch (e) { … … 409 414 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFillRepeat e) 410 415 : m_type(CSS_IDENT) 416 , m_hasCachedCSSText(false) 411 417 { 412 418 switch (e) { … … 445 451 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxAlignment e) 446 452 : m_type(CSS_IDENT) 453 , m_hasCachedCSSText(false) 447 454 { 448 455 switch (e) { … … 491 498 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxDirection e) 492 499 : m_type(CSS_IDENT) 500 , m_hasCachedCSSText(false) 493 501 { 494 502 switch (e) { … … 517 525 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxLines e) 518 526 : m_type(CSS_IDENT) 527 , m_hasCachedCSSText(false) 519 528 { 520 529 switch (e) { … … 543 552 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EBoxOrient e) 544 553 : m_type(CSS_IDENT) 554 , m_hasCachedCSSText(false) 545 555 { 546 556 switch (e) { … … 571 581 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECaptionSide e) 572 582 : m_type(CSS_IDENT) 583 , m_hasCachedCSSText(false) 573 584 { 574 585 switch (e) { … … 607 618 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EClear e) 608 619 : m_type(CSS_IDENT) 620 , m_hasCachedCSSText(false) 609 621 { 610 622 switch (e) { … … 643 655 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ECursor e) 644 656 : m_type(CSS_IDENT) 657 , m_hasCachedCSSText(false) 645 658 { 646 659 switch (e) { … … 767 780 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDisplay e) 768 781 : m_type(CSS_IDENT) 782 , m_hasCachedCSSText(false) 769 783 { 770 784 switch (e) { … … 843 857 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EEmptyCell e) 844 858 : m_type(CSS_IDENT) 859 , m_hasCachedCSSText(false) 845 860 { 846 861 switch (e) { … … 869 884 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EFloat e) 870 885 : m_type(CSS_IDENT) 886 , m_hasCachedCSSText(false) 871 887 { 872 888 switch (e) { … … 901 917 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EKHTMLLineBreak e) 902 918 : m_type(CSS_IDENT) 919 , m_hasCachedCSSText(false) 903 920 { 904 921 switch (e) { … … 927 944 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStylePosition e) 928 945 : m_type(CSS_IDENT) 946 , m_hasCachedCSSText(false) 929 947 { 930 948 switch (e) { … … 945 963 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EListStyleType e) 946 964 : m_type(CSS_IDENT) 965 , m_hasCachedCSSText(false) 947 966 { 948 967 switch (e) { … … 1193 1212 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarginCollapse e) 1194 1213 : m_type(CSS_IDENT) 1214 , m_hasCachedCSSText(false) 1195 1215 { 1196 1216 switch (e) { … … 1224 1244 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeBehavior e) 1225 1245 : m_type(CSS_IDENT) 1246 , m_hasCachedCSSText(false) 1226 1247 { 1227 1248 switch (e) { … … 1260 1281 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMarqueeDirection e) 1261 1282 : m_type(CSS_IDENT) 1283 , m_hasCachedCSSText(false) 1262 1284 { 1263 1285 switch (e) { … … 1313 1335 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EMatchNearestMailBlockquoteColor e) 1314 1336 : m_type(CSS_IDENT) 1337 , m_hasCachedCSSText(false) 1315 1338 { 1316 1339 switch (e) { … … 1339 1362 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ENBSPMode e) 1340 1363 : m_type(CSS_IDENT) 1364 , m_hasCachedCSSText(false) 1341 1365 { 1342 1366 switch (e) { … … 1365 1389 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EOverflow e) 1366 1390 : m_type(CSS_IDENT) 1391 , m_hasCachedCSSText(false) 1367 1392 { 1368 1393 switch (e) { … … 1411 1436 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPageBreak e) 1412 1437 : m_type(CSS_IDENT) 1438 , m_hasCachedCSSText(false) 1413 1439 { 1414 1440 switch (e) { … … 1444 1470 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPosition e) 1445 1471 : m_type(CSS_IDENT) 1472 , m_hasCachedCSSText(false) 1446 1473 { 1447 1474 switch (e) { … … 1480 1507 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EResize e) 1481 1508 : m_type(CSS_IDENT) 1509 , m_hasCachedCSSText(false) 1482 1510 { 1483 1511 switch (e) { … … 1519 1547 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETableLayout e) 1520 1548 : m_type(CSS_IDENT) 1549 , m_hasCachedCSSText(false) 1521 1550 { 1522 1551 switch (e) { … … 1545 1574 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAlign e) 1546 1575 : m_type(CSS_IDENT) 1576 , m_hasCachedCSSText(false) 1547 1577 { 1548 1578 switch (e) { … … 1588 1618 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextSecurity e) 1589 1619 : m_type(CSS_IDENT) 1620 , m_hasCachedCSSText(false) 1590 1621 { 1591 1622 switch (e) { … … 1624 1655 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextTransform e) 1625 1656 : m_type(CSS_IDENT) 1657 , m_hasCachedCSSText(false) 1626 1658 { 1627 1659 switch (e) { … … 1660 1692 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUnicodeBidi e) 1661 1693 : m_type(CSS_IDENT) 1694 , m_hasCachedCSSText(false) 1662 1695 { 1663 1696 switch (e) { … … 1691 1724 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserDrag e) 1692 1725 : m_type(CSS_IDENT) 1726 , m_hasCachedCSSText(false) 1693 1727 { 1694 1728 switch (e) { … … 1722 1756 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserModify e) 1723 1757 : m_type(CSS_IDENT) 1758 , m_hasCachedCSSText(false) 1724 1759 { 1725 1760 switch (e) { … … 1743 1778 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EUserSelect e) 1744 1779 : m_type(CSS_IDENT) 1780 , m_hasCachedCSSText(false) 1745 1781 { 1746 1782 switch (e) { … … 1771 1807 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EVisibility e) 1772 1808 : m_type(CSS_IDENT) 1809 , m_hasCachedCSSText(false) 1773 1810 { 1774 1811 switch (e) { … … 1802 1839 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWhiteSpace e) 1803 1840 : m_type(CSS_IDENT) 1841 , m_hasCachedCSSText(false) 1804 1842 { 1805 1843 switch (e) { … … 1848 1886 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWordBreak e) 1849 1887 : m_type(CSS_IDENT) 1888 , m_hasCachedCSSText(false) 1850 1889 { 1851 1890 switch (e) { … … 1879 1918 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWordWrap e) 1880 1919 : m_type(CSS_IDENT) 1920 , m_hasCachedCSSText(false) 1881 1921 { 1882 1922 switch (e) { … … 1905 1945 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextDirection e) 1906 1946 : m_type(CSS_IDENT) 1947 , m_hasCachedCSSText(false) 1907 1948 { 1908 1949 switch (e) { … … 1931 1972 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EPointerEvents e) 1932 1973 : m_type(CSS_IDENT) 1974 , m_hasCachedCSSText(false) 1933 1975 { 1934 1976 switch (e) { … … 1997 2039 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(FontSmoothingMode smoothing) 1998 2040 : m_type(CSS_IDENT) 2041 , m_hasCachedCSSText(false) 1999 2042 { 2000 2043 switch (smoothing) { … … 2036 2079 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(TextRenderingMode e) 2037 2080 : m_type(CSS_IDENT) 2081 , m_hasCachedCSSText(false) 2038 2082 { 2039 2083 switch (e) { … … 2072 2116 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ColorSpace space) 2073 2117 : m_type(CSS_IDENT) 2118 , m_hasCachedCSSText(false) 2074 2119 { 2075 2120 switch (space) { … … 2100 2145 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineCap e) 2101 2146 : m_type(CSS_IDENT) 2147 , m_hasCachedCSSText(false) 2102 2148 { 2103 2149 switch (e) { … … 2131 2177 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(LineJoin e) 2132 2178 : m_type(CSS_IDENT) 2179 , m_hasCachedCSSText(false) 2133 2180 { 2134 2181 switch (e) { … … 2162 2209 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(WindRule e) 2163 2210 : m_type(CSS_IDENT) 2211 , m_hasCachedCSSText(false) 2164 2212 { 2165 2213 switch (e) { … … 2189 2237 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EAlignmentBaseline e) 2190 2238 : m_type(CSS_IDENT) 2239 , m_hasCachedCSSText(false) 2191 2240 { 2192 2241 switch (e) { … … 2265 2314 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorInterpolation e) 2266 2315 : m_type(CSS_IDENT) 2316 , m_hasCachedCSSText(false) 2267 2317 { 2268 2318 switch (e) { … … 2296 2346 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EColorRendering e) 2297 2347 : m_type(CSS_IDENT) 2348 , m_hasCachedCSSText(false) 2298 2349 { 2299 2350 switch (e) { … … 2327 2378 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EDominantBaseline e) 2328 2379 : m_type(CSS_IDENT) 2380 , m_hasCachedCSSText(false) 2329 2381 { 2330 2382 switch (e) { … … 2403 2455 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EImageRendering e) 2404 2456 : m_type(CSS_IDENT) 2457 , m_hasCachedCSSText(false) 2405 2458 { 2406 2459 switch (e) { … … 2434 2487 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EShapeRendering e) 2435 2488 : m_type(CSS_IDENT) 2489 , m_hasCachedCSSText(false) 2436 2490 { 2437 2491 switch (e) { … … 2470 2524 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(ETextAnchor e) 2471 2525 : m_type(CSS_IDENT) 2526 , m_hasCachedCSSText(false) 2472 2527 { 2473 2528 switch (e) { … … 2501 2556 template<> inline CSSPrimitiveValue::CSSPrimitiveValue(EWritingMode e) 2502 2557 : m_type(CSS_IDENT) 2558 , m_hasCachedCSSText(false) 2503 2559 { 2504 2560 switch (e) {
Note: See TracChangeset
for help on using the changeset viewer.