| 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/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 6840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6851 | 6851 |
| 6852 | 6852 |
| 6853 void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const { | 6853 void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 6854 Object::PrintJSONImpl(stream, ref); | 6854 Object::PrintJSONImpl(stream, ref); |
| 6855 } | 6855 } |
| 6856 | 6856 |
| 6857 | 6857 |
| 6858 RawString* Field::GetterName(const String& field_name) { | 6858 RawString* Field::GetterName(const String& field_name) { |
| 6859 CompilerStats::make_accessor_name++; | 6859 CompilerStats::make_accessor_name++; |
| 6860 // TODO(koda): Avoid most of these allocations by adding prefix-based lookup | 6860 // TODO(koda): Avoid most of these allocations by adding prefix-based lookup |
| 6861 // to Symbols. | 6861 // to Class::Lookup*. |
| 6862 return String::Concat(Symbols::GetterPrefix(), field_name); | 6862 return String::Concat(Symbols::GetterPrefix(), field_name); |
| 6863 } | 6863 } |
| 6864 | 6864 |
| 6865 | 6865 |
| 6866 RawString* Field::GetterSymbol(const String& field_name) { | 6866 RawString* Field::GetterSymbol(const String& field_name) { |
| 6867 const String& str = String::Handle(Field::GetterName(field_name)); | 6867 return Symbols::FromConcat(Symbols::GetterPrefix(), field_name); |
| 6868 return Symbols::New(str); | |
| 6869 } | 6868 } |
| 6870 | 6869 |
| 6871 | 6870 |
| 6872 RawString* Field::SetterName(const String& field_name) { | 6871 RawString* Field::SetterName(const String& field_name) { |
| 6873 CompilerStats::make_accessor_name++; | 6872 CompilerStats::make_accessor_name++; |
| 6874 // TODO(koda): Avoid most of these allocations by adding prefix-based lookup | 6873 // TODO(koda): Avoid most of these allocations by adding prefix-based lookup |
| 6875 // to Symbols. | 6874 // to Class::Lookup*. |
| 6876 return String::Concat(Symbols::SetterPrefix(), field_name); | 6875 return String::Concat(Symbols::SetterPrefix(), field_name); |
| 6877 } | 6876 } |
| 6878 | 6877 |
| 6879 | 6878 |
| 6880 RawString* Field::SetterSymbol(const String& field_name) { | 6879 RawString* Field::SetterSymbol(const String& field_name) { |
| 6881 const String& str = String::Handle(Field::SetterName(field_name)); | 6880 return Symbols::FromConcat(Symbols::SetterPrefix(), field_name); |
| 6882 return Symbols::New(str); | |
| 6883 } | 6881 } |
| 6884 | 6882 |
| 6885 | 6883 |
| 6886 RawString* Field::NameFromGetter(const String& getter_name) { | 6884 RawString* Field::NameFromGetter(const String& getter_name) { |
| 6887 CompilerStats::make_field_name++; | 6885 CompilerStats::make_field_name++; |
| 6888 return String::SubString(getter_name, strlen(kGetterPrefix)); | 6886 return String::SubString(getter_name, strlen(kGetterPrefix)); |
| 6889 } | 6887 } |
| 6890 | 6888 |
| 6891 | 6889 |
| 6892 RawString* Field::NameFromSetter(const String& setter_name) { | 6890 RawString* Field::NameFromSetter(const String& setter_name) { |
| (...skipping 9186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16079 } | 16077 } |
| 16080 | 16078 |
| 16081 | 16079 |
| 16082 // Synchronize with implementation in compiler (intrinsifier). | 16080 // Synchronize with implementation in compiler (intrinsifier). |
| 16083 class StringHasher : ValueObject { | 16081 class StringHasher : ValueObject { |
| 16084 public: | 16082 public: |
| 16085 StringHasher() : hash_(0) {} | 16083 StringHasher() : hash_(0) {} |
| 16086 void Add(int32_t ch) { | 16084 void Add(int32_t ch) { |
| 16087 hash_ = CombineHashes(hash_, ch); | 16085 hash_ = CombineHashes(hash_, ch); |
| 16088 } | 16086 } |
| 16087 void Add(const String& str, intptr_t begin_index, intptr_t len); |
| 16088 |
| 16089 // Return a non-zero hash of at most 'bits' bits. | 16089 // Return a non-zero hash of at most 'bits' bits. |
| 16090 intptr_t Finalize(int bits) { | 16090 intptr_t Finalize(int bits) { |
| 16091 ASSERT(1 <= bits && bits <= (kBitsPerWord - 1)); | 16091 ASSERT(1 <= bits && bits <= (kBitsPerWord - 1)); |
| 16092 hash_ = FinalizeHash(hash_); | 16092 hash_ = FinalizeHash(hash_); |
| 16093 hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1); | 16093 hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1); |
| 16094 ASSERT(hash_ <= static_cast<uint32_t>(kMaxInt32)); | 16094 ASSERT(hash_ <= static_cast<uint32_t>(kMaxInt32)); |
| 16095 return hash_ == 0 ? 1 : hash_; | 16095 return hash_ == 0 ? 1 : hash_; |
| 16096 } | 16096 } |
| 16097 private: | 16097 private: |
| 16098 uint32_t hash_; | 16098 uint32_t hash_; |
| 16099 }; | 16099 }; |
| 16100 | 16100 |
| 16101 | 16101 |
| 16102 intptr_t String::Hash(const String& str, intptr_t begin_index, intptr_t len) { | 16102 void StringHasher::Add(const String& str, intptr_t begin_index, intptr_t len) { |
| 16103 ASSERT(begin_index >= 0); | 16103 ASSERT(begin_index >= 0); |
| 16104 ASSERT(len >= 0); | 16104 ASSERT(len >= 0); |
| 16105 ASSERT((begin_index + len) <= str.Length()); | 16105 ASSERT((begin_index + len) <= str.Length()); |
| 16106 StringHasher hasher; | |
| 16107 if (str.IsOneByteString()) { | 16106 if (str.IsOneByteString()) { |
| 16108 for (intptr_t i = 0; i < len; i++) { | 16107 for (intptr_t i = 0; i < len; i++) { |
| 16109 hasher.Add(*OneByteString::CharAddr(str, i + begin_index)); | 16108 Add(*OneByteString::CharAddr(str, i + begin_index)); |
| 16110 } | 16109 } |
| 16111 } else { | 16110 } else { |
| 16112 CodePointIterator it(str, begin_index, len); | 16111 String::CodePointIterator it(str, begin_index, len); |
| 16113 while (it.Next()) { | 16112 while (it.Next()) { |
| 16114 hasher.Add(it.Current()); | 16113 Add(it.Current()); |
| 16115 } | 16114 } |
| 16116 } | 16115 } |
| 16116 } |
| 16117 |
| 16118 |
| 16119 intptr_t String::Hash(const String& str, intptr_t begin_index, intptr_t len) { |
| 16120 StringHasher hasher; |
| 16121 hasher.Add(str, begin_index, len); |
| 16117 return hasher.Finalize(String::kHashBits); | 16122 return hasher.Finalize(String::kHashBits); |
| 16118 } | 16123 } |
| 16119 | 16124 |
| 16120 | 16125 |
| 16126 intptr_t String::HashConcat(const String& str1, const String& str2) { |
| 16127 intptr_t len1 = str1.Length(); |
| 16128 // Since String::Hash works at the code point (rune) level, a surrogate pair |
| 16129 // that crosses the boundary between str1 and str2 must be composed. |
| 16130 if (str1.IsTwoByteString() && Utf16::IsLeadSurrogate(str1.CharAt(len1 - 1))) { |
| 16131 const String& temp = String::Handle(String::Concat(str1, str2)); |
| 16132 return temp.Hash(); |
| 16133 } else { |
| 16134 StringHasher hasher; |
| 16135 hasher.Add(str1, 0, len1); |
| 16136 hasher.Add(str2, 0, str2.Length()); |
| 16137 return hasher.Finalize(String::kHashBits); |
| 16138 } |
| 16139 } |
| 16140 |
| 16141 |
| 16121 template<typename T> | 16142 template<typename T> |
| 16122 static intptr_t HashImpl(const T* characters, intptr_t len) { | 16143 static intptr_t HashImpl(const T* characters, intptr_t len) { |
| 16123 ASSERT(len >= 0); | 16144 ASSERT(len >= 0); |
| 16124 StringHasher hasher; | 16145 StringHasher hasher; |
| 16125 for (intptr_t i = 0; i < len; i++) { | 16146 for (intptr_t i = 0; i < len; i++) { |
| 16126 hasher.Add(characters[i]); | 16147 hasher.Add(characters[i]); |
| 16127 } | 16148 } |
| 16128 return hasher.Finalize(String::kHashBits); | 16149 return hasher.Finalize(String::kHashBits); |
| 16129 } | 16150 } |
| 16130 | 16151 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16287 } | 16308 } |
| 16288 // Advance both streams forward. | 16309 // Advance both streams forward. |
| 16289 ++i; | 16310 ++i; |
| 16290 has_more = it.Next(); | 16311 has_more = it.Next(); |
| 16291 } | 16312 } |
| 16292 // Strings are only true iff we reached the end in both streams. | 16313 // Strings are only true iff we reached the end in both streams. |
| 16293 return (i == len) && !has_more; | 16314 return (i == len) && !has_more; |
| 16294 } | 16315 } |
| 16295 | 16316 |
| 16296 | 16317 |
| 16318 bool String::EqualsConcat(const String& str1, const String& str2) const { |
| 16319 return (Length() == str1.Length() + str2.Length()) && |
| 16320 str1.Equals(*this, 0, str1.Length()) && |
| 16321 str2.Equals(*this, str1.Length(), str2.Length()); |
| 16322 } |
| 16323 |
| 16324 |
| 16297 intptr_t String::CompareTo(const String& other) const { | 16325 intptr_t String::CompareTo(const String& other) const { |
| 16298 const intptr_t this_len = this->Length(); | 16326 const intptr_t this_len = this->Length(); |
| 16299 const intptr_t other_len = other.IsNull() ? 0 : other.Length(); | 16327 const intptr_t other_len = other.IsNull() ? 0 : other.Length(); |
| 16300 const intptr_t len = (this_len < other_len) ? this_len : other_len; | 16328 const intptr_t len = (this_len < other_len) ? this_len : other_len; |
| 16301 for (intptr_t i = 0; i < len; i++) { | 16329 for (intptr_t i = 0; i < len; i++) { |
| 16302 int32_t this_code_point = this->CharAt(i); | 16330 int32_t this_code_point = this->CharAt(i); |
| 16303 int32_t other_code_point = other.CharAt(i); | 16331 int32_t other_code_point = other.CharAt(i); |
| 16304 if (this_code_point < other_code_point) { | 16332 if (this_code_point < other_code_point) { |
| 16305 return -1; | 16333 return -1; |
| 16306 } | 16334 } |
| (...skipping 3067 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19374 return tag_label.ToCString(); | 19402 return tag_label.ToCString(); |
| 19375 } | 19403 } |
| 19376 | 19404 |
| 19377 | 19405 |
| 19378 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 19406 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 19379 Instance::PrintJSONImpl(stream, ref); | 19407 Instance::PrintJSONImpl(stream, ref); |
| 19380 } | 19408 } |
| 19381 | 19409 |
| 19382 | 19410 |
| 19383 } // namespace dart | 19411 } // namespace dart |
| OLD | NEW |