Index: Source/build/scripts/templates/MakeQualifiedNames.cpp.tmpl |
diff --git a/Source/build/scripts/templates/MakeQualifiedNames.cpp.tmpl b/Source/build/scripts/templates/MakeQualifiedNames.cpp.tmpl |
index f5eb9838181ca5790dcdaa3a517210a1837f80a2..1e36db421d57f8f9a305bd8e2ed7b01eae6b4e63 100644 |
--- a/Source/build/scripts/templates/MakeQualifiedNames.cpp.tmpl |
+++ b/Source/build/scripts/templates/MakeQualifiedNames.cpp.tmpl |
@@ -6,6 +6,7 @@ |
#include "{{namespace}}Names.h" |
#include "wtf/StaticConstructors.h" |
+#include "wtf/StdLibExtras.h" |
namespace blink { |
namespace {{namespace}}Names { |
@@ -16,8 +17,10 @@ DEFINE_GLOBAL(AtomicString, {{namespace_prefix}}NamespaceURI) |
{% if tags %} |
// Tags |
-{% for tag in tags|sort %} |
-DEFINE_GLOBAL({{namespace}}QualifiedName, {{tag|symbol}}Tag) |
+ |
+void* {{suffix}}TagStorage[{{namespace}}TagsCount * ((sizeof({{namespace}}QualifiedName) + sizeof(void *) - 1) / sizeof(void *))]; |
+{% for tag in tags|sort(attribute='name', case_sensitive=True) %} |
+const {{namespace}}QualifiedName& {{tag|symbol}}Tag = reinterpret_cast<{{namespace}}QualifiedName*>(&{{suffix}}TagStorage)[{{loop.index0}}]; |
{% endfor %} |
@@ -25,26 +28,27 @@ DEFINE_GLOBAL({{namespace}}QualifiedName, {{tag|symbol}}Tag) |
PassOwnPtr<const {{namespace}}QualifiedName*[]> get{{namespace}}Tags() |
{ |
OwnPtr<const {{namespace}}QualifiedName*[]> tags = adoptArrayPtr(new const {{namespace}}QualifiedName*[{{namespace}}TagsCount]); |
- {% for tag in tags|sort %} |
- tags[{{loop.index0}}] = reinterpret_cast<const {{namespace}}QualifiedName*>(&{{tag|symbol}}Tag); |
- {% endfor %} |
+ for (size_t i = 0; i < {{namespace}}TagsCount; i++) |
+ tags[i] = reinterpret_cast<{{namespace}}QualifiedName*>(&{{suffix}}TagStorage) + i; |
return tags.release(); |
} |
{% endif %} |
{% endif %} |
// Attributes |
-{% for attr in attrs|sort %} |
-DEFINE_GLOBAL(QualifiedName, {{attr|symbol}}Attr) |
+ |
+void* {{suffix}}AttrStorage[{{namespace}}AttrsCount * ((sizeof(QualifiedName) + sizeof(void *) - 1) / sizeof(void *))]; |
+ |
+{% for attr in attrs|sort(attribute='name', case_sensitive=True) %} |
+const QualifiedName& {{attr|symbol}}Attr = reinterpret_cast<QualifiedName*>(&{{suffix}}AttrStorage)[{{loop.index0}}]; |
{% endfor %} |
{% if namespace != 'HTML' %} |
PassOwnPtr<const QualifiedName*[]> get{{namespace}}Attrs() |
{ |
OwnPtr<const QualifiedName*[]> attrs = adoptArrayPtr(new const QualifiedName*[{{namespace}}AttrsCount]); |
- {% for attr in attrs|sort %} |
- attrs[{{loop.index0}}] = reinterpret_cast<const blink::QualifiedName*>(&{{attr|symbol}}Attr); |
- {% endfor %} |
+ for (size_t i = 0; i < {{namespace}}AttrsCount; i++) |
+ attrs[i] = reinterpret_cast<QualifiedName*>(&{{suffix}}AttrStorage) + i; |
return attrs.release(); |
} |
{% endif %} |
@@ -52,28 +56,55 @@ PassOwnPtr<const QualifiedName*[]> get{{namespace}}Attrs() |
void init() |
{ |
+ struct NameEntry { |
+ const char* name; |
+ unsigned hash; |
+ unsigned char length; |
+ unsigned char isTag; |
+ unsigned char isAttr; |
+ }; |
+ |
// Use placement new to initialize the globals. |
AtomicString {{namespace_prefix}}NS("{{namespace_uri}}", AtomicString::ConstructFromLiteral); |
// Namespace |
new ((void*)&{{namespace_prefix}}NamespaceURI) AtomicString({{namespace_prefix}}NS); |
- {% for name, tag_list in (tags + attrs)|groupby('name')|sort %} |
- StringImpl* {{tag_list[0]|symbol}}Impl = StringImpl::createStatic("{{name}}", {{name|length}}, {{name|hash}}); |
- {% endfor %} |
- |
- // Tags |
- {% for tag in tags|sort %} |
- QualifiedName::createStatic((void*)&{{tag|symbol}}Tag, {{tag|symbol}}Impl, {{namespace_prefix}}NS); |
+ {% set tagnames = tags|map(attribute='name')|list() %} |
+ {% set attrnames = attrs|map(attribute='name')|list() %} |
+ static const NameEntry kNames[] = { |
+ {% for name, tag_list in (tags + attrs)|groupby('name')|sort(attribute=0, case_sensitive=True) %} |
+ { "{{name}}", {{name|hash}}, {{name|length}}, {{ (name in tagnames)|int }}, {{ (name in attrnames)|int }} }, |
{% endfor %} |
+ }; |
- // Attrs |
- {% for attr in attrs|sort %} |
- {% if use_namespace_for_attrs %} |
- QualifiedName::createStatic((void*)&{{attr|symbol}}Attr, {{attr|symbol}}Impl, {{namespace_prefix}}NS); |
- {% else %} |
- QualifiedName::createStatic((void*)&{{attr|symbol}}Attr, {{attr|symbol}}Impl); |
+ {% if tags %} |
+ size_t tag_i = 0; |
{% endif %} |
- {% endfor %} |
+ size_t attr_i = 0; |
+ for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNames); i++) { |
+ StringImpl* stringImpl = StringImpl::createStatic(kNames[i].name, kNames[i].length, kNames[i].hash); |
+ {% if tags %} |
+ if (kNames[i].isTag) { |
+ void* address = reinterpret_cast<{{namespace}}QualifiedName*>(&{{suffix}}TagStorage) + tag_i; |
+ QualifiedName::createStatic(address, stringImpl, {{namespace_prefix}}NS); |
+ tag_i++; |
+ } |
+ |
+ if (!kNames[i].isAttr) |
+ continue; |
+ {% endif %} |
+ void* address = reinterpret_cast<QualifiedName*>(&{{suffix}}AttrStorage) + attr_i; |
+ {% if use_namespace_for_attrs %} |
+ QualifiedName::createStatic(address, stringImpl, {{namespace_prefix}}NS); |
+ {% else %} |
+ QualifiedName::createStatic(address, stringImpl); |
+ {% endif %} |
+ attr_i++; |
+ } |
+ {% if tags %} |
+ ASSERT(tag_i == {{namespace}}TagsCount); |
+ {% endif %} |
+ ASSERT(attr_i == {{namespace}}AttrsCount); |
} |
} // {{namespace}} |