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/become.h" | 9 #include "vm/become.h" |
10 #include "vm/bit_vector.h" | 10 #include "vm/bit_vector.h" |
(...skipping 19839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19850 RawString* String::FromUTF8(const uint8_t* utf8_array, | 19850 RawString* String::FromUTF8(const uint8_t* utf8_array, |
19851 intptr_t array_len, | 19851 intptr_t array_len, |
19852 Heap::Space space) { | 19852 Heap::Space space) { |
19853 Utf8::Type type; | 19853 Utf8::Type type; |
19854 intptr_t len = Utf8::CodeUnitCount(utf8_array, array_len, &type); | 19854 intptr_t len = Utf8::CodeUnitCount(utf8_array, array_len, &type); |
19855 if (type == Utf8::kLatin1) { | 19855 if (type == Utf8::kLatin1) { |
19856 const String& strobj = String::Handle(OneByteString::New(len, space)); | 19856 const String& strobj = String::Handle(OneByteString::New(len, space)); |
19857 if (len > 0) { | 19857 if (len > 0) { |
19858 NoSafepointScope no_safepoint; | 19858 NoSafepointScope no_safepoint; |
19859 Utf8::DecodeToLatin1(utf8_array, array_len, | 19859 Utf8::DecodeToLatin1(utf8_array, array_len, |
19860 OneByteString::CharAddr(strobj, 0), len); | 19860 OneByteString::DataStart(strobj), len); |
19861 } | 19861 } |
19862 return strobj.raw(); | 19862 return strobj.raw(); |
19863 } | 19863 } |
19864 ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary)); | 19864 ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary)); |
19865 const String& strobj = String::Handle(TwoByteString::New(len, space)); | 19865 const String& strobj = String::Handle(TwoByteString::New(len, space)); |
19866 NoSafepointScope no_safepoint; | 19866 NoSafepointScope no_safepoint; |
19867 Utf8::DecodeToUTF16(utf8_array, array_len, TwoByteString::CharAddr(strobj, 0), | 19867 Utf8::DecodeToUTF16(utf8_array, array_len, TwoByteString::DataStart(strobj), |
19868 len); | 19868 len); |
19869 return strobj.raw(); | 19869 return strobj.raw(); |
19870 } | 19870 } |
19871 | 19871 |
19872 RawString* String::FromLatin1(const uint8_t* latin1_array, | 19872 RawString* String::FromLatin1(const uint8_t* latin1_array, |
19873 intptr_t array_len, | 19873 intptr_t array_len, |
19874 Heap::Space space) { | 19874 Heap::Space space) { |
19875 return OneByteString::New(latin1_array, array_len, space); | 19875 return OneByteString::New(latin1_array, array_len, space); |
19876 } | 19876 } |
19877 | 19877 |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20294 if (is_one_byte_string) { | 20294 if (is_one_byte_string) { |
20295 result = OneByteString::New(length, space); | 20295 result = OneByteString::New(length, space); |
20296 } else { | 20296 } else { |
20297 result = TwoByteString::New(length, space); | 20297 result = TwoByteString::New(length, space); |
20298 } | 20298 } |
20299 String::Copy(result, 0, str, begin_index, length); | 20299 String::Copy(result, 0, str, begin_index, length); |
20300 return result.raw(); | 20300 return result.raw(); |
20301 } | 20301 } |
20302 | 20302 |
20303 const char* String::ToCString() const { | 20303 const char* String::ToCString() const { |
20304 if (IsOneByteString()) { | |
20305 // Quick conversion if OneByteString contains only ASCII characters. | |
20306 intptr_t len = Length(); | |
20307 if (len == 0) { | |
20308 return ""; | |
20309 } | |
20310 Zone* zone = Thread::Current()->zone(); | |
20311 uint8_t* result = zone->Alloc<uint8_t>(len + 1); | |
20312 NoSafepointScope no_safepoint; | |
20313 const uint8_t* original_str = OneByteString::CharAddr(*this, 0); | |
20314 for (intptr_t i = 0; i < len; i++) { | |
20315 if (original_str[i] <= Utf8::kMaxOneByteChar) { | |
20316 result[i] = original_str[i]; | |
20317 } else { | |
20318 len = -1; | |
20319 break; | |
20320 } | |
20321 } | |
20322 if (len > 0) { | |
20323 result[len] = 0; | |
20324 return reinterpret_cast<const char*>(result); | |
20325 } | |
20326 } | |
20327 const intptr_t len = Utf8::Length(*this); | 20304 const intptr_t len = Utf8::Length(*this); |
20328 Zone* zone = Thread::Current()->zone(); | 20305 Zone* zone = Thread::Current()->zone(); |
20329 uint8_t* result = zone->Alloc<uint8_t>(len + 1); | 20306 uint8_t* result = zone->Alloc<uint8_t>(len + 1); |
20330 ToUTF8(result, len); | 20307 ToUTF8(result, len); |
20331 result[len] = 0; | 20308 result[len] = 0; |
20332 return reinterpret_cast<const char*>(result); | 20309 return reinterpret_cast<const char*>(result); |
20333 } | 20310 } |
20334 | 20311 |
20335 char* String::ToMallocCString() const { | 20312 char* String::ToMallocCString() const { |
20336 if (IsOneByteString()) { | |
20337 // Quick conversion if OneByteString contains only ASCII characters. | |
20338 intptr_t len = Length(); | |
20339 uint8_t* result = reinterpret_cast<uint8_t*>(malloc(len + 1)); | |
20340 NoSafepointScope no_safepoint; | |
20341 const uint8_t* original_str = OneByteString::CharAddr(*this, 0); | |
20342 for (intptr_t i = 0; i < len; i++) { | |
20343 if (original_str[i] <= Utf8::kMaxOneByteChar) { | |
20344 result[i] = original_str[i]; | |
20345 } else { | |
20346 len = -1; | |
20347 break; | |
20348 } | |
20349 } | |
20350 if (len > 0) { | |
20351 result[len] = 0; | |
20352 return reinterpret_cast<char*>(result); | |
20353 } | |
20354 } | |
20355 const intptr_t len = Utf8::Length(*this); | 20313 const intptr_t len = Utf8::Length(*this); |
20356 uint8_t* result = reinterpret_cast<uint8_t*>(malloc(len + 1)); | 20314 uint8_t* result = reinterpret_cast<uint8_t*>(malloc(len + 1)); |
20357 ToUTF8(result, len); | 20315 ToUTF8(result, len); |
20358 result[len] = 0; | 20316 result[len] = 0; |
20359 return reinterpret_cast<char*>(result); | 20317 return reinterpret_cast<char*>(result); |
20360 } | 20318 } |
20361 | 20319 |
20362 void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const { | 20320 void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const { |
20363 ASSERT(array_len >= Utf8::Length(*this)); | 20321 ASSERT(array_len >= Utf8::Length(*this)); |
20364 Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len); | 20322 Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len); |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20639 return result; | 20597 return result; |
20640 } | 20598 } |
20641 } | 20599 } |
20642 | 20600 |
20643 RawOneByteString* OneByteString::New(const uint8_t* characters, | 20601 RawOneByteString* OneByteString::New(const uint8_t* characters, |
20644 intptr_t len, | 20602 intptr_t len, |
20645 Heap::Space space) { | 20603 Heap::Space space) { |
20646 const String& result = String::Handle(OneByteString::New(len, space)); | 20604 const String& result = String::Handle(OneByteString::New(len, space)); |
20647 if (len > 0) { | 20605 if (len > 0) { |
20648 NoSafepointScope no_safepoint; | 20606 NoSafepointScope no_safepoint; |
20649 memmove(CharAddr(result, 0), characters, len); | 20607 memmove(DataStart(result), characters, len); |
20650 } | 20608 } |
20651 return OneByteString::raw(result); | 20609 return OneByteString::raw(result); |
20652 } | 20610 } |
20653 | 20611 |
20654 RawOneByteString* OneByteString::New(const uint16_t* characters, | 20612 RawOneByteString* OneByteString::New(const uint16_t* characters, |
20655 intptr_t len, | 20613 intptr_t len, |
20656 Heap::Space space) { | 20614 Heap::Space space) { |
20657 const String& result = String::Handle(OneByteString::New(len, space)); | 20615 const String& result = String::Handle(OneByteString::New(len, space)); |
20658 NoSafepointScope no_safepoint; | 20616 NoSafepointScope no_safepoint; |
20659 for (intptr_t i = 0; i < len; ++i) { | 20617 for (intptr_t i = 0; i < len; ++i) { |
(...skipping 23 matching lines...) Expand all Loading... |
20683 } | 20641 } |
20684 | 20642 |
20685 RawOneByteString* OneByteString::New(const String& other_one_byte_string, | 20643 RawOneByteString* OneByteString::New(const String& other_one_byte_string, |
20686 intptr_t other_start_index, | 20644 intptr_t other_start_index, |
20687 intptr_t other_len, | 20645 intptr_t other_len, |
20688 Heap::Space space) { | 20646 Heap::Space space) { |
20689 const String& result = String::Handle(OneByteString::New(other_len, space)); | 20647 const String& result = String::Handle(OneByteString::New(other_len, space)); |
20690 ASSERT(other_one_byte_string.IsOneByteString()); | 20648 ASSERT(other_one_byte_string.IsOneByteString()); |
20691 if (other_len > 0) { | 20649 if (other_len > 0) { |
20692 NoSafepointScope no_safepoint; | 20650 NoSafepointScope no_safepoint; |
20693 memmove(OneByteString::CharAddr(result, 0), | 20651 memmove(OneByteString::DataStart(result), |
20694 OneByteString::CharAddr(other_one_byte_string, other_start_index), | 20652 OneByteString::CharAddr(other_one_byte_string, other_start_index), |
20695 other_len); | 20653 other_len); |
20696 } | 20654 } |
20697 return OneByteString::raw(result); | 20655 return OneByteString::raw(result); |
20698 } | 20656 } |
20699 | 20657 |
20700 RawOneByteString* OneByteString::New(const TypedData& other_typed_data, | 20658 RawOneByteString* OneByteString::New(const TypedData& other_typed_data, |
20701 intptr_t other_start_index, | 20659 intptr_t other_start_index, |
20702 intptr_t other_len, | 20660 intptr_t other_len, |
20703 Heap::Space space) { | 20661 Heap::Space space) { |
20704 const String& result = String::Handle(OneByteString::New(other_len, space)); | 20662 const String& result = String::Handle(OneByteString::New(other_len, space)); |
20705 ASSERT(other_typed_data.ElementSizeInBytes() == 1); | 20663 ASSERT(other_typed_data.ElementSizeInBytes() == 1); |
20706 if (other_len > 0) { | 20664 if (other_len > 0) { |
20707 NoSafepointScope no_safepoint; | 20665 NoSafepointScope no_safepoint; |
20708 memmove(OneByteString::CharAddr(result, 0), | 20666 memmove(OneByteString::DataStart(result), |
20709 other_typed_data.DataAddr(other_start_index), other_len); | 20667 other_typed_data.DataAddr(other_start_index), other_len); |
20710 } | 20668 } |
20711 return OneByteString::raw(result); | 20669 return OneByteString::raw(result); |
20712 } | 20670 } |
20713 | 20671 |
20714 RawOneByteString* OneByteString::New(const ExternalTypedData& other_typed_data, | 20672 RawOneByteString* OneByteString::New(const ExternalTypedData& other_typed_data, |
20715 intptr_t other_start_index, | 20673 intptr_t other_start_index, |
20716 intptr_t other_len, | 20674 intptr_t other_len, |
20717 Heap::Space space) { | 20675 Heap::Space space) { |
20718 const String& result = String::Handle(OneByteString::New(other_len, space)); | 20676 const String& result = String::Handle(OneByteString::New(other_len, space)); |
20719 ASSERT(other_typed_data.ElementSizeInBytes() == 1); | 20677 ASSERT(other_typed_data.ElementSizeInBytes() == 1); |
20720 if (other_len > 0) { | 20678 if (other_len > 0) { |
20721 NoSafepointScope no_safepoint; | 20679 NoSafepointScope no_safepoint; |
20722 memmove(OneByteString::CharAddr(result, 0), | 20680 memmove(OneByteString::DataStart(result), |
20723 other_typed_data.DataAddr(other_start_index), other_len); | 20681 other_typed_data.DataAddr(other_start_index), other_len); |
20724 } | 20682 } |
20725 return OneByteString::raw(result); | 20683 return OneByteString::raw(result); |
20726 } | 20684 } |
20727 | 20685 |
20728 RawOneByteString* OneByteString::Concat(const String& str1, | 20686 RawOneByteString* OneByteString::Concat(const String& str1, |
20729 const String& str2, | 20687 const String& str2, |
20730 Heap::Space space) { | 20688 Heap::Space space) { |
20731 intptr_t len1 = str1.Length(); | 20689 intptr_t len1 = str1.Length(); |
20732 intptr_t len2 = str2.Length(); | 20690 intptr_t len2 = str2.Length(); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20862 return TwoByteString::raw(result); | 20820 return TwoByteString::raw(result); |
20863 } | 20821 } |
20864 | 20822 |
20865 RawTwoByteString* TwoByteString::New(const uint16_t* utf16_array, | 20823 RawTwoByteString* TwoByteString::New(const uint16_t* utf16_array, |
20866 intptr_t array_len, | 20824 intptr_t array_len, |
20867 Heap::Space space) { | 20825 Heap::Space space) { |
20868 ASSERT(array_len > 0); | 20826 ASSERT(array_len > 0); |
20869 const String& result = String::Handle(TwoByteString::New(array_len, space)); | 20827 const String& result = String::Handle(TwoByteString::New(array_len, space)); |
20870 { | 20828 { |
20871 NoSafepointScope no_safepoint; | 20829 NoSafepointScope no_safepoint; |
20872 memmove(CharAddr(result, 0), utf16_array, (array_len * 2)); | 20830 memmove(DataStart(result), utf16_array, (array_len * 2)); |
20873 } | 20831 } |
20874 return TwoByteString::raw(result); | 20832 return TwoByteString::raw(result); |
20875 } | 20833 } |
20876 | 20834 |
20877 RawTwoByteString* TwoByteString::New(intptr_t utf16_len, | 20835 RawTwoByteString* TwoByteString::New(intptr_t utf16_len, |
20878 const int32_t* utf32_array, | 20836 const int32_t* utf32_array, |
20879 intptr_t array_len, | 20837 intptr_t array_len, |
20880 Heap::Space space) { | 20838 Heap::Space space) { |
20881 ASSERT((array_len > 0) && (utf16_len >= array_len)); | 20839 ASSERT((array_len > 0) && (utf16_len >= array_len)); |
20882 const String& result = String::Handle(TwoByteString::New(utf16_len, space)); | 20840 const String& result = String::Handle(TwoByteString::New(utf16_len, space)); |
(...skipping 22 matching lines...) Expand all Loading... |
20905 return TwoByteString::raw(result); | 20863 return TwoByteString::raw(result); |
20906 } | 20864 } |
20907 | 20865 |
20908 RawTwoByteString* TwoByteString::New(const TypedData& other_typed_data, | 20866 RawTwoByteString* TwoByteString::New(const TypedData& other_typed_data, |
20909 intptr_t other_start_index, | 20867 intptr_t other_start_index, |
20910 intptr_t other_len, | 20868 intptr_t other_len, |
20911 Heap::Space space) { | 20869 Heap::Space space) { |
20912 const String& result = String::Handle(TwoByteString::New(other_len, space)); | 20870 const String& result = String::Handle(TwoByteString::New(other_len, space)); |
20913 if (other_len > 0) { | 20871 if (other_len > 0) { |
20914 NoSafepointScope no_safepoint; | 20872 NoSafepointScope no_safepoint; |
20915 memmove(TwoByteString::CharAddr(result, 0), | 20873 memmove(TwoByteString::DataStart(result), |
20916 other_typed_data.DataAddr(other_start_index), | 20874 other_typed_data.DataAddr(other_start_index), |
20917 other_len * sizeof(uint16_t)); | 20875 other_len * sizeof(uint16_t)); |
20918 } | 20876 } |
20919 return TwoByteString::raw(result); | 20877 return TwoByteString::raw(result); |
20920 } | 20878 } |
20921 | 20879 |
20922 RawTwoByteString* TwoByteString::New(const ExternalTypedData& other_typed_data, | 20880 RawTwoByteString* TwoByteString::New(const ExternalTypedData& other_typed_data, |
20923 intptr_t other_start_index, | 20881 intptr_t other_start_index, |
20924 intptr_t other_len, | 20882 intptr_t other_len, |
20925 Heap::Space space) { | 20883 Heap::Space space) { |
20926 const String& result = String::Handle(TwoByteString::New(other_len, space)); | 20884 const String& result = String::Handle(TwoByteString::New(other_len, space)); |
20927 if (other_len > 0) { | 20885 if (other_len > 0) { |
20928 NoSafepointScope no_safepoint; | 20886 NoSafepointScope no_safepoint; |
20929 memmove(TwoByteString::CharAddr(result, 0), | 20887 memmove(TwoByteString::DataStart(result), |
20930 other_typed_data.DataAddr(other_start_index), | 20888 other_typed_data.DataAddr(other_start_index), |
20931 other_len * sizeof(uint16_t)); | 20889 other_len * sizeof(uint16_t)); |
20932 } | 20890 } |
20933 return TwoByteString::raw(result); | 20891 return TwoByteString::raw(result); |
20934 } | 20892 } |
20935 | 20893 |
20936 RawTwoByteString* TwoByteString::Concat(const String& str1, | 20894 RawTwoByteString* TwoByteString::Concat(const String& str1, |
20937 const String& str2, | 20895 const String& str2, |
20938 Heap::Space space) { | 20896 Heap::Space space) { |
20939 intptr_t len1 = str1.Length(); | 20897 intptr_t len1 = str1.Length(); |
(...skipping 1588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22528 } | 22486 } |
22529 return UserTag::null(); | 22487 return UserTag::null(); |
22530 } | 22488 } |
22531 | 22489 |
22532 const char* UserTag::ToCString() const { | 22490 const char* UserTag::ToCString() const { |
22533 const String& tag_label = String::Handle(label()); | 22491 const String& tag_label = String::Handle(label()); |
22534 return tag_label.ToCString(); | 22492 return tag_label.ToCString(); |
22535 } | 22493 } |
22536 | 22494 |
22537 } // namespace dart | 22495 } // namespace dart |
OLD | NEW |