| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/symbols.h" | 5 #include "vm/symbols.h" |
| 6 | 6 |
| 7 #include "vm/handles.h" | 7 #include "vm/handles.h" |
| 8 #include "vm/handles_impl.h" | 8 #include "vm/handles_impl.h" |
| 9 #include "vm/hash_table.h" | 9 #include "vm/hash_table.h" |
| 10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 } else { | 163 } else { |
| 164 String& result = String::Handle( | 164 String& result = String::Handle( |
| 165 String::SubString(str_, begin_index_, len_, Heap::kOld)); | 165 String::SubString(str_, begin_index_, len_, Heap::kOld)); |
| 166 result.SetCanonical(); | 166 result.SetCanonical(); |
| 167 result.SetHash(hash_); | 167 result.SetHash(hash_); |
| 168 return result.raw(); | 168 return result.raw(); |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 | 172 |
| 173 class ConcatString { |
| 174 public: |
| 175 ConcatString(const String& str1, const String& str2) |
| 176 : str1_(str1), str2_(str2), hash_(String::HashConcat(str1, str2)) {} |
| 177 RawString* ToSymbol() const; |
| 178 bool Equals(const String& other) const { |
| 179 return other.EqualsConcat(str1_, str2_); |
| 180 } |
| 181 intptr_t Hash() const { return hash_; } |
| 182 private: |
| 183 const String& str1_; |
| 184 const String& str2_; |
| 185 intptr_t hash_; |
| 186 }; |
| 187 |
| 188 |
| 189 RawString* ConcatString::ToSymbol() const { |
| 190 String& result = String::Handle(String::Concat(str1_, str2_, Heap::kOld)); |
| 191 result.SetCanonical(); |
| 192 result.SetHash(hash_); |
| 193 return result.raw(); |
| 194 } |
| 195 |
| 196 |
| 173 class SymbolTraits { | 197 class SymbolTraits { |
| 174 public: | 198 public: |
| 175 static bool IsMatch(const Object& a, const Object& b) { | 199 static bool IsMatch(const Object& a, const Object& b) { |
| 176 return String::Cast(a).Equals(String::Cast(b)); | 200 return String::Cast(a).Equals(String::Cast(b)); |
| 177 } | 201 } |
| 178 template<typename CharType> | 202 template<typename CharType> |
| 179 static bool IsMatch(const CharArray<CharType>& array, const Object& obj) { | 203 static bool IsMatch(const CharArray<CharType>& array, const Object& obj) { |
| 180 return array.Equals(String::Cast(obj)); | 204 return array.Equals(String::Cast(obj)); |
| 181 } | 205 } |
| 182 static bool IsMatch(const StringSlice& slice, const Object& obj) { | 206 static bool IsMatch(const StringSlice& slice, const Object& obj) { |
| 183 return slice.Equals(String::Cast(obj)); | 207 return slice.Equals(String::Cast(obj)); |
| 184 } | 208 } |
| 209 static bool IsMatch(const ConcatString& concat, const Object& obj) { |
| 210 return concat.Equals(String::Cast(obj)); |
| 211 } |
| 185 static uword Hash(const Object& key) { | 212 static uword Hash(const Object& key) { |
| 186 return String::Cast(key).Hash(); | 213 return String::Cast(key).Hash(); |
| 187 } | 214 } |
| 188 template<typename CharType> | 215 template<typename CharType> |
| 189 static uword Hash(const CharArray<CharType>& array) { | 216 static uword Hash(const CharArray<CharType>& array) { |
| 190 return array.Hash(); | 217 return array.Hash(); |
| 191 } | 218 } |
| 192 static uword Hash(const StringSlice& slice) { | 219 static uword Hash(const StringSlice& slice) { |
| 193 return slice.Hash(); | 220 return slice.Hash(); |
| 194 } | 221 } |
| 222 static uword Hash(const ConcatString& concat) { |
| 223 return concat.Hash(); |
| 224 } |
| 195 template<typename CharType> | 225 template<typename CharType> |
| 196 static RawObject* NewKey(const CharArray<CharType>& array) { | 226 static RawObject* NewKey(const CharArray<CharType>& array) { |
| 197 return array.ToSymbol(); | 227 return array.ToSymbol(); |
| 198 } | 228 } |
| 199 static RawObject* NewKey(const StringSlice& slice) { | 229 static RawObject* NewKey(const StringSlice& slice) { |
| 200 return slice.ToSymbol(); | 230 return slice.ToSymbol(); |
| 201 } | 231 } |
| 232 static RawObject* NewKey(const ConcatString& concat) { |
| 233 return concat.ToSymbol(); |
| 234 } |
| 202 }; | 235 }; |
| 203 typedef UnorderedHashSet<SymbolTraits> SymbolTable; | 236 typedef UnorderedHashSet<SymbolTraits> SymbolTable; |
| 204 | 237 |
| 205 | 238 |
| 206 void Symbols::SetupSymbolTable(Isolate* isolate) { | 239 void Symbols::SetupSymbolTable(Isolate* isolate) { |
| 207 ASSERT(isolate != NULL); | 240 ASSERT(isolate != NULL); |
| 208 | 241 |
| 209 // Setup the symbol table used within the String class. | 242 // Setup the symbol table used within the String class. |
| 210 const intptr_t initial_size = (isolate == Dart::vm_isolate()) ? | 243 const intptr_t initial_size = (isolate == Dart::vm_isolate()) ? |
| 211 kInitialVMIsolateSymtabSize : kInitialSymtabSize; | 244 kInitialVMIsolateSymtabSize : kInitialSymtabSize; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 RawString* Symbols::FromUTF16(const uint16_t* utf16_array, intptr_t len) { | 304 RawString* Symbols::FromUTF16(const uint16_t* utf16_array, intptr_t len) { |
| 272 return NewSymbol(UTF16Array(utf16_array, len)); | 305 return NewSymbol(UTF16Array(utf16_array, len)); |
| 273 } | 306 } |
| 274 | 307 |
| 275 | 308 |
| 276 RawString* Symbols::FromUTF32(const int32_t* utf32_array, intptr_t len) { | 309 RawString* Symbols::FromUTF32(const int32_t* utf32_array, intptr_t len) { |
| 277 return NewSymbol(UTF32Array(utf32_array, len)); | 310 return NewSymbol(UTF32Array(utf32_array, len)); |
| 278 } | 311 } |
| 279 | 312 |
| 280 | 313 |
| 281 // StringType can be StringSlice, Latin1Array, UTF16Array or UTF32Array. | 314 RawString* Symbols::FromConcat(const String& str1, const String& str2) { |
| 315 return NewSymbol(ConcatString(str1, str2)); |
| 316 } |
| 317 |
| 318 |
| 319 // StringType can be StringSlice, ConcatString, or {Latin1,UTF16,UTF32}Array. |
| 282 template<typename StringType> | 320 template<typename StringType> |
| 283 RawString* Symbols::NewSymbol(const StringType& str) { | 321 RawString* Symbols::NewSymbol(const StringType& str) { |
| 284 Isolate* isolate = Isolate::Current(); | 322 Isolate* isolate = Isolate::Current(); |
| 285 String& symbol = String::Handle(isolate); | 323 String& symbol = String::Handle(isolate); |
| 286 { | 324 { |
| 287 Isolate* vm_isolate = Dart::vm_isolate(); | 325 Isolate* vm_isolate = Dart::vm_isolate(); |
| 288 SymbolTable table(isolate, vm_isolate->object_store()->symbol_table()); | 326 SymbolTable table(isolate, vm_isolate->object_store()->symbol_table()); |
| 289 symbol ^= table.GetOrNull(str); | 327 symbol ^= table.GetOrNull(str); |
| 290 table.Release(); | 328 table.Release(); |
| 291 } | 329 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 RawObject* Symbols::GetVMSymbol(intptr_t object_id) { | 389 RawObject* Symbols::GetVMSymbol(intptr_t object_id) { |
| 352 ASSERT(IsVMSymbolId(object_id)); | 390 ASSERT(IsVMSymbolId(object_id)); |
| 353 intptr_t i = (object_id - kMaxPredefinedObjectIds); | 391 intptr_t i = (object_id - kMaxPredefinedObjectIds); |
| 354 if ((i > kIllegal) && (i < Symbols::kMaxPredefinedId)) { | 392 if ((i > kIllegal) && (i < Symbols::kMaxPredefinedId)) { |
| 355 return symbol_handles_[i]->raw(); | 393 return symbol_handles_[i]->raw(); |
| 356 } | 394 } |
| 357 return Object::null(); | 395 return Object::null(); |
| 358 } | 396 } |
| 359 | 397 |
| 360 } // namespace dart | 398 } // namespace dart |
| OLD | NEW |