OLD | NEW |
---|---|
1 {% from "macros.tmpl" import license %} | 1 {% from "macros.tmpl" import license %} |
2 {{ license() }} | 2 {{ license() }} |
3 | 3 |
4 #include "config.h" | 4 #include "config.h" |
5 | 5 |
6 #include "{{namespace}}Names.h" | 6 #include "{{namespace}}Names.h" |
7 | 7 |
8 #include "wtf/StaticConstructors.h" | 8 #include "wtf/StaticConstructors.h" |
9 #include "wtf/StdLibExtras.h" | |
9 | 10 |
10 namespace blink { | 11 namespace blink { |
11 namespace {{namespace}}Names { | 12 namespace {{namespace}}Names { |
12 | 13 |
13 using namespace blink; | 14 using namespace blink; |
14 | 15 |
15 DEFINE_GLOBAL(AtomicString, {{namespace_prefix}}NamespaceURI) | 16 DEFINE_GLOBAL(AtomicString, {{namespace_prefix}}NamespaceURI) |
16 | 17 |
17 {% if tags %} | 18 {% if tags %} |
18 // Tags | 19 // Tags |
19 {% for tag in tags|sort %} | 20 |
20 DEFINE_GLOBAL({{namespace}}QualifiedName, {{tag|symbol}}Tag) | 21 void* {{suffix}}TagStorage[{{namespace}}TagsCount * ((sizeof({{namespace}}Qualif iedName) + sizeof(void *) - 1) / sizeof(void *))]; |
22 {% for tag in tags|sort(attribute='name', case_sensitive=True) %} | |
23 const {{namespace}}QualifiedName& {{tag|symbol}}Tag = reinterpret_cast<{{namespa ce}}QualifiedName*>(&{{suffix}}TagStorage)[{{loop.index0}}]; | |
Jens Widell
2014/09/25 17:16:16
Could you declare an
const {{namespace}}Qualifi
Daniel Bratell
2014/09/25 17:48:42
I've tried it but it generates warnings like this:
| |
21 {% endfor %} | 24 {% endfor %} |
22 | 25 |
23 | 26 |
24 PassOwnPtr<const {{namespace}}QualifiedName*[]> get{{namespace}}Tags() | 27 PassOwnPtr<const {{namespace}}QualifiedName*[]> get{{namespace}}Tags() |
25 { | 28 { |
26 OwnPtr<const {{namespace}}QualifiedName*[]> tags = adoptArrayPtr(new const { {namespace}}QualifiedName*[{{namespace}}TagsCount]); | 29 OwnPtr<const {{namespace}}QualifiedName*[]> tags = adoptArrayPtr(new const { {namespace}}QualifiedName*[{{namespace}}TagsCount]); |
27 {% for tag in tags|sort %} | 30 for (size_t i = 0; i < {{namespace}}TagsCount; i++) |
28 tags[{{loop.index0}}] = reinterpret_cast<const {{namespace}}QualifiedName*>( &{{tag|symbol}}Tag); | 31 tags[i] = reinterpret_cast<{{namespace}}QualifiedName*>(&{{suffix}}TagSt orage) + i; |
29 {% endfor %} | |
30 return tags.release(); | 32 return tags.release(); |
31 } | 33 } |
32 | 34 |
33 {% endif %} | 35 {% endif %} |
34 // Attributes | 36 // Attributes |
35 {% for attr in attrs|sort %} | 37 |
36 DEFINE_GLOBAL(QualifiedName, {{attr|symbol}}Attr) | 38 void* {{suffix}}AttrStorage[{{namespace}}AttrsCount * ((sizeof(QualifiedName) + sizeof(void *) - 1) / sizeof(void *))]; |
39 | |
40 {% for attr in attrs|sort(attribute='name', case_sensitive=True) %} | |
41 const QualifiedName& {{attr|symbol}}Attr = reinterpret_cast<QualifiedName*>(&{{s uffix}}AttrStorage)[{{loop.index0}}]; | |
37 {% endfor %} | 42 {% endfor %} |
38 | 43 |
39 PassOwnPtr<const QualifiedName*[]> get{{namespace}}Attrs() | 44 PassOwnPtr<const QualifiedName*[]> get{{namespace}}Attrs() |
40 { | 45 { |
41 OwnPtr<const QualifiedName*[]> attrs = adoptArrayPtr(new const QualifiedName *[{{namespace}}AttrsCount]); | 46 OwnPtr<const QualifiedName*[]> attrs = adoptArrayPtr(new const QualifiedName *[{{namespace}}AttrsCount]); |
42 {% for attr in attrs|sort %} | 47 for (size_t i = 0; i < {{namespace}}AttrsCount; i++) |
43 attrs[{{loop.index0}}] = reinterpret_cast<const blink::QualifiedName*>(&{{at tr|symbol}}Attr); | 48 attrs[i] = reinterpret_cast<QualifiedName*>(&{{suffix}}AttrStorage) + i; |
44 {% endfor %} | |
45 return attrs.release(); | 49 return attrs.release(); |
46 } | 50 } |
47 | 51 |
48 void init() | 52 void init() |
49 { | 53 { |
54 struct NameEntry { | |
55 const char* name; | |
56 unsigned hash; | |
57 unsigned char length; | |
58 unsigned char isTag; | |
59 unsigned char isAttr; | |
60 }; | |
61 | |
50 // Use placement new to initialize the globals. | 62 // Use placement new to initialize the globals. |
51 AtomicString {{namespace_prefix}}NS("{{namespace_uri}}", AtomicString::Const ructFromLiteral); | 63 AtomicString {{namespace_prefix}}NS("{{namespace_uri}}", AtomicString::Const ructFromLiteral); |
52 | 64 |
53 // Namespace | 65 // Namespace |
54 new ((void*)&{{namespace_prefix}}NamespaceURI) AtomicString({{namespace_pref ix}}NS); | 66 new ((void*)&{{namespace_prefix}}NamespaceURI) AtomicString({{namespace_pref ix}}NS); |
55 {% for name, tag_list in (tags + attrs)|groupby('name')|sort %} | 67 {% set tagnames = tags|map(attribute='name')|list() %} |
56 StringImpl* {{tag_list[0]|symbol}}Impl = StringImpl::createStatic("{{name}}" , {{name|length}}, {{name|hash}}); | 68 {% set attrnames = attrs|map(attribute='name')|list() %} |
69 static const NameEntry kNames[] = { | |
70 {% for name, tag_list in (tags + attrs)|groupby('name')|sort(attribute=0, ca se_sensitive=True) %} | |
71 { "{{name}}", {{name|hash}}, {{name|length}}, {{ (name in tagnames)|int }}, {{ (name in attrnames)|int }} }, | |
57 {% endfor %} | 72 {% endfor %} |
73 }; | |
58 | 74 |
59 // Tags | 75 {% if tags %} |
60 {% for tag in tags|sort %} | 76 size_t tag_i = 0; |
61 QualifiedName::createStatic((void*)&{{tag|symbol}}Tag, {{tag|symbol}}Impl, { {namespace_prefix}}NS); | 77 {% endif %} |
62 {% endfor %} | 78 size_t attr_i = 0; |
79 for (size_t i = 0; i < WTF_ARRAY_LENGTH(kNames); i++) { | |
80 StringImpl* stringImpl = StringImpl::createStatic(kNames[i].name, kNames [i].length, kNames[i].hash); | |
81 {% if tags %} | |
82 if (kNames[i].isTag) { | |
83 void* address = reinterpret_cast<{{namespace}}QualifiedName*>(&{{suf fix}}TagStorage) + tag_i; | |
84 QualifiedName::createStatic(address, stringImpl, {{namespace_prefix} }NS); | |
85 tag_i++; | |
86 } | |
63 | 87 |
64 // Attrs | 88 if (!kNames[i].isAttr) |
65 {% for attr in attrs|sort %} | 89 continue; |
66 {% if use_namespace_for_attrs %} | 90 {% endif %} |
67 QualifiedName::createStatic((void*)&{{attr|symbol}}Attr, {{attr|symbol}}Impl , {{namespace_prefix}}NS); | 91 void* address = reinterpret_cast<QualifiedName*>(&{{suffix}}AttrStorage) + attr_i; |
68 {% else %} | 92 {% if use_namespace_for_attrs %} |
69 QualifiedName::createStatic((void*)&{{attr|symbol}}Attr, {{attr|symbol}}Impl ); | 93 QualifiedName::createStatic(address, stringImpl, {{namespace_prefix}}NS) ; |
94 {% else %} | |
95 QualifiedName::createStatic(address, stringImpl); | |
96 {% endif %} | |
97 attr_i++; | |
98 } | |
99 {% if tags %} | |
100 ASSERT(tag_i == {{namespace}}TagsCount); | |
70 {% endif %} | 101 {% endif %} |
71 {% endfor %} | 102 ASSERT(attr_i == {{namespace}}AttrsCount); |
72 } | 103 } |
73 | 104 |
74 } // {{namespace}} | 105 } // {{namespace}} |
75 } // namespace blink | 106 } // namespace blink |
OLD | NEW |