| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 | 2 |
| 3 import subprocess | 3 import subprocess |
| 4 import sys | 4 import sys |
| 5 | 5 |
| 6 import css_properties | 6 import css_properties |
| 7 import in_generator | 7 import in_generator |
| 8 import license | 8 import license |
| 9 | 9 |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 namespace blink { | 27 namespace blink { |
| 28 | 28 |
| 29 enum CSSPropertyID { | 29 enum CSSPropertyID { |
| 30 CSSPropertyInvalid = 0, | 30 CSSPropertyInvalid = 0, |
| 31 %(property_enums)s | 31 %(property_enums)s |
| 32 }; | 32 }; |
| 33 | 33 |
| 34 const int firstCSSProperty = %(first_property_id)s; | 34 const int firstCSSProperty = %(first_property_id)s; |
| 35 const int numCSSProperties = %(properties_count)s; | 35 const int numCSSProperties = %(properties_count)s; |
| 36 const int lastCSSProperty = %(last_property_id)d; | 36 const int lastCSSProperty = %(last_property_id)d; |
| 37 const int lastUnresolvedCSSProperty = %(last_unresolved_property_id)d; |
| 37 const size_t maxCSSPropertyNameLength = %(max_name_length)d; | 38 const size_t maxCSSPropertyNameLength = %(max_name_length)d; |
| 38 | 39 |
| 39 const char* getPropertyName(CSSPropertyID); | 40 const char* getPropertyName(CSSPropertyID); |
| 40 const WTF::AtomicString& getPropertyNameAtomicString(CSSPropertyID); | 41 const WTF::AtomicString& getPropertyNameAtomicString(CSSPropertyID); |
| 41 WTF::String getPropertyNameString(CSSPropertyID); | 42 WTF::String getPropertyNameString(CSSPropertyID); |
| 42 WTF::String getJSPropertyName(CSSPropertyID); | 43 WTF::String getJSPropertyName(CSSPropertyID); |
| 43 | 44 |
| 44 inline CSSPropertyID convertToCSSPropertyID(int value) | 45 inline CSSPropertyID convertToCSSPropertyID(int value) |
| 45 { | 46 { |
| 46 ASSERT((value >= firstCSSProperty && value <= lastCSSProperty) || value == C
SSPropertyInvalid); | 47 ASSERT((value >= firstCSSProperty && value <= lastCSSProperty) || value == C
SSPropertyInvalid); |
| 47 return static_cast<CSSPropertyID>(value); | 48 return static_cast<CSSPropertyID>(value); |
| 48 } | 49 } |
| 49 | 50 |
| 51 inline CSSPropertyID resolveCSSPropertyID(CSSPropertyID id) |
| 52 { |
| 53 return convertToCSSPropertyID(id & ~512); |
| 54 } |
| 55 |
| 56 inline bool isPropertyAlias(CSSPropertyID id) { return id & 512; } |
| 57 |
| 50 } // namespace blink | 58 } // namespace blink |
| 51 | 59 |
| 52 namespace WTF { | 60 namespace WTF { |
| 53 template<> struct DefaultHash<blink::CSSPropertyID> { typedef IntHash<unsigned>
Hash; }; | 61 template<> struct DefaultHash<blink::CSSPropertyID> { typedef IntHash<unsigned>
Hash; }; |
| 54 template<> struct HashTraits<blink::CSSPropertyID> : GenericHashTraits<blink::CS
SPropertyID> { | 62 template<> struct HashTraits<blink::CSSPropertyID> : GenericHashTraits<blink::CS
SPropertyID> { |
| 55 static const bool emptyValueIsZero = true; | 63 static const bool emptyValueIsZero = true; |
| 56 static void constructDeletedValue(blink::CSSPropertyID& slot, bool) { slot =
static_cast<blink::CSSPropertyID>(blink::lastCSSProperty + 1); } | 64 static void constructDeletedValue(blink::CSSPropertyID& slot, bool) { slot =
static_cast<blink::CSSPropertyID>(blink::lastUnresolvedCSSProperty + 1); } |
| 57 static bool isDeletedValue(blink::CSSPropertyID value) { return value == (bl
ink::lastCSSProperty + 1); } | 65 static bool isDeletedValue(blink::CSSPropertyID value) { return value == (bl
ink::lastUnresolvedCSSProperty + 1); } |
| 58 }; | 66 }; |
| 59 } | 67 } |
| 60 | 68 |
| 61 #endif // %(class_name)s_h | 69 #endif // %(class_name)s_h |
| 62 """ | 70 """ |
| 63 | 71 |
| 64 GPERF_TEMPLATE = """ | 72 GPERF_TEMPLATE = """ |
| 65 %%{ | 73 %%{ |
| 66 %(license)s | 74 %(license)s |
| 67 | 75 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 (self.class_name + ".cpp"): self.generate_implementatio
n, | 181 (self.class_name + ".cpp"): self.generate_implementatio
n, |
| 174 } | 182 } |
| 175 | 183 |
| 176 def _enum_declaration(self, property): | 184 def _enum_declaration(self, property): |
| 177 return " %(property_id)s = %(enum_value)s," % property | 185 return " %(property_id)s = %(enum_value)s," % property |
| 178 | 186 |
| 179 def generate_header(self): | 187 def generate_header(self): |
| 180 return HEADER_TEMPLATE % { | 188 return HEADER_TEMPLATE % { |
| 181 'license': license.license_for_generated_cpp(), | 189 'license': license.license_for_generated_cpp(), |
| 182 'class_name': self.class_name, | 190 'class_name': self.class_name, |
| 183 'property_enums': "\n".join(map(self._enum_declaration, self._proper
ties_list)), | 191 'property_enums': "\n".join(map(self._enum_declaration, self._proper
ties_including_aliases)), |
| 184 'first_property_id': self._first_enum_value, | 192 'first_property_id': self._first_enum_value, |
| 185 'properties_count': len(self._properties), | 193 'properties_count': len(self._properties), |
| 186 'last_property_id': self._first_enum_value + len(self._properties) -
1, | 194 'last_property_id': self._first_enum_value + len(self._properties) -
1, |
| 195 'last_unresolved_property_id': max(property["enum_value"] for proper
ty in self._properties_including_aliases), |
| 187 'max_name_length': max(map(len, self._properties)), | 196 'max_name_length': max(map(len, self._properties)), |
| 188 } | 197 } |
| 189 | 198 |
| 190 def generate_implementation(self): | 199 def generate_implementation(self): |
| 191 property_offsets = [] | 200 property_offsets = [] |
| 192 current_offset = 0 | 201 current_offset = 0 |
| 193 for property in self._properties_list: | 202 for property in self._properties_including_aliases: |
| 194 property_offsets.append(current_offset) | 203 property_offsets.append(current_offset) |
| 195 current_offset += len(property["name"]) + 1 | 204 current_offset += len(property["name"]) + 1 |
| 196 | 205 |
| 197 css_name_and_enum_pairs = [(property['name'], property_id) for property_
id, property in self._properties.items()] | 206 css_name_and_enum_pairs = [(property['name'], property['property_id']) f
or property in self._properties_including_aliases] |
| 198 for name, aliased_name in self._aliases.items(): | |
| 199 css_name_and_enum_pairs.append((name, css_properties.css_name_to_enu
m(aliased_name))) | |
| 200 | 207 |
| 201 gperf_input = GPERF_TEMPLATE % { | 208 gperf_input = GPERF_TEMPLATE % { |
| 202 'license': license.license_for_generated_cpp(), | 209 'license': license.license_for_generated_cpp(), |
| 203 'class_name': self.class_name, | 210 'class_name': self.class_name, |
| 204 'property_name_strings': '\n'.join(map(lambda property: ' "%(name
)s\\0"' % property, self._properties_list)), | 211 'property_name_strings': '\n'.join(map(lambda property: ' "%(name
)s\\0"' % property, self._properties_including_aliases)), |
| 205 'property_name_offsets': '\n'.join(map(lambda offset: ' %d,' % of
fset, property_offsets)), | 212 'property_name_offsets': '\n'.join(map(lambda offset: ' %d,' % of
fset, property_offsets)), |
| 206 'property_to_enum_map': '\n'.join(map(lambda property: '%s, %s' % pr
operty, css_name_and_enum_pairs)), | 213 'property_to_enum_map': '\n'.join(map(lambda property: '%s, %s' % pr
operty, css_name_and_enum_pairs)), |
| 207 } | 214 } |
| 208 # FIXME: If we could depend on Python 2.7, we would use subprocess.check
_output | 215 # FIXME: If we could depend on Python 2.7, we would use subprocess.check
_output |
| 209 gperf_args = [self.gperf_path, '--key-positions=*', '-P', '-n'] | 216 gperf_args = [self.gperf_path, '--key-positions=*', '-P', '-n'] |
| 210 gperf_args.extend(['-m', '50']) # Pick best of 50 attempts. | 217 gperf_args.extend(['-m', '50']) # Pick best of 50 attempts. |
| 211 gperf_args.append('-D') # Allow duplicate hashes -> More compact code. | 218 gperf_args.append('-D') # Allow duplicate hashes -> More compact code. |
| 212 gperf = subprocess.Popen(gperf_args, stdin=subprocess.PIPE, stdout=subpr
ocess.PIPE, universal_newlines=True) | 219 gperf = subprocess.Popen(gperf_args, stdin=subprocess.PIPE, stdout=subpr
ocess.PIPE, universal_newlines=True) |
| 213 return gperf.communicate(gperf_input)[0] | 220 return gperf.communicate(gperf_input)[0] |
| 214 | 221 |
| 215 | 222 |
| 216 if __name__ == "__main__": | 223 if __name__ == "__main__": |
| 217 in_generator.Maker(CSSPropertyNamesWriter).main(sys.argv) | 224 in_generator.Maker(CSSPropertyNamesWriter).main(sys.argv) |
| OLD | NEW |