OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 import os.path | 3 import os.path |
4 import re | 4 import re |
5 import subprocess | 5 import subprocess |
6 import sys | 6 import sys |
7 | 7 |
8 from in_file import InFile | 8 from in_file import InFile |
9 import in_generator | 9 import in_generator |
10 import license | 10 import license |
(...skipping 28 matching lines...) Expand all Loading... |
39 GPERF_TEMPLATE = """ | 39 GPERF_TEMPLATE = """ |
40 %%{ | 40 %%{ |
41 %(license)s | 41 %(license)s |
42 | 42 |
43 #include "config.h" | 43 #include "config.h" |
44 #include "%(class_name)s.h" | 44 #include "%(class_name)s.h" |
45 #include "core/platform/HashTools.h" | 45 #include "core/platform/HashTools.h" |
46 #include <string.h> | 46 #include <string.h> |
47 | 47 |
48 namespace WebCore { | 48 namespace WebCore { |
49 const char* const valueList[] = { | 49 static const char valueListStringPool[] = { |
50 "", | 50 "\\0" |
51 %(value_keyword_strings)s | 51 %(value_keyword_strings)s |
52 0 | 52 }; |
| 53 |
| 54 static const unsigned short valueListStringOffsets[] = { |
| 55 %(value_keyword_offsets)s |
53 }; | 56 }; |
54 | 57 |
55 %%} | 58 %%} |
56 %%struct-type | 59 %%struct-type |
57 struct Value; | 60 struct Value; |
58 %%omit-struct-type | 61 %%omit-struct-type |
59 %%language=C++ | 62 %%language=C++ |
60 %%readonly-tables | 63 %%readonly-tables |
61 %%compare-strncmp | 64 %%compare-strncmp |
62 %%define class-name %(class_name)sHash | 65 %%define class-name %(class_name)sHash |
63 %%define lookup-function-name findValueImpl | 66 %%define lookup-function-name findValueImpl |
64 %%define hash-function-name value_hash_function | 67 %%define hash-function-name value_hash_function |
| 68 %%define slot-name nameOffset |
65 %%define word-array-name value_word_list | 69 %%define word-array-name value_word_list |
| 70 %%pic |
66 %%enum | 71 %%enum |
67 %%%% | 72 %%%% |
68 %(value_keyword_to_enum_map)s | 73 %(value_keyword_to_enum_map)s |
69 %%%% | 74 %%%% |
70 const Value* findValue(register const char* str, register unsigned int len) | 75 const Value* findValue(register const char* str, register unsigned int len) |
71 { | 76 { |
72 return CSSValueKeywordsHash::findValueImpl(str, len); | 77 return CSSValueKeywordsHash::findValueImpl(str, len); |
73 } | 78 } |
74 | 79 |
75 const char* getValueName(unsigned short id) | 80 const char* getValueName(unsigned short id) |
76 { | 81 { |
77 if (id >= numCSSValueKeywords || id <= 0) | 82 if (id >= numCSSValueKeywords || id <= 0) |
78 return 0; | 83 return 0; |
79 return valueList[id]; | 84 return valueListStringPool + valueListStringOffsets[id]; |
80 } | 85 } |
81 | 86 |
82 bool isValueAllowedInMode(unsigned short id, CSSParserMode mode) | 87 bool isValueAllowedInMode(unsigned short id, CSSParserMode mode) |
83 { | 88 { |
84 switch (id) { | 89 switch (id) { |
85 %(ua_sheet_mode_values_keywords)s | 90 %(ua_sheet_mode_values_keywords)s |
86 return mode == UASheetMode; | 91 return mode == UASheetMode; |
87 %(quirks_mode_values_keywords)s | 92 %(quirks_mode_values_keywords)s |
88 return mode == CSSQuirksMode; | 93 return mode == CSSQuirksMode; |
89 %(quirks_mode_or_ua_sheet_mode_values_keywords)s | 94 %(quirks_mode_or_ua_sheet_mode_values_keywords)s |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 'class_name': self.class_name, | 144 'class_name': self.class_name, |
140 'value_keyword_enums': "\n".join(enum_enties), | 145 'value_keyword_enums': "\n".join(enum_enties), |
141 'value_keywords_count': len(enum_enties), | 146 'value_keywords_count': len(enum_enties), |
142 'max_value_keyword_length': reduce(max, map(len, map(lambda property
: property['name'], self._value_keywords))), | 147 'max_value_keyword_length': reduce(max, map(len, map(lambda property
: property['name'], self._value_keywords))), |
143 } | 148 } |
144 | 149 |
145 def _value_keywords_with_mode(self, mode): | 150 def _value_keywords_with_mode(self, mode): |
146 return filter(lambda property: property['mode'] == mode, self._value_key
words) | 151 return filter(lambda property: property['mode'] == mode, self._value_key
words) |
147 | 152 |
148 def generate_implementation(self): | 153 def generate_implementation(self): |
| 154 keyword_offsets = [0] |
| 155 current_offset = 1 |
| 156 for keyword in self._value_keywords: |
| 157 keyword_offsets.append(current_offset) |
| 158 current_offset += len(keyword["name"]) + 1 |
| 159 |
149 gperf_input = GPERF_TEMPLATE % { | 160 gperf_input = GPERF_TEMPLATE % { |
150 'license': license.license_for_generated_cpp(), | 161 'license': license.license_for_generated_cpp(), |
151 'class_name': self.class_name, | 162 'class_name': self.class_name, |
152 'value_keyword_strings': '\n'.join(map(lambda property: ' "%(name
)s",' % property, self._value_keywords)), | 163 'value_keyword_strings': '\n'.join(map(lambda property: ' "%(name
)s\\0"' % property, self._value_keywords)), |
| 164 'value_keyword_offsets': '\n'.join(map(lambda offset: ' %d,' % offs
et, keyword_offsets)), |
153 'value_keyword_to_enum_map': '\n'.join(map(lambda property: '%(name)
s, %(enum_name)s' % property, self._value_keywords)), | 165 'value_keyword_to_enum_map': '\n'.join(map(lambda property: '%(name)
s, %(enum_name)s' % property, self._value_keywords)), |
154 'ua_sheet_mode_values_keywords': '\n'.join(map(self._case_value_keyw
ord, self._value_keywords_with_mode('UASheet'))), | 166 'ua_sheet_mode_values_keywords': '\n '.join(map(self._case_va
lue_keyword, self._value_keywords_with_mode('UASheet'))), |
155 'quirks_mode_values_keywords': '\n'.join(map(self._case_value_keywor
d, self._value_keywords_with_mode('Quirks'))), | 167 'quirks_mode_values_keywords': '\n '.join(map(self._case_valu
e_keyword, self._value_keywords_with_mode('Quirks'))), |
156 'quirks_mode_or_ua_sheet_mode_values_keywords': '\n'.join(map(self._
case_value_keyword, self._value_keywords_with_mode('QuirksOrUASheet'))), | 168 'quirks_mode_or_ua_sheet_mode_values_keywords': '\n '.join(map(se
lf._case_value_keyword, self._value_keywords_with_mode('QuirksOrUASheet'))), |
157 } | 169 } |
158 # FIXME: If we could depend on Python 2.7, we would use subprocess.check
_output | 170 # FIXME: If we could depend on Python 2.7, we would use subprocess.check
_output |
159 gperf_args = ['gperf', '--key-positions=*', '-D', '-n', '-s', '2'] | 171 gperf_args = ['gperf', '--key-positions=*', '-D', '-n', '-s', '2'] |
160 gperf = subprocess.Popen(gperf_args, stdin=subprocess.PIPE, stdout=subpr
ocess.PIPE) | 172 gperf = subprocess.Popen(gperf_args, stdin=subprocess.PIPE, stdout=subpr
ocess.PIPE) |
161 return gperf.communicate(gperf_input)[0] | 173 return gperf.communicate(gperf_input)[0] |
162 | 174 |
163 | 175 |
164 if __name__ == "__main__": | 176 if __name__ == "__main__": |
165 in_generator.Maker(CSSValueKeywordsWriter).main(sys.argv) | 177 in_generator.Maker(CSSValueKeywordsWriter).main(sys.argv) |
OLD | NEW |