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/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
(...skipping 9938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9949 this->SetHash(result); | 9949 this->SetHash(result); |
9950 return result; | 9950 return result; |
9951 } | 9951 } |
9952 | 9952 |
9953 | 9953 |
9954 intptr_t String::Hash(const String& str, intptr_t begin_index, intptr_t len) { | 9954 intptr_t String::Hash(const String& str, intptr_t begin_index, intptr_t len) { |
9955 ASSERT(begin_index >= 0); | 9955 ASSERT(begin_index >= 0); |
9956 ASSERT(len >= 0); | 9956 ASSERT(len >= 0); |
9957 ASSERT((begin_index + len) <= str.Length()); | 9957 ASSERT((begin_index + len) <= str.Length()); |
9958 StringHasher hasher; | 9958 StringHasher hasher; |
9959 for (intptr_t i = 0; i < len; i++) { | 9959 CodePointIterator it(str, begin_index, len); |
9960 hasher.Add(str.CharAt(begin_index + i)); | 9960 while (it.Next()) { |
| 9961 hasher.Add(it.Current()); |
9961 } | 9962 } |
9962 return hasher.Finalize(String::kHashBits); | 9963 return hasher.Finalize(String::kHashBits); |
9963 } | 9964 } |
9964 | 9965 |
9965 | 9966 |
9966 template<typename T> | 9967 template<typename T> |
9967 static intptr_t HashImpl(const T* characters, intptr_t len) { | 9968 static intptr_t HashImpl(const T* characters, intptr_t len) { |
9968 ASSERT(len >= 0); | 9969 ASSERT(len >= 0); |
9969 StringHasher hasher; | 9970 StringHasher hasher; |
9970 for (intptr_t i = 0; i < len; i++) { | 9971 for (intptr_t i = 0; i < len; i++) { |
9971 hasher.Add(characters[i]); | 9972 hasher.Add(characters[i]); |
9972 } | 9973 } |
9973 return hasher.Finalize(String::kHashBits); | 9974 return hasher.Finalize(String::kHashBits); |
9974 } | 9975 } |
9975 | 9976 |
9976 | 9977 |
9977 intptr_t String::Hash(const uint8_t* characters, intptr_t len) { | 9978 intptr_t String::Hash(const uint8_t* characters, intptr_t len) { |
9978 return HashImpl(characters, len); | 9979 return HashImpl(characters, len); |
9979 } | 9980 } |
9980 | 9981 |
9981 | 9982 |
9982 intptr_t String::Hash(const uint16_t* characters, intptr_t len) { | 9983 intptr_t String::Hash(const uint16_t* characters, intptr_t len) { |
9983 return HashImpl(characters, len); | 9984 StringHasher hasher; |
| 9985 intptr_t i = 0; |
| 9986 while (i < len) { |
| 9987 hasher.Add(Utf16::Next(characters, &i, len)); |
| 9988 } |
| 9989 return hasher.Finalize(String::kHashBits); |
9984 } | 9990 } |
9985 | 9991 |
9986 | 9992 |
9987 intptr_t String::Hash(const int32_t* characters, intptr_t len) { | 9993 intptr_t String::Hash(const int32_t* characters, intptr_t len) { |
9988 return HashImpl(characters, len); | 9994 return HashImpl(characters, len); |
9989 } | 9995 } |
9990 | 9996 |
9991 | 9997 |
9992 int32_t String::CharAt(intptr_t index) const { | 9998 int32_t String::CharAt(intptr_t index) const { |
9993 intptr_t class_id = raw()->GetClassId(); | 9999 intptr_t class_id = raw()->GetClassId(); |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10599 | 10605 |
10600 | 10606 |
10601 RawString* String::ToLowerCase(const String& str, Heap::Space space) { | 10607 RawString* String::ToLowerCase(const String& str, Heap::Space space) { |
10602 // TODO(cshapiro): create a fast-path for OneByteString instances. | 10608 // TODO(cshapiro): create a fast-path for OneByteString instances. |
10603 return Transform(CaseMapping::ToLower, str, space); | 10609 return Transform(CaseMapping::ToLower, str, space); |
10604 } | 10610 } |
10605 | 10611 |
10606 | 10612 |
10607 bool String::CodePointIterator::Next() { | 10613 bool String::CodePointIterator::Next() { |
10608 ASSERT(index_ >= -1); | 10614 ASSERT(index_ >= -1); |
10609 ASSERT(index_ < str_.Length()); | 10615 intptr_t length = Utf16::Length(ch_); |
10610 int d = Utf16::Length(ch_); | 10616 if (index_ < (end_ - length)) { |
10611 if (index_ == (str_.Length() - d)) { | 10617 index_ += length; |
10612 return false; | 10618 ch_ = str_.CharAt(index_); |
| 10619 if (Utf16::IsLeadSurrogate(ch_) && (index_ < (end_ - 1))) { |
| 10620 int32_t ch2 = str_.CharAt(index_ + 1); |
| 10621 if (Utf16::IsTrailSurrogate(ch2)) { |
| 10622 ch_ = Utf16::Decode(ch_, ch2); |
| 10623 } |
| 10624 } |
| 10625 return true; |
10613 } | 10626 } |
10614 index_ += d; | 10627 index_ = end_; |
10615 ch_ = str_.CharAt(index_); | 10628 return false; |
10616 if (Utf16::IsLeadSurrogate(ch_) && (index_ != (str_.Length() - 1))) { | |
10617 int32_t ch2 = str_.CharAt(index_ + 1); | |
10618 if (Utf16::IsTrailSurrogate(ch2)) { | |
10619 ch_ = Utf16::Decode(ch_, ch2); | |
10620 } | |
10621 } | |
10622 return true; | |
10623 } | 10629 } |
10624 | 10630 |
10625 | 10631 |
10626 RawOneByteString* OneByteString::EscapeSpecialCharacters(const String& str, | 10632 RawOneByteString* OneByteString::EscapeSpecialCharacters(const String& str, |
10627 bool raw_str) { | 10633 bool raw_str) { |
10628 intptr_t len = str.Length(); | 10634 intptr_t len = str.Length(); |
10629 if (len > 0) { | 10635 if (len > 0) { |
10630 intptr_t num_escapes = 0; | 10636 intptr_t num_escapes = 0; |
10631 intptr_t index = 0; | 10637 intptr_t index = 0; |
10632 for (intptr_t i = 0; i < len; i++) { | 10638 for (intptr_t i = 0; i < len; i++) { |
(...skipping 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12190 } | 12196 } |
12191 return result.raw(); | 12197 return result.raw(); |
12192 } | 12198 } |
12193 | 12199 |
12194 | 12200 |
12195 const char* WeakProperty::ToCString() const { | 12201 const char* WeakProperty::ToCString() const { |
12196 return "_WeakProperty"; | 12202 return "_WeakProperty"; |
12197 } | 12203 } |
12198 | 12204 |
12199 } // namespace dart | 12205 } // namespace dart |
OLD | NEW |