Further shrink table-populating code by making the tables read-only data and preventi...
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 17:17:50 +0000 (17:17 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Sep 2013 17:17:50 +0000 (17:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121468

Reviewed by Sam Weinig.

* bindings/scripts/StaticString.pm:
(GenerateStrings): Eliminated the xxxImpl globals. We definitely did not need
globals for these, much less read-write data. Instead, write the expression at
each site where we need them.
(GenerateStringAsserts): This is one such site (see above).
* css/CSSSelector.cpp:
(WebCore::populatePseudoTypeByNameMap): Mark this function NEVER_INLINE and
add static to make sure the table ends up in read-only data.
* dom/make_names.pl:
(printDefinitions): Write the xxxImpl expression (see above).
(printFactoryCppFile): Ditto. Also mark the populate function NEVER_INLINE and
add static to make sure the table ends up in read-only data.
(printWrapperFactoryCppFile): Ditto.
* html/HTMLElement.cpp:
(WebCore::populateEventNameForAttributeLocalNameMap): Mark this function
NEVER_INLINE and add static to makes sure the table ends up in read-only data.

* platform/text/UnicodeRange.cpp: Added a const to make this read-only data.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155970 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/StaticString.pm
Source/WebCore/css/CSSSelector.cpp
Source/WebCore/dom/make_names.pl
Source/WebCore/html/HTMLElement.cpp
Source/WebCore/platform/text/UnicodeRange.cpp

index ffe6a50..5d40eec 100644 (file)
@@ -1,5 +1,31 @@
 2013-09-17  Darin Adler  <darin@apple.com>
 
+        Further shrink table-populating code by making the tables read-only data and preventing inlining
+        https://bugs.webkit.org/show_bug.cgi?id=121468
+
+        Reviewed by Sam Weinig.
+
+        * bindings/scripts/StaticString.pm:
+        (GenerateStrings): Eliminated the xxxImpl globals. We definitely did not need
+        globals for these, much less read-write data. Instead, write the expression at
+        each site where we need them.
+        (GenerateStringAsserts): This is one such site (see above).
+        * css/CSSSelector.cpp:
+        (WebCore::populatePseudoTypeByNameMap): Mark this function NEVER_INLINE and
+        add static to make sure the table ends up in read-only data.
+        * dom/make_names.pl:
+        (printDefinitions): Write the xxxImpl expression (see above).
+        (printFactoryCppFile): Ditto. Also mark the populate function NEVER_INLINE and
+        add static to make sure the table ends up in read-only data.
+        (printWrapperFactoryCppFile): Ditto.
+        * html/HTMLElement.cpp:
+        (WebCore::populateEventNameForAttributeLocalNameMap): Mark this function
+        NEVER_INLINE and add static to makes sure the table ends up in read-only data.
+
+        * platform/text/UnicodeRange.cpp: Added a const to make this read-only data.
+
+2013-09-17  Darin Adler  <darin@apple.com>
+
         Shrink SVGElement::cssPropertyIdForSVGAttributeName and cssPropertyToTypeMap
         https://bugs.webkit.org/show_bug.cgi?id=121499
 
index a10e3c8..b8feaa5 100644 (file)
@@ -55,12 +55,6 @@ END
 
     push(@result, "\n");
 
-    while ( my ($name, $value) = each %strings ) {
-        push(@result, "static StringImpl* ${name}Impl = reinterpret_cast<StringImpl*>(&${name}Data);\n");
-    }
-
-    push(@result, "\n");
-
     return join "", @result;
 }
 
@@ -74,7 +68,7 @@ sub GenerateStringAsserts($)
     push(@result, "#ifndef NDEBUG\n");
 
     while ( my ($name, $value) = each %strings ) {
-        push(@result, "    ${name}Impl->assertHashIsCorrect();\n");
+        push(@result, "    reinterpret_cast<StringImpl*>(&${name}Data)->assertHashIsCorrect();\n");
     }
 
     push(@result, "#endif // NDEBUG\n");
index 1316700..10a886d 100644 (file)
@@ -256,7 +256,7 @@ PseudoId CSSSelector::pseudoId(PseudoType type)
     return NOPSEUDO;
 }
 
-static void populatePseudoTypeByNameMap(HashMap<AtomicString, CSSSelector::PseudoType>& map)
+static NEVER_INLINE void populatePseudoTypeByNameMap(HashMap<AtomicString, CSSSelector::PseudoType>& map)
 {
     struct TableEntry {
         const char* name;
@@ -267,7 +267,7 @@ static void populatePseudoTypeByNameMap(HashMap<AtomicString, CSSSelector::Pseud
     // Could use strlen in this macro but not all compilers can constant-fold it.
 #define TABLE_ENTRY(name, type) { name, sizeof(name) - 1, CSSSelector::type },
 
-    const TableEntry table[] = {
+    static const TableEntry table[] = {
         TABLE_ENTRY("-khtml-drag", PseudoDrag)
         TABLE_ENTRY("-webkit-any(", PseudoAny)
         TABLE_ENTRY("-webkit-any-link", PseudoAnyLink)
index 739abc2..9834513 100755 (executable)
@@ -130,7 +130,7 @@ if (length($fontNamesIn)) {
         # FIXME: Would like to use static_cast here, but there are differences in const
         # depending on whether SKIP_STATIC_CONSTRUCTORS_ON_GCC is used, so stick with a
         # C-style cast for now.
-        print F "    new (NotNull, (void*)&$name) AtomicString(${name}Impl);\n";
+        print F "    new (NotNull, (void*)&$name) AtomicString(reinterpret_cast<StringImpl*>(&${name}Data));\n";
     }
 
     print F "}\n}\n}\n";
@@ -849,11 +849,11 @@ print F <<END
         StringImpl& name;
     };
 
-    const ${capitalizedType}TableEntry ${type}Table[] = {
+    static const ${capitalizedType}TableEntry ${type}Table[] = {
 END
 ;
     for my $name (sort keys %$namesRef) {
-        print F "        { (void*)&$name$shortCamelType, *${name}Impl },\n";
+        print F "        { (void*)&$name$shortCamelType, *reinterpret_cast<StringImpl*>(&${name}Data) },\n";
     }
 
 print F <<END
@@ -929,14 +929,14 @@ END
     printConstructors($F, \%tagConstructorMap);
 
     print F <<END
-static void populate$parameters{namespace}FactoryMap(HashMap<AtomicStringImpl*, $parameters{namespace}ConstructorFunction>& map)
+static NEVER_INLINE void populate$parameters{namespace}FactoryMap(HashMap<AtomicStringImpl*, $parameters{namespace}ConstructorFunction>& map)
 {
     struct TableEntry {
         const QualifiedName& name;
         $parameters{namespace}ConstructorFunction function;
     };
 
-    const TableEntry table[] = {
+    static const TableEntry table[] = {
 END
     ;
 
@@ -1169,14 +1169,14 @@ END
 
 print F <<END
 
-static void populate$parameters{namespace}WrapperMap(HashMap<AtomicStringImpl*, Create$parameters{namespace}ElementWrapperFunction>& map)
+static NEVER_INLINE void populate$parameters{namespace}WrapperMap(HashMap<AtomicStringImpl*, Create$parameters{namespace}ElementWrapperFunction>& map)
 {
     struct TableEntry {
         const QualifiedName& name;
         Create$parameters{namespace}ElementWrapperFunction function;
     };
 
-    const TableEntry table[] = {
+    static const TableEntry table[] = {
 END
 ;
 
index f03ccf2..e8a208d 100644 (file)
@@ -212,9 +212,9 @@ void HTMLElement::collectStyleForPresentationAttribute(const QualifiedName& name
         StyledElement::collectStyleForPresentationAttribute(name, value, style);
 }
 
-static void populateEventNameForAttributeLocalNameMap(HashMap<AtomicStringImpl*, AtomicString>& map)
+static NEVER_INLINE void populateEventNameForAttributeLocalNameMap(HashMap<AtomicStringImpl*, AtomicString>& map)
 {
-    const QualifiedName* const simpleTable[] = {
+    static const QualifiedName* const simpleTable[] = {
         &onabortAttr,
         &onbeforecopyAttr,
         &onbeforecutAttr,
index 0373441..f44f22d 100644 (file)
@@ -40,7 +40,7 @@ namespace WebCore {
 // This table depends on unicode range definitions. 
 // Each item's index must correspond to a unicode range value
 // eg. x-cyrillic = LangGroupTable[cRangeCyrillic]
-static const char* gUnicodeRangeToLangGroupTable[] = 
+static const char* const gUnicodeRangeToLangGroupTable[] =
 {
   "x-cyrillic",
   "el",