| 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 10059 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10070 const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str); | 10070 const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str); |
| 10071 return String::New(utf8_array, array_len, space); | 10071 return String::New(utf8_array, array_len, space); |
| 10072 } | 10072 } |
| 10073 | 10073 |
| 10074 | 10074 |
| 10075 RawString* String::New(const uint8_t* utf8_array, | 10075 RawString* String::New(const uint8_t* utf8_array, |
| 10076 intptr_t array_len, | 10076 intptr_t array_len, |
| 10077 Heap::Space space) { | 10077 Heap::Space space) { |
| 10078 Utf8::Type type; | 10078 Utf8::Type type; |
| 10079 intptr_t len = Utf8::CodePointCount(utf8_array, array_len, &type); | 10079 intptr_t len = Utf8::CodePointCount(utf8_array, array_len, &type); |
| 10080 if (type == Utf8::kAscii) { | 10080 if (type == Utf8::kISOLatin1) { |
| 10081 const String& strobj = String::Handle(OneByteString::New(len, space)); | 10081 const String& strobj = String::Handle(OneByteString::New(len, space)); |
| 10082 if (len > 0) { | 10082 if (len > 0) { |
| 10083 NoGCScope no_gc; | 10083 NoGCScope no_gc; |
| 10084 Utf8::DecodeToAscii(utf8_array, array_len, | 10084 Utf8::DecodeToISOLatin1(utf8_array, array_len, |
| 10085 OneByteString::CharAddr(strobj, 0), len); | 10085 OneByteString::CharAddr(strobj, 0), len); |
| 10086 } | 10086 } |
| 10087 return strobj.raw(); | 10087 return strobj.raw(); |
| 10088 } | 10088 } |
| 10089 ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP)); | 10089 ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP)); |
| 10090 const String& strobj = String::Handle(TwoByteString::New(len, space)); | 10090 const String& strobj = String::Handle(TwoByteString::New(len, space)); |
| 10091 NoGCScope no_gc; | 10091 NoGCScope no_gc; |
| 10092 Utf8::DecodeToUTF16(utf8_array, array_len, | 10092 Utf8::DecodeToUTF16(utf8_array, array_len, |
| 10093 TwoByteString::CharAddr(strobj, 0), len); | 10093 TwoByteString::CharAddr(strobj, 0), len); |
| 10094 return strobj.raw(); | 10094 return strobj.raw(); |
| 10095 } | 10095 } |
| 10096 | 10096 |
| 10097 | 10097 |
| 10098 RawString* String::New(const uint16_t* utf16_array, | 10098 RawString* String::New(const uint16_t* utf16_array, |
| 10099 intptr_t array_len, | 10099 intptr_t array_len, |
| 10100 Heap::Space space) { | 10100 Heap::Space space) { |
| 10101 bool is_one_byte_string = true; | 10101 bool is_one_byte_string = true; |
| 10102 for (intptr_t i = 0; i < array_len; ++i) { | 10102 for (intptr_t i = 0; i < array_len; ++i) { |
| 10103 if (utf16_array[i] > 0x7F) { | 10103 if (utf16_array[i] > 0xFF) { |
| 10104 is_one_byte_string = false; | 10104 is_one_byte_string = false; |
| 10105 break; | 10105 break; |
| 10106 } | 10106 } |
| 10107 } | 10107 } |
| 10108 if (is_one_byte_string) { | 10108 if (is_one_byte_string) { |
| 10109 return OneByteString::New(utf16_array, array_len, space); | 10109 return OneByteString::New(utf16_array, array_len, space); |
| 10110 } | 10110 } |
| 10111 return TwoByteString::New(utf16_array, array_len, space); | 10111 return TwoByteString::New(utf16_array, array_len, space); |
| 10112 } | 10112 } |
| 10113 | 10113 |
| 10114 | 10114 |
| 10115 RawString* String::New(const uint32_t* utf32_array, | 10115 RawString* String::New(const uint32_t* utf32_array, |
| 10116 intptr_t array_len, | 10116 intptr_t array_len, |
| 10117 Heap::Space space) { | 10117 Heap::Space space) { |
| 10118 bool is_one_byte_string = true; | 10118 bool is_one_byte_string = true; |
| 10119 intptr_t utf16_len = array_len; | 10119 intptr_t utf16_len = array_len; |
| 10120 for (intptr_t i = 0; i < array_len; ++i) { | 10120 for (intptr_t i = 0; i < array_len; ++i) { |
| 10121 if (utf32_array[i] > 0x7F) { | 10121 if (utf32_array[i] > 0xFF) { |
| 10122 is_one_byte_string = false; | 10122 is_one_byte_string = false; |
| 10123 } | 10123 } |
| 10124 if (utf32_array[i] > 0xFFFF) { | 10124 if (utf32_array[i] > 0xFFFF) { |
| 10125 utf16_len += 1; | 10125 utf16_len += 1; |
| 10126 } | 10126 } |
| 10127 } | 10127 } |
| 10128 if (is_one_byte_string) { | 10128 if (is_one_byte_string) { |
| 10129 return OneByteString::New(utf32_array, array_len, space); | 10129 return OneByteString::New(utf32_array, array_len, space); |
| 10130 } | 10130 } |
| 10131 return TwoByteString::New(utf16_len, utf32_array, array_len, space); | 10131 return TwoByteString::New(utf16_len, utf32_array, array_len, space); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10192 | 10192 |
| 10193 void String::Copy(const String& dst, intptr_t dst_offset, | 10193 void String::Copy(const String& dst, intptr_t dst_offset, |
| 10194 const uint16_t* utf16_array, | 10194 const uint16_t* utf16_array, |
| 10195 intptr_t array_len) { | 10195 intptr_t array_len) { |
| 10196 ASSERT(dst_offset >= 0); | 10196 ASSERT(dst_offset >= 0); |
| 10197 ASSERT(array_len >= 0); | 10197 ASSERT(array_len >= 0); |
| 10198 ASSERT(array_len <= (dst.Length() - dst_offset)); | 10198 ASSERT(array_len <= (dst.Length() - dst_offset)); |
| 10199 if (dst.IsOneByteString()) { | 10199 if (dst.IsOneByteString()) { |
| 10200 NoGCScope no_gc; | 10200 NoGCScope no_gc; |
| 10201 for (intptr_t i = 0; i < array_len; ++i) { | 10201 for (intptr_t i = 0; i < array_len; ++i) { |
| 10202 ASSERT(utf16_array[i] <= 0x7F); | 10202 ASSERT(utf16_array[i] <= 0xFF); |
| 10203 *OneByteString::CharAddr(dst, i + dst_offset) = utf16_array[i]; | 10203 *OneByteString::CharAddr(dst, i + dst_offset) = utf16_array[i]; |
| 10204 } | 10204 } |
| 10205 } else { | 10205 } else { |
| 10206 ASSERT(dst.IsTwoByteString()); | 10206 ASSERT(dst.IsTwoByteString()); |
| 10207 NoGCScope no_gc; | 10207 NoGCScope no_gc; |
| 10208 if (array_len > 0) { | 10208 if (array_len > 0) { |
| 10209 memmove(TwoByteString::CharAddr(dst, dst_offset), | 10209 memmove(TwoByteString::CharAddr(dst, dst_offset), |
| 10210 utf16_array, | 10210 utf16_array, |
| 10211 array_len * 2); | 10211 array_len * 2); |
| 10212 } | 10212 } |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10347 return Symbols::Empty(); | 10347 return Symbols::Empty(); |
| 10348 } | 10348 } |
| 10349 if (begin_index > str.Length()) { | 10349 if (begin_index > str.Length()) { |
| 10350 return String::null(); | 10350 return String::null(); |
| 10351 } | 10351 } |
| 10352 String& result = String::Handle(); | 10352 String& result = String::Handle(); |
| 10353 bool is_one_byte_string = true; | 10353 bool is_one_byte_string = true; |
| 10354 intptr_t char_size = str.CharSize(); | 10354 intptr_t char_size = str.CharSize(); |
| 10355 if (char_size == kTwoByteChar) { | 10355 if (char_size == kTwoByteChar) { |
| 10356 for (intptr_t i = begin_index; i < begin_index + length; ++i) { | 10356 for (intptr_t i = begin_index; i < begin_index + length; ++i) { |
| 10357 if (str.CharAt(i) > 0x7F) { | 10357 if (str.CharAt(i) > 0xFF) { |
| 10358 is_one_byte_string = false; | 10358 is_one_byte_string = false; |
| 10359 break; | 10359 break; |
| 10360 } | 10360 } |
| 10361 } | 10361 } |
| 10362 } | 10362 } |
| 10363 if (is_one_byte_string) { | 10363 if (is_one_byte_string) { |
| 10364 result ^= OneByteString::New(length, space); | 10364 result ^= OneByteString::New(length, space); |
| 10365 } else { | 10365 } else { |
| 10366 result ^= TwoByteString::New(length, space); | 10366 result ^= TwoByteString::New(length, space); |
| 10367 } | 10367 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10406 int32_t src = str.CharAt(i); | 10406 int32_t src = str.CharAt(i); |
| 10407 int32_t dst = mapping(src); | 10407 int32_t dst = mapping(src); |
| 10408 if (src != dst) { | 10408 if (src != dst) { |
| 10409 has_mapping = true; | 10409 has_mapping = true; |
| 10410 } | 10410 } |
| 10411 dst_max = Utils::Maximum(dst_max, dst); | 10411 dst_max = Utils::Maximum(dst_max, dst); |
| 10412 } | 10412 } |
| 10413 if (!has_mapping) { | 10413 if (!has_mapping) { |
| 10414 return str.raw(); | 10414 return str.raw(); |
| 10415 } | 10415 } |
| 10416 if (dst_max <= 0x7F) { | 10416 if (dst_max <= 0xFF) { |
| 10417 return OneByteString::Transform(mapping, str, space); | 10417 return OneByteString::Transform(mapping, str, space); |
| 10418 } | 10418 } |
| 10419 ASSERT(dst_max > 0x7F); | 10419 ASSERT(dst_max > 0xFF); |
| 10420 return TwoByteString::Transform(mapping, str, space); | 10420 return TwoByteString::Transform(mapping, str, space); |
| 10421 } | 10421 } |
| 10422 | 10422 |
| 10423 | 10423 |
| 10424 RawString* String::ToUpperCase(const String& str, Heap::Space space) { | 10424 RawString* String::ToUpperCase(const String& str, Heap::Space space) { |
| 10425 // TODO(cshapiro): create a fast-path for OneByteString instances. | 10425 // TODO(cshapiro): create a fast-path for OneByteString instances. |
| 10426 return Transform(CaseMapping::ToUpper, str, space); | 10426 return Transform(CaseMapping::ToUpper, str, space); |
| 10427 } | 10427 } |
| 10428 | 10428 |
| 10429 | 10429 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10557 } | 10557 } |
| 10558 return OneByteString::raw(result); | 10558 return OneByteString::raw(result); |
| 10559 } | 10559 } |
| 10560 | 10560 |
| 10561 | 10561 |
| 10562 RawOneByteString* OneByteString::New(const uint16_t* characters, | 10562 RawOneByteString* OneByteString::New(const uint16_t* characters, |
| 10563 intptr_t len, | 10563 intptr_t len, |
| 10564 Heap::Space space) { | 10564 Heap::Space space) { |
| 10565 const String& result =String::Handle(OneByteString::New(len, space)); | 10565 const String& result =String::Handle(OneByteString::New(len, space)); |
| 10566 for (intptr_t i = 0; i < len; ++i) { | 10566 for (intptr_t i = 0; i < len; ++i) { |
| 10567 ASSERT(characters[i] <= 0x7F); | 10567 ASSERT(characters[i] <= 0xFF); |
| 10568 *CharAddr(result, i) = characters[i]; | 10568 *CharAddr(result, i) = characters[i]; |
| 10569 } | 10569 } |
| 10570 return OneByteString::raw(result); | 10570 return OneByteString::raw(result); |
| 10571 } | 10571 } |
| 10572 | 10572 |
| 10573 | 10573 |
| 10574 RawOneByteString* OneByteString::New(const uint32_t* characters, | 10574 RawOneByteString* OneByteString::New(const uint32_t* characters, |
| 10575 intptr_t len, | 10575 intptr_t len, |
| 10576 Heap::Space space) { | 10576 Heap::Space space) { |
| 10577 const String& result = String::Handle(OneByteString::New(len, space)); | 10577 const String& result = String::Handle(OneByteString::New(len, space)); |
| 10578 for (intptr_t i = 0; i < len; ++i) { | 10578 for (intptr_t i = 0; i < len; ++i) { |
| 10579 ASSERT(characters[i] <= 0x7F); | 10579 ASSERT(characters[i] <= 0xFF); |
| 10580 *CharAddr(result, i) = characters[i]; | 10580 *CharAddr(result, i) = characters[i]; |
| 10581 } | 10581 } |
| 10582 return OneByteString::raw(result); | 10582 return OneByteString::raw(result); |
| 10583 } | 10583 } |
| 10584 | 10584 |
| 10585 | 10585 |
| 10586 RawOneByteString* OneByteString::New(const String& str, | 10586 RawOneByteString* OneByteString::New(const String& str, |
| 10587 Heap::Space space) { | 10587 Heap::Space space) { |
| 10588 intptr_t len = str.Length(); | 10588 intptr_t len = str.Length(); |
| 10589 const String& result = String::Handle(OneByteString::New(len, space)); | 10589 const String& result = String::Handle(OneByteString::New(len, space)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10623 | 10623 |
| 10624 | 10624 |
| 10625 RawOneByteString* OneByteString::Transform(int32_t (*mapping)(int32_t ch), | 10625 RawOneByteString* OneByteString::Transform(int32_t (*mapping)(int32_t ch), |
| 10626 const String& str, | 10626 const String& str, |
| 10627 Heap::Space space) { | 10627 Heap::Space space) { |
| 10628 ASSERT(!str.IsNull()); | 10628 ASSERT(!str.IsNull()); |
| 10629 intptr_t len = str.Length(); | 10629 intptr_t len = str.Length(); |
| 10630 const String& result = String::Handle(OneByteString::New(len, space)); | 10630 const String& result = String::Handle(OneByteString::New(len, space)); |
| 10631 for (intptr_t i = 0; i < len; ++i) { | 10631 for (intptr_t i = 0; i < len; ++i) { |
| 10632 int32_t ch = mapping(str.CharAt(i)); | 10632 int32_t ch = mapping(str.CharAt(i)); |
| 10633 ASSERT(ch >= 0 && ch <= 0x7F); | 10633 ASSERT(ch >= 0 && ch <= 0xFF); |
| 10634 *CharAddr(result, i) = ch; | 10634 *CharAddr(result, i) = ch; |
| 10635 } | 10635 } |
| 10636 return OneByteString::raw(result); | 10636 return OneByteString::raw(result); |
| 10637 } | 10637 } |
| 10638 | 10638 |
| 10639 | 10639 |
| 10640 RawTwoByteString* TwoByteString::EscapeSpecialCharacters(const String& str, | 10640 RawTwoByteString* TwoByteString::EscapeSpecialCharacters(const String& str, |
| 10641 bool raw_str) { | 10641 bool raw_str) { |
| 10642 intptr_t len = str.Length(); | 10642 intptr_t len = str.Length(); |
| 10643 if (len > 0) { | 10643 if (len > 0) { |
| (...skipping 1369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12013 } | 12013 } |
| 12014 return result.raw(); | 12014 return result.raw(); |
| 12015 } | 12015 } |
| 12016 | 12016 |
| 12017 | 12017 |
| 12018 const char* WeakProperty::ToCString() const { | 12018 const char* WeakProperty::ToCString() const { |
| 12019 return "_WeakProperty"; | 12019 return "_WeakProperty"; |
| 12020 } | 12020 } |
| 12021 | 12021 |
| 12022 } // namespace dart | 12022 } // namespace dart |
| OLD | NEW |