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 9975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9986 this->SetHash(result); | 9986 this->SetHash(result); |
9987 return result; | 9987 return result; |
9988 } | 9988 } |
9989 | 9989 |
9990 | 9990 |
9991 intptr_t String::Hash(const String& str, intptr_t begin_index, intptr_t len) { | 9991 intptr_t String::Hash(const String& str, intptr_t begin_index, intptr_t len) { |
9992 ASSERT(begin_index >= 0); | 9992 ASSERT(begin_index >= 0); |
9993 ASSERT(len >= 0); | 9993 ASSERT(len >= 0); |
9994 ASSERT((begin_index + len) <= str.Length()); | 9994 ASSERT((begin_index + len) <= str.Length()); |
9995 StringHasher hasher; | 9995 StringHasher hasher; |
9996 for (intptr_t i = 0; i < len; i++) { | 9996 CodePointIterator it(str, begin_index, len); |
9997 hasher.Add(str.CharAt(begin_index + i)); | 9997 while (it.Next()) { |
9998 hasher.Add(it.Current()); | |
9998 } | 9999 } |
9999 return hasher.Finalize(String::kHashBits); | 10000 return hasher.Finalize(String::kHashBits); |
10000 } | 10001 } |
10001 | 10002 |
10002 | 10003 |
10003 template<typename T> | 10004 template<typename T> |
10004 static intptr_t HashImpl(const T* characters, intptr_t len) { | 10005 static intptr_t HashImpl(const T* characters, intptr_t len) { |
10005 ASSERT(len >= 0); | 10006 ASSERT(len >= 0); |
10006 StringHasher hasher; | 10007 StringHasher hasher; |
10007 for (intptr_t i = 0; i < len; i++) { | 10008 for (intptr_t i = 0; i < len; i++) { |
10008 hasher.Add(characters[i]); | 10009 hasher.Add(characters[i]); |
10009 } | 10010 } |
10010 return hasher.Finalize(String::kHashBits); | 10011 return hasher.Finalize(String::kHashBits); |
10011 } | 10012 } |
10012 | 10013 |
10013 | 10014 |
10014 intptr_t String::Hash(const uint8_t* characters, intptr_t len) { | 10015 intptr_t String::Hash(const uint8_t* characters, intptr_t len) { |
10015 return HashImpl(characters, len); | 10016 return HashImpl(characters, len); |
10016 } | 10017 } |
10017 | 10018 |
10018 | 10019 |
10019 intptr_t String::Hash(const uint16_t* characters, intptr_t len) { | 10020 intptr_t String::Hash(const uint16_t* characters, intptr_t len) { |
10020 return HashImpl(characters, len); | 10021 StringHasher hasher; |
10022 intptr_t i = 0; | |
10023 while (i < len) { | |
10024 hasher.Add(Utf16::Next(characters, &i, len)); | |
10025 } | |
10026 return hasher.Finalize(String::kHashBits); | |
10021 } | 10027 } |
10022 | 10028 |
10023 | 10029 |
10024 intptr_t String::Hash(const int32_t* characters, intptr_t len) { | 10030 intptr_t String::Hash(const int32_t* characters, intptr_t len) { |
10025 return HashImpl(characters, len); | 10031 return HashImpl(characters, len); |
10026 } | 10032 } |
10027 | 10033 |
10028 | 10034 |
10029 int32_t String::CharAt(intptr_t index) const { | 10035 int32_t String::CharAt(intptr_t index) const { |
10030 intptr_t class_id = raw()->GetClassId(); | 10036 intptr_t class_id = raw()->GetClassId(); |
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10635 | 10641 |
10636 | 10642 |
10637 RawString* String::ToLowerCase(const String& str, Heap::Space space) { | 10643 RawString* String::ToLowerCase(const String& str, Heap::Space space) { |
10638 // TODO(cshapiro): create a fast-path for OneByteString instances. | 10644 // TODO(cshapiro): create a fast-path for OneByteString instances. |
10639 return Transform(CaseMapping::ToLower, str, space); | 10645 return Transform(CaseMapping::ToLower, str, space); |
10640 } | 10646 } |
10641 | 10647 |
10642 | 10648 |
10643 bool String::CodePointIterator::Next() { | 10649 bool String::CodePointIterator::Next() { |
10644 ASSERT(index_ >= -1); | 10650 ASSERT(index_ >= -1); |
10645 ASSERT(index_ < str_.Length()); | 10651 intptr_t length = Utf16::Length(ch_); |
10646 int d = Utf16::Length(ch_); | 10652 if (index_ < (end_ - length)) { |
10647 if (index_ == (str_.Length() - d)) { | 10653 index_ += length; |
10648 return false; | 10654 ch_ = str_.CharAt(index_); |
10655 if (Utf16::IsLeadSurrogate(ch_) && (index_ < (end_ - 1))) { | |
10656 int32_t ch2 = str_.CharAt(index_ + 1); | |
10657 if (Utf16::IsTrailSurrogate(ch2)) { | |
10658 ch_ = Utf16::Decode(ch_, ch2); | |
10659 } | |
10660 } | |
10661 return true; | |
10662 } else { | |
siva
2012/11/30 02:00:19
is this else necessary?
it could just be:
}
in
cshapiro
2012/11/30 02:28:22
Strictly speaking, it is not. I will remove it.
| |
10663 index_ = end_; | |
10649 } | 10664 } |
10650 index_ += d; | 10665 return false; |
10651 ch_ = str_.CharAt(index_); | |
10652 if (Utf16::IsLeadSurrogate(ch_) && (index_ != (str_.Length() - 1))) { | |
10653 int32_t ch2 = str_.CharAt(index_ + 1); | |
10654 if (Utf16::IsTrailSurrogate(ch2)) { | |
10655 ch_ = Utf16::Decode(ch_, ch2); | |
10656 } | |
10657 } | |
10658 return true; | |
10659 } | 10666 } |
10660 | 10667 |
10661 | 10668 |
10662 RawOneByteString* OneByteString::EscapeSpecialCharacters(const String& str, | 10669 RawOneByteString* OneByteString::EscapeSpecialCharacters(const String& str, |
10663 bool raw_str) { | 10670 bool raw_str) { |
10664 intptr_t len = str.Length(); | 10671 intptr_t len = str.Length(); |
10665 if (len > 0) { | 10672 if (len > 0) { |
10666 intptr_t num_escapes = 0; | 10673 intptr_t num_escapes = 0; |
10667 intptr_t index = 0; | 10674 intptr_t index = 0; |
10668 for (intptr_t i = 0; i < len; i++) { | 10675 for (intptr_t i = 0; i < len; i++) { |
(...skipping 1541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12210 } | 12217 } |
12211 return result.raw(); | 12218 return result.raw(); |
12212 } | 12219 } |
12213 | 12220 |
12214 | 12221 |
12215 const char* WeakProperty::ToCString() const { | 12222 const char* WeakProperty::ToCString() const { |
12216 return "_WeakProperty"; | 12223 return "_WeakProperty"; |
12217 } | 12224 } |
12218 | 12225 |
12219 } // namespace dart | 12226 } // namespace dart |
OLD | NEW |