Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/assert.h" | 8 #include "vm/assert.h" |
| 9 #include "vm/bigint_operations.h" | 9 #include "vm/bigint_operations.h" |
| 10 #include "vm/bootstrap.h" | 10 #include "vm/bootstrap.h" |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 381 | 381 |
| 382 cls = Class::New<OneByteString>(); | 382 cls = Class::New<OneByteString>(); |
| 383 object_store->set_one_byte_string_class(cls); | 383 object_store->set_one_byte_string_class(cls); |
| 384 | 384 |
| 385 cls = Class::New<TwoByteString>(); | 385 cls = Class::New<TwoByteString>(); |
| 386 object_store->set_two_byte_string_class(cls); | 386 object_store->set_two_byte_string_class(cls); |
| 387 | 387 |
| 388 cls = Class::New<FourByteString>(); | 388 cls = Class::New<FourByteString>(); |
| 389 object_store->set_four_byte_string_class(cls); | 389 object_store->set_four_byte_string_class(cls); |
| 390 | 390 |
| 391 cls = Class::New<ExternalOneByteString>(); | |
| 392 object_store->set_external_one_byte_string_class(cls); | |
| 393 | |
| 394 cls = Class::New<ExternalTwoByteString>(); | |
| 395 object_store->set_external_two_byte_string_class(cls); | |
| 396 | |
| 397 cls = Class::New<ExternalFourByteString>(); | |
| 398 object_store->set_external_four_byte_string_class(cls); | |
| 399 | |
| 391 cls = Class::New<Bool>(); | 400 cls = Class::New<Bool>(); |
| 392 object_store->set_bool_class(cls); | 401 object_store->set_bool_class(cls); |
| 393 | 402 |
| 394 cls = Class::New<UnhandledException>(); | 403 cls = Class::New<UnhandledException>(); |
| 395 object_store->set_unhandled_exception_class(cls); | 404 object_store->set_unhandled_exception_class(cls); |
| 396 | 405 |
| 397 cls = Class::New<Stacktrace>(); | 406 cls = Class::New<Stacktrace>(); |
| 398 object_store->set_stacktrace_class(cls); | 407 object_store->set_stacktrace_class(cls); |
| 399 // Set the super type so that the 'toString' method is implemented. | 408 // Set the super type so that the 'toString' method is implemented. |
| 400 type = object_store->object_type(); | 409 type = object_store->object_type(); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 450 cls.set_name(name); | 459 cls.set_name(name); |
| 451 cls.set_script(impl_script); | 460 cls.set_script(impl_script); |
| 452 core_impl_lib.AddClass(cls); | 461 core_impl_lib.AddClass(cls); |
| 453 | 462 |
| 454 name = String::NewSymbol("FourByteString"); | 463 name = String::NewSymbol("FourByteString"); |
| 455 cls = object_store->four_byte_string_class(); | 464 cls = object_store->four_byte_string_class(); |
| 456 cls.set_name(name); | 465 cls.set_name(name); |
| 457 cls.set_script(impl_script); | 466 cls.set_script(impl_script); |
| 458 core_impl_lib.AddClass(cls); | 467 core_impl_lib.AddClass(cls); |
| 459 | 468 |
| 469 name = String::NewSymbol("ExternalOneByteString"); | |
| 470 cls = object_store->external_one_byte_string_class(); | |
| 471 cls.set_name(name); | |
| 472 cls.set_script(impl_script); | |
| 473 core_impl_lib.AddClass(cls); | |
| 474 | |
| 475 name = String::NewSymbol("ExternalTwoByteString"); | |
| 476 cls = object_store->external_two_byte_string_class(); | |
| 477 cls.set_name(name); | |
| 478 cls.set_script(impl_script); | |
| 479 core_impl_lib.AddClass(cls); | |
| 480 | |
| 481 name = String::NewSymbol("ExternalFourByteString"); | |
| 482 cls = object_store->external_four_byte_string_class(); | |
| 483 cls.set_name(name); | |
| 484 cls.set_script(impl_script); | |
| 485 core_impl_lib.AddClass(cls); | |
| 486 | |
| 460 name = String::NewSymbol("Mint"); | 487 name = String::NewSymbol("Mint"); |
| 461 cls = object_store->mint_class(); | 488 cls = object_store->mint_class(); |
| 462 cls.set_name(name); | 489 cls.set_name(name); |
| 463 cls.set_script(impl_script); | 490 cls.set_script(impl_script); |
| 464 core_impl_lib.AddClass(cls); | 491 core_impl_lib.AddClass(cls); |
| 465 | 492 |
| 466 name = String::NewSymbol("Bigint"); | 493 name = String::NewSymbol("Bigint"); |
| 467 cls = object_store->bigint_class(); | 494 cls = object_store->bigint_class(); |
| 468 cls.set_name(name); | 495 cls.set_name(name); |
| 469 cls.set_script(impl_script); | 496 cls.set_script(impl_script); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 625 | 652 |
| 626 cls = Class::New<OneByteString>(); | 653 cls = Class::New<OneByteString>(); |
| 627 object_store->set_one_byte_string_class(cls); | 654 object_store->set_one_byte_string_class(cls); |
| 628 | 655 |
| 629 cls = Class::New<TwoByteString>(); | 656 cls = Class::New<TwoByteString>(); |
| 630 object_store->set_two_byte_string_class(cls); | 657 object_store->set_two_byte_string_class(cls); |
| 631 | 658 |
| 632 cls = Class::New<FourByteString>(); | 659 cls = Class::New<FourByteString>(); |
| 633 object_store->set_four_byte_string_class(cls); | 660 object_store->set_four_byte_string_class(cls); |
| 634 | 661 |
| 662 cls = Class::New<ExternalOneByteString>(); | |
| 663 object_store->set_external_one_byte_string_class(cls); | |
| 664 | |
| 665 cls = Class::New<ExternalTwoByteString>(); | |
| 666 object_store->set_external_two_byte_string_class(cls); | |
| 667 | |
| 668 cls = Class::New<ExternalFourByteString>(); | |
| 669 object_store->set_external_four_byte_string_class(cls); | |
| 670 | |
| 635 cls = Class::New<Bool>(); | 671 cls = Class::New<Bool>(); |
| 636 object_store->set_bool_class(cls); | 672 object_store->set_bool_class(cls); |
| 637 | 673 |
| 638 cls = Class::New<UnhandledException>(); | 674 cls = Class::New<UnhandledException>(); |
| 639 object_store->set_unhandled_exception_class(cls); | 675 object_store->set_unhandled_exception_class(cls); |
| 640 | 676 |
| 641 cls = Class::New<Stacktrace>(); | 677 cls = Class::New<Stacktrace>(); |
| 642 object_store->set_stacktrace_class(cls); | 678 object_store->set_stacktrace_class(cls); |
| 643 | 679 |
| 644 cls = Class::New<JSRegExp>(); | 680 cls = Class::New<JSRegExp>(); |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1075 return object_store->double_class(); | 1111 return object_store->double_class(); |
| 1076 case kOneByteString: | 1112 case kOneByteString: |
| 1077 ASSERT(object_store->one_byte_string_class() != Class::null()); | 1113 ASSERT(object_store->one_byte_string_class() != Class::null()); |
| 1078 return object_store->one_byte_string_class(); | 1114 return object_store->one_byte_string_class(); |
| 1079 case kTwoByteString: | 1115 case kTwoByteString: |
| 1080 ASSERT(object_store->two_byte_string_class() != Class::null()); | 1116 ASSERT(object_store->two_byte_string_class() != Class::null()); |
| 1081 return object_store->two_byte_string_class(); | 1117 return object_store->two_byte_string_class(); |
| 1082 case kFourByteString: | 1118 case kFourByteString: |
| 1083 ASSERT(object_store->four_byte_string_class() != Class::null()); | 1119 ASSERT(object_store->four_byte_string_class() != Class::null()); |
| 1084 return object_store->four_byte_string_class(); | 1120 return object_store->four_byte_string_class(); |
| 1121 case kExternalOneByteString: | |
| 1122 ASSERT(object_store->external_one_byte_string_class() != Class::null()); | |
| 1123 return object_store->external_one_byte_string_class(); | |
| 1124 case kExternalTwoByteString: | |
| 1125 ASSERT(object_store->external_two_byte_string_class() != Class::null()); | |
| 1126 return object_store->external_two_byte_string_class(); | |
| 1127 case kExternalFourByteString: | |
| 1128 ASSERT(object_store->external_four_byte_string_class() != Class::null()); | |
| 1129 return object_store->external_four_byte_string_class(); | |
| 1085 case kBool: | 1130 case kBool: |
| 1086 ASSERT(object_store->bool_class() != Class::null()); | 1131 ASSERT(object_store->bool_class() != Class::null()); |
| 1087 return object_store->bool_class(); | 1132 return object_store->bool_class(); |
| 1088 case kArray: | 1133 case kArray: |
| 1089 ASSERT(object_store->array_class() != Class::null()); | 1134 ASSERT(object_store->array_class() != Class::null()); |
| 1090 return object_store->array_class(); | 1135 return object_store->array_class(); |
| 1091 case kImmutableArray: | 1136 case kImmutableArray: |
| 1092 ASSERT(object_store->immutable_array_class() != Class::null()); | 1137 ASSERT(object_store->immutable_array_class() != Class::null()); |
| 1093 return object_store->immutable_array_class(); | 1138 return object_store->immutable_array_class(); |
| 1094 case kStacktrace: | 1139 case kStacktrace: |
| (...skipping 4464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5559 return OneByteString::New(characters, len, space); | 5604 return OneByteString::New(characters, len, space); |
| 5560 } else if (is_two_byte_string) { | 5605 } else if (is_two_byte_string) { |
| 5561 return TwoByteString::New(characters, len, space); | 5606 return TwoByteString::New(characters, len, space); |
| 5562 } | 5607 } |
| 5563 return FourByteString::New(characters, len, space); | 5608 return FourByteString::New(characters, len, space); |
| 5564 } | 5609 } |
| 5565 | 5610 |
| 5566 | 5611 |
| 5567 RawString* String::New(const String& str, Heap::Space space) { | 5612 RawString* String::New(const String& str, Heap::Space space) { |
| 5568 // Currently this just creates a copy of the string in the correct space. | 5613 // Currently this just creates a copy of the string in the correct space. |
| 5569 // Once we have external string support, this will also create a heap copy of | 5614 // Once we have external string support, this will also create a heap copy of |
|
turnidge
2011/10/25 18:07:20
Update this comment?
cshapiro
2011/10/25 20:42:47
Yes, indeed. Thanks for pointing that out.
| |
| 5570 // the string if necessary. Some optimizations are possible, such as not | 5615 // the string if necessary. Some optimizations are possible, such as not |
| 5571 // copying internal strings into the same space. | 5616 // copying internal strings into the same space. |
| 5572 if (str.IsOneByteString()) { | 5617 intptr_t len = str.Length(); |
| 5573 OneByteString& one_byte_str = OneByteString::Handle(); | 5618 String& result = String::Handle(); |
| 5574 one_byte_str ^= str.raw(); | 5619 if (str.HasOneByteChar()) { |
| 5575 return OneByteString::New(one_byte_str, space); | 5620 result ^= OneByteString::New(len, space); |
| 5576 } else if (str.IsTwoByteString()) { | 5621 } else if (str.HasTwoByteChar()) { |
| 5577 TwoByteString& two_byte_str = TwoByteString::Handle(); | 5622 result ^= TwoByteString::New(len, space); |
| 5578 two_byte_str ^= str.raw(); | 5623 } else { |
| 5579 return TwoByteString::New(two_byte_str, space); | 5624 ASSERT(str.HasFourByteChar()); |
| 5625 result ^= FourByteString::New(len, space); | |
| 5580 } | 5626 } |
| 5581 ASSERT(str.IsFourByteString()); | 5627 String::Copy(result, 0, str, 0, len); |
| 5582 FourByteString& four_byte_str = FourByteString::Handle(); | 5628 return result.raw(); |
| 5583 four_byte_str ^= str.raw(); | |
| 5584 return FourByteString::New(four_byte_str, space); | |
| 5585 } | 5629 } |
| 5586 | 5630 |
| 5587 | 5631 |
| 5588 void String::Copy(const String& dst, intptr_t dst_offset, | 5632 void String::Copy(const String& dst, intptr_t dst_offset, |
| 5589 const uint8_t* characters, | 5633 const uint8_t* characters, |
| 5590 intptr_t len) { | 5634 intptr_t len) { |
| 5591 ASSERT(dst_offset >= 0); | 5635 ASSERT(dst_offset >= 0); |
| 5592 ASSERT(len >= 0); | 5636 ASSERT(len >= 0); |
| 5593 ASSERT(len <= (dst.Length() - dst_offset)); | 5637 ASSERT(len <= (dst.Length() - dst_offset)); |
| 5594 if (dst.IsOneByteString()) { | 5638 if (dst.IsOneByteString()) { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5686 | 5730 |
| 5687 void String::Copy(const String& dst, intptr_t dst_offset, | 5731 void String::Copy(const String& dst, intptr_t dst_offset, |
| 5688 const String& src, intptr_t src_offset, | 5732 const String& src, intptr_t src_offset, |
| 5689 intptr_t len) { | 5733 intptr_t len) { |
| 5690 ASSERT(dst_offset >= 0); | 5734 ASSERT(dst_offset >= 0); |
| 5691 ASSERT(src_offset >= 0); | 5735 ASSERT(src_offset >= 0); |
| 5692 ASSERT(len >= 0); | 5736 ASSERT(len >= 0); |
| 5693 ASSERT(len <= (dst.Length() - dst_offset)); | 5737 ASSERT(len <= (dst.Length() - dst_offset)); |
| 5694 ASSERT(len <= (src.Length() - src_offset)); | 5738 ASSERT(len <= (src.Length() - src_offset)); |
| 5695 if (len > 0) { | 5739 if (len > 0) { |
| 5696 if (src.IsOneByteString()) { | 5740 if (src.HasOneByteChar()) { |
| 5697 OneByteString& onestr = OneByteString::Handle(); | 5741 if (src.IsOneByteString()) { |
| 5698 onestr ^= src.raw(); | 5742 OneByteString& onestr = OneByteString::Handle(); |
| 5699 NoGCScope no_gc; | 5743 onestr ^= src.raw(); |
| 5700 String::Copy(dst, dst_offset, onestr.CharAddr(0) + src_offset, len); | 5744 NoGCScope no_gc; |
| 5701 } else if (src.IsTwoByteString()) { | 5745 String::Copy(dst, dst_offset, onestr.CharAddr(0) + src_offset, len); |
| 5702 TwoByteString& twostr = TwoByteString::Handle(); | 5746 } else { |
| 5703 twostr ^= src.raw(); | 5747 ASSERT(src.IsExternalOneByteString()); |
| 5704 NoGCScope no_gc; | 5748 ExternalOneByteString& onestr = ExternalOneByteString::Handle(); |
| 5705 String::Copy(dst, dst_offset, twostr.CharAddr(0) + src_offset, len); | 5749 onestr ^= src.raw(); |
| 5750 NoGCScope no_gc; | |
| 5751 String::Copy(dst, dst_offset, onestr.CharAddr(0) + src_offset, len); | |
| 5752 } | |
| 5753 } else if (src.HasTwoByteChar()) { | |
| 5754 if (src.IsTwoByteString()) { | |
| 5755 TwoByteString& twostr = TwoByteString::Handle(); | |
| 5756 twostr ^= src.raw(); | |
| 5757 NoGCScope no_gc; | |
| 5758 String::Copy(dst, dst_offset, twostr.CharAddr(0) + src_offset, len); | |
| 5759 } else { | |
| 5760 ASSERT(src.IsExternalTwoByteString()); | |
| 5761 ExternalTwoByteString& twostr = ExternalTwoByteString::Handle(); | |
| 5762 twostr ^= src.raw(); | |
| 5763 NoGCScope no_gc; | |
| 5764 String::Copy(dst, dst_offset, twostr.CharAddr(0) + src_offset, len); | |
| 5765 } | |
| 5706 } else { | 5766 } else { |
| 5707 ASSERT(src.IsFourByteString()); | 5767 ASSERT(src.HasFourByteChar()); |
| 5708 FourByteString& fourstr = FourByteString::Handle(); | 5768 if (src.IsFourByteString()) { |
| 5709 fourstr ^= src.raw(); | 5769 FourByteString& fourstr = FourByteString::Handle(); |
| 5710 NoGCScope no_gc; | 5770 fourstr ^= src.raw(); |
| 5711 String::Copy(dst, dst_offset, fourstr.CharAddr(0) + src_offset, len); | 5771 NoGCScope no_gc; |
| 5772 String::Copy(dst, dst_offset, fourstr.CharAddr(0) + src_offset, len); | |
| 5773 } else { | |
| 5774 ASSERT(src.IsExternalFourByteString()); | |
| 5775 ExternalFourByteString& fourstr = ExternalFourByteString::Handle(); | |
| 5776 fourstr ^= src.raw(); | |
| 5777 NoGCScope no_gc; | |
| 5778 String::Copy(dst, dst_offset, fourstr.CharAddr(0) + src_offset, len); | |
| 5779 } | |
| 5712 } | 5780 } |
| 5713 } | 5781 } |
| 5714 } | 5782 } |
| 5715 | 5783 |
| 5716 | 5784 |
| 5717 static void GrowSymbolTable(const Array& symbol_table, intptr_t table_size) { | 5785 static void GrowSymbolTable(const Array& symbol_table, intptr_t table_size) { |
| 5718 // TODO(iposva): Avoid exponential growth. | 5786 // TODO(iposva): Avoid exponential growth. |
| 5719 intptr_t new_table_size = table_size * 2; | 5787 intptr_t new_table_size = table_size * 2; |
| 5720 Array& new_symbol_table = Array::Handle(Array::New(new_table_size + 1)); | 5788 Array& new_symbol_table = Array::Handle(Array::New(new_table_size + 1)); |
| 5721 // Copy all elements from the original symbol table to the newly allocated | 5789 // Copy all elements from the original symbol table to the newly allocated |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5863 } | 5931 } |
| 5864 ASSERT(symbol.IsSymbol()); | 5932 ASSERT(symbol.IsSymbol()); |
| 5865 return symbol.raw(); | 5933 return symbol.raw(); |
| 5866 } | 5934 } |
| 5867 | 5935 |
| 5868 | 5936 |
| 5869 RawString* String::Concat(const String& str1, | 5937 RawString* String::Concat(const String& str1, |
| 5870 const String& str2, | 5938 const String& str2, |
| 5871 Heap::Space space) { | 5939 Heap::Space space) { |
| 5872 ASSERT(!str1.IsNull() && !str2.IsNull()); | 5940 ASSERT(!str1.IsNull() && !str2.IsNull()); |
| 5873 if (str1.IsFourByteString() || str2.IsFourByteString()) { | 5941 if (str1.HasFourByteChar() || str2.HasFourByteChar()) { |
| 5874 return FourByteString::Concat(str1, str2, space); | 5942 return FourByteString::Concat(str1, str2, space); |
| 5875 } | 5943 } |
| 5876 if (str1.IsTwoByteString() || str2.IsTwoByteString()) { | 5944 if (str1.HasTwoByteChar() || str2.HasTwoByteChar()) { |
| 5877 return TwoByteString::Concat(str1, str2, space); | 5945 return TwoByteString::Concat(str1, str2, space); |
| 5878 } | 5946 } |
| 5879 ASSERT(str1.IsOneByteString() && str2.IsOneByteString()); | 5947 ASSERT(str1.HasOneByteChar() && str2.HasOneByteChar()); |
| 5880 return OneByteString::Concat(str1, str2, space); | 5948 return OneByteString::Concat(str1, str2, space); |
| 5881 } | 5949 } |
| 5882 | 5950 |
| 5883 | 5951 |
| 5884 RawString* String::ConcatAll(const Array& strings, | 5952 RawString* String::ConcatAll(const Array& strings, |
| 5885 Heap::Space space) { | 5953 Heap::Space space) { |
| 5886 ASSERT(!strings.IsNull()); | 5954 ASSERT(!strings.IsNull()); |
| 5887 bool is_one_byte_string = true; | 5955 bool is_one_byte_string = true; |
| 5888 bool is_two_byte_string = true; | 5956 bool is_two_byte_string = true; |
| 5889 intptr_t result_len = 0; | 5957 intptr_t result_len = 0; |
| 5890 intptr_t strings_len = strings.Length(); | 5958 intptr_t strings_len = strings.Length(); |
| 5891 String& str = String::Handle(); | 5959 String& str = String::Handle(); |
| 5892 for (intptr_t i = 0; i < strings_len; i++) { | 5960 for (intptr_t i = 0; i < strings_len; i++) { |
| 5893 str ^= strings.At(i); | 5961 str ^= strings.At(i); |
| 5894 result_len += str.Length(); | 5962 result_len += str.Length(); |
| 5895 if (str.IsFourByteString()) { | 5963 if (str.HasFourByteChar()) { |
| 5896 is_one_byte_string = false; | 5964 is_one_byte_string = false; |
| 5897 is_two_byte_string = false; | 5965 is_two_byte_string = false; |
| 5898 } else if (str.IsTwoByteString()) { | 5966 } else if (str.HasTwoByteChar()) { |
| 5899 is_one_byte_string = false; | 5967 is_one_byte_string = false; |
| 5900 } | 5968 } |
| 5901 } | 5969 } |
| 5902 if (is_one_byte_string) { | 5970 if (is_one_byte_string) { |
| 5903 return OneByteString::ConcatAll(strings, result_len, space); | 5971 return OneByteString::ConcatAll(strings, result_len, space); |
| 5904 } else if (is_two_byte_string) { | 5972 } else if (is_two_byte_string) { |
| 5905 return TwoByteString::ConcatAll(strings, result_len, space); | 5973 return TwoByteString::ConcatAll(strings, result_len, space); |
| 5906 } | 5974 } |
| 5907 return FourByteString::ConcatAll(strings, result_len, space); | 5975 return FourByteString::ConcatAll(strings, result_len, space); |
| 5908 } | 5976 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 5922 RawString* String::SubString(const String& str, | 5990 RawString* String::SubString(const String& str, |
| 5923 intptr_t begin_index, | 5991 intptr_t begin_index, |
| 5924 intptr_t length, | 5992 intptr_t length, |
| 5925 Heap::Space space) { | 5993 Heap::Space space) { |
| 5926 ASSERT(!str.IsNull()); | 5994 ASSERT(!str.IsNull()); |
| 5927 ASSERT(begin_index >= 0); | 5995 ASSERT(begin_index >= 0); |
| 5928 ASSERT(length >= 0); | 5996 ASSERT(length >= 0); |
| 5929 if (begin_index >= str.Length()) { | 5997 if (begin_index >= str.Length()) { |
| 5930 return String::null(); | 5998 return String::null(); |
| 5931 } | 5999 } |
| 5932 if (str.IsOneByteString()) { | 6000 String& result = String::Handle(); |
| 5933 OneByteString& obstr = OneByteString::Handle(); | 6001 bool is_one_byte_string = true; |
| 5934 obstr ^= str.raw(); | 6002 bool is_two_byte_string = true; |
| 5935 return OneByteString::SubString(obstr, begin_index, length, space); | 6003 if (str.HasOneByteChar()) { |
| 5936 } else if (str.IsTwoByteString()) { | 6004 // do nothing |
| 5937 TwoByteString& twostr = TwoByteString::Handle(); | 6005 } else if (str.HasTwoByteChar()) { |
| 5938 twostr ^= str.raw(); | 6006 for (intptr_t i = begin_index; i < begin_index + length; ++i) { |
| 5939 return TwoByteString::SubString(twostr, begin_index, length, space); | 6007 if (str.CharAt(i) > 0xFF) { |
| 6008 is_one_byte_string = false; | |
| 6009 break; | |
| 6010 } | |
| 6011 } | |
| 6012 } else { | |
| 6013 ASSERT(str.HasFourByteChar()); | |
| 6014 for (intptr_t i = begin_index; i < begin_index + length; ++i) { | |
| 6015 if (str.CharAt(i) > 0xFFFF) { | |
| 6016 is_one_byte_string = false; | |
| 6017 is_two_byte_string = false; | |
| 6018 break; | |
| 6019 } else if (str.CharAt(i) > 0xFF) { | |
| 6020 is_one_byte_string = false; | |
| 6021 } | |
| 6022 } | |
| 5940 } | 6023 } |
| 5941 ASSERT(str.IsFourByteString()); | 6024 if (is_one_byte_string) { |
| 5942 FourByteString& fourstr = FourByteString::Handle(); | 6025 result ^= OneByteString::New(length, space); |
| 5943 fourstr ^= str.raw(); | 6026 } else if (is_two_byte_string) { |
| 5944 return FourByteString::SubString(fourstr, begin_index, length, space); | 6027 result ^= TwoByteString::New(length, space); |
| 6028 } else { | |
| 6029 result ^= FourByteString::New(length, space); | |
| 6030 } | |
| 6031 String::Copy(result, 0, str, begin_index, length); | |
| 6032 return result.raw(); | |
| 5945 } | 6033 } |
| 5946 | 6034 |
| 5947 | 6035 |
| 5948 const char* String::ToCString() const { | 6036 const char* String::ToCString() const { |
| 5949 intptr_t len = Utf8::Length(*this); | 6037 intptr_t len = Utf8::Length(*this); |
| 5950 Zone* zone = Isolate::Current()->current_zone(); | 6038 Zone* zone = Isolate::Current()->current_zone(); |
| 5951 char* result = reinterpret_cast<char*>(zone->Allocate(len + 1)); | 6039 char* result = reinterpret_cast<char*>(zone->Allocate(len + 1)); |
| 5952 Utf8::Encode(*this, result, len); | 6040 Utf8::Encode(*this, result, len); |
| 5953 result[len] = 0; | 6041 result[len] = 0; |
| 5954 return result; | 6042 return result; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6082 for (intptr_t i = 0; i < strings_len; i++) { | 6170 for (intptr_t i = 0; i < strings_len; i++) { |
| 6083 str ^= strings.At(i); | 6171 str ^= strings.At(i); |
| 6084 intptr_t str_len = str.Length(); | 6172 intptr_t str_len = str.Length(); |
| 6085 String::Copy(result, pos, str, 0, str_len); | 6173 String::Copy(result, pos, str, 0, str_len); |
| 6086 pos += str_len; | 6174 pos += str_len; |
| 6087 } | 6175 } |
| 6088 return result.raw(); | 6176 return result.raw(); |
| 6089 } | 6177 } |
| 6090 | 6178 |
| 6091 | 6179 |
| 6092 RawString* OneByteString::SubString(const OneByteString& str, | |
| 6093 intptr_t begin_index, | |
| 6094 intptr_t length, | |
| 6095 Heap::Space space) { | |
| 6096 ASSERT(!str.IsNull()); | |
| 6097 ASSERT(begin_index < str.Length()); | |
| 6098 OneByteString& result = OneByteString::Handle(); | |
| 6099 if (length <= (str.Length() - begin_index)) { | |
| 6100 result ^= OneByteString::New(length, space); | |
| 6101 String::Copy(result, 0, str, begin_index, length); | |
| 6102 } | |
| 6103 // TODO(5418937): return a non-null object on error. | |
| 6104 return result.raw(); | |
| 6105 } | |
| 6106 | |
| 6107 | |
| 6108 RawOneByteString* OneByteString::Transform(int32_t (*mapping)(int32_t ch), | 6180 RawOneByteString* OneByteString::Transform(int32_t (*mapping)(int32_t ch), |
| 6109 const String& str, | 6181 const String& str, |
| 6110 Heap::Space space) { | 6182 Heap::Space space) { |
| 6111 ASSERT(!str.IsNull()); | 6183 ASSERT(!str.IsNull()); |
| 6112 intptr_t len = str.Length(); | 6184 intptr_t len = str.Length(); |
| 6113 const OneByteString& result = | 6185 const OneByteString& result = |
| 6114 OneByteString::Handle(OneByteString::New(len, space)); | 6186 OneByteString::Handle(OneByteString::New(len, space)); |
| 6115 for (intptr_t i = 0; i < len; ++i) { | 6187 for (intptr_t i = 0; i < len; ++i) { |
| 6116 int32_t ch = mapping(str.CharAt(i)); | 6188 int32_t ch = mapping(str.CharAt(i)); |
| 6117 ASSERT(ch >= 0 && ch <= 0xFF); | 6189 ASSERT(ch >= 0 && ch <= 0xFF); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6201 for (intptr_t i = 0; i < strings_len; i++) { | 6273 for (intptr_t i = 0; i < strings_len; i++) { |
| 6202 str ^= strings.At(i); | 6274 str ^= strings.At(i); |
| 6203 intptr_t str_len = str.Length(); | 6275 intptr_t str_len = str.Length(); |
| 6204 String::Copy(result, pos, str, 0, str_len); | 6276 String::Copy(result, pos, str, 0, str_len); |
| 6205 pos += str_len; | 6277 pos += str_len; |
| 6206 } | 6278 } |
| 6207 return result.raw(); | 6279 return result.raw(); |
| 6208 } | 6280 } |
| 6209 | 6281 |
| 6210 | 6282 |
| 6211 RawString* TwoByteString::SubString(const TwoByteString& str, | |
| 6212 intptr_t begin_index, | |
| 6213 intptr_t length, | |
| 6214 Heap::Space space) { | |
| 6215 ASSERT(!str.IsNull()); | |
| 6216 ASSERT(begin_index < str.Length()); | |
| 6217 String& result = String::Handle(); | |
| 6218 if (length <= (str.Length() - begin_index)) { | |
| 6219 bool is_one_byte_string = true; | |
| 6220 for (intptr_t i = begin_index; i < begin_index + length; ++i) { | |
| 6221 if (str.CharAt(i) > 0xFF) { | |
| 6222 is_one_byte_string = false; | |
| 6223 break; | |
| 6224 } | |
| 6225 } | |
| 6226 if (is_one_byte_string) { | |
| 6227 result ^= OneByteString::New(length, space); | |
| 6228 } else { | |
| 6229 result ^= TwoByteString::New(length, space); | |
| 6230 } | |
| 6231 String::Copy(result, 0, str, begin_index, length); | |
| 6232 } | |
| 6233 // TODO(5418937): return a non-null object on error. | |
| 6234 return result.raw(); | |
| 6235 } | |
| 6236 | |
| 6237 | |
| 6238 RawTwoByteString* TwoByteString::Transform(int32_t (*mapping)(int32_t ch), | 6283 RawTwoByteString* TwoByteString::Transform(int32_t (*mapping)(int32_t ch), |
| 6239 const String& str, | 6284 const String& str, |
| 6240 Heap::Space space) { | 6285 Heap::Space space) { |
| 6241 ASSERT(!str.IsNull()); | 6286 ASSERT(!str.IsNull()); |
| 6242 intptr_t len = str.Length(); | 6287 intptr_t len = str.Length(); |
| 6243 const TwoByteString& result = | 6288 const TwoByteString& result = |
| 6244 TwoByteString::Handle(TwoByteString::New(len, space)); | 6289 TwoByteString::Handle(TwoByteString::New(len, space)); |
| 6245 for (intptr_t i = 0; i < len; ++i) { | 6290 for (intptr_t i = 0; i < len; ++i) { |
| 6246 int32_t ch = mapping(str.CharAt(i)); | 6291 int32_t ch = mapping(str.CharAt(i)); |
| 6247 ASSERT(ch >= 0 && ch <= 0xFFFF); | 6292 ASSERT(ch >= 0 && ch <= 0xFFFF); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6319 str ^= strings.At(i); | 6364 str ^= strings.At(i); |
| 6320 intptr_t str_len = str.Length(); | 6365 intptr_t str_len = str.Length(); |
| 6321 String::Copy(result, pos, str, 0, str_len); | 6366 String::Copy(result, pos, str, 0, str_len); |
| 6322 pos += str_len; | 6367 pos += str_len; |
| 6323 } | 6368 } |
| 6324 } | 6369 } |
| 6325 return result.raw(); | 6370 return result.raw(); |
| 6326 } | 6371 } |
| 6327 | 6372 |
| 6328 | 6373 |
| 6329 RawString* FourByteString::SubString(const FourByteString& str, | |
| 6330 intptr_t begin_index, | |
| 6331 intptr_t length, | |
| 6332 Heap::Space space) { | |
| 6333 ASSERT(!str.IsNull()); | |
| 6334 ASSERT(begin_index < str.Length()); | |
| 6335 String& result = String::Handle(); | |
| 6336 if (length <= (str.Length() - begin_index)) { | |
| 6337 bool is_one_byte_string = true; | |
| 6338 bool is_two_byte_string = true; | |
| 6339 for (intptr_t i = begin_index; i < begin_index + length; ++i) { | |
| 6340 if (str.CharAt(i) > 0xFFFF) { | |
| 6341 is_one_byte_string = false; | |
| 6342 is_two_byte_string = false; | |
| 6343 break; | |
| 6344 } else if (str.CharAt(i) > 0xFF) { | |
| 6345 is_one_byte_string = false; | |
| 6346 } | |
| 6347 } | |
| 6348 if (is_one_byte_string) { | |
| 6349 result ^= OneByteString::New(length, space); | |
| 6350 } else if (is_two_byte_string) { | |
| 6351 result ^= TwoByteString::New(length, space); | |
| 6352 } else { | |
| 6353 result ^= FourByteString::New(length, space); | |
| 6354 } | |
| 6355 String::Copy(result, 0, str, begin_index, length); | |
| 6356 } | |
| 6357 // TODO(5418937): return a non-null object on error. | |
| 6358 return result.raw(); | |
| 6359 } | |
| 6360 | |
| 6361 | |
| 6362 RawFourByteString* FourByteString::Transform(int32_t (*mapping)(int32_t ch), | 6374 RawFourByteString* FourByteString::Transform(int32_t (*mapping)(int32_t ch), |
| 6363 const String& str, | 6375 const String& str, |
| 6364 Heap::Space space) { | 6376 Heap::Space space) { |
| 6365 ASSERT(!str.IsNull()); | 6377 ASSERT(!str.IsNull()); |
| 6366 intptr_t len = str.Length(); | 6378 intptr_t len = str.Length(); |
| 6367 const FourByteString& result = | 6379 const FourByteString& result = |
| 6368 FourByteString::Handle(FourByteString::New(len, space)); | 6380 FourByteString::Handle(FourByteString::New(len, space)); |
| 6369 for (intptr_t i = 0; i < len; ++i) { | 6381 for (intptr_t i = 0; i < len; ++i) { |
| 6370 int32_t ch = mapping(str.CharAt(i)); | 6382 int32_t ch = mapping(str.CharAt(i)); |
| 6371 ASSERT(ch >= 0 && ch <= 0x10FFFF); | 6383 ASSERT(ch >= 0 && ch <= 0x10FFFF); |
| 6372 *result.CharAddr(i) = ch; | 6384 *result.CharAddr(i) = ch; |
| 6373 } | 6385 } |
| 6374 return result.raw(); | 6386 return result.raw(); |
| 6375 } | 6387 } |
| 6376 | 6388 |
| 6377 | 6389 |
| 6378 const char* FourByteString::ToCString() const { | 6390 const char* FourByteString::ToCString() const { |
| 6379 return String::ToCString(); | 6391 return String::ToCString(); |
| 6380 } | 6392 } |
| 6381 | 6393 |
| 6382 | 6394 |
| 6395 RawExternalOneByteString* ExternalOneByteString::New(const uint8_t* data, | |
| 6396 intptr_t len, | |
| 6397 Finalizer finalizer, | |
| 6398 Heap::Space space) { | |
| 6399 Isolate* isolate = Isolate::Current(); | |
| 6400 | |
| 6401 const Class& cls = | |
| 6402 Class::Handle(isolate->object_store()->external_one_byte_string_class()); | |
| 6403 ExternalOneByteString& result = ExternalOneByteString::Handle(); | |
| 6404 { | |
| 6405 RawObject* raw = Object::Allocate(cls, | |
| 6406 ExternalOneByteString::InstanceSize(), | |
| 6407 space); | |
| 6408 NoGCScope no_gc; | |
| 6409 result ^= raw; | |
| 6410 result.SetLength(len); | |
| 6411 result.SetHash(0); | |
| 6412 result.SetData(data); | |
| 6413 } | |
| 6414 return result.raw(); | |
| 6415 } | |
| 6416 | |
| 6417 | |
| 6418 const char* ExternalOneByteString::ToCString() const { | |
| 6419 return String::ToCString(); | |
| 6420 } | |
| 6421 | |
| 6422 | |
| 6423 RawExternalTwoByteString* ExternalTwoByteString::New(const uint16_t* data, | |
| 6424 intptr_t len, | |
| 6425 Finalizer finalizer, | |
| 6426 Heap::Space space) { | |
| 6427 Isolate* isolate = Isolate::Current(); | |
| 6428 | |
| 6429 const Class& cls = | |
| 6430 Class::Handle(isolate->object_store()->external_two_byte_string_class()); | |
| 6431 ExternalTwoByteString& result = ExternalTwoByteString::Handle(); | |
| 6432 { | |
| 6433 RawObject* raw = Object::Allocate(cls, | |
| 6434 ExternalTwoByteString::InstanceSize(), | |
| 6435 space); | |
| 6436 NoGCScope no_gc; | |
| 6437 result ^= raw; | |
| 6438 result.SetLength(len); | |
| 6439 result.SetHash(0); | |
| 6440 result.SetData(data); | |
| 6441 } | |
| 6442 return result.raw(); | |
| 6443 } | |
| 6444 | |
| 6445 | |
| 6446 const char* ExternalTwoByteString::ToCString() const { | |
| 6447 return String::ToCString(); | |
| 6448 } | |
| 6449 | |
| 6450 | |
| 6451 RawExternalFourByteString* ExternalFourByteString::New(const uint32_t* data, | |
| 6452 intptr_t len, | |
| 6453 Finalizer finalizer, | |
| 6454 Heap::Space space) { | |
| 6455 Isolate* isolate = Isolate::Current(); | |
| 6456 | |
| 6457 const Class& cls = | |
| 6458 Class::Handle(isolate->object_store()->external_four_byte_string_class()); | |
| 6459 ExternalFourByteString& result = ExternalFourByteString::Handle(); | |
| 6460 { | |
| 6461 RawObject* raw = Object::Allocate(cls, | |
| 6462 ExternalFourByteString::InstanceSize(), | |
| 6463 space); | |
| 6464 NoGCScope no_gc; | |
| 6465 result ^= raw; | |
| 6466 result.SetLength(len); | |
| 6467 result.SetHash(0); | |
| 6468 result.SetData(data); | |
| 6469 } | |
| 6470 return result.raw(); | |
| 6471 } | |
| 6472 | |
| 6473 | |
| 6474 const char* ExternalFourByteString::ToCString() const { | |
| 6475 return String::ToCString(); | |
| 6476 } | |
| 6477 | |
| 6478 | |
| 6383 RawBool* Bool::True() { | 6479 RawBool* Bool::True() { |
| 6384 return Isolate::Current()->object_store()->true_value(); | 6480 return Isolate::Current()->object_store()->true_value(); |
| 6385 } | 6481 } |
| 6386 | 6482 |
| 6387 | 6483 |
| 6388 RawBool* Bool::False() { | 6484 RawBool* Bool::False() { |
| 6389 return Isolate::Current()->object_store()->false_value(); | 6485 return Isolate::Current()->object_store()->false_value(); |
| 6390 } | 6486 } |
| 6391 | 6487 |
| 6392 | 6488 |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6806 const String& str = String::Handle(pattern()); | 6902 const String& str = String::Handle(pattern()); |
| 6807 const char* format = "JSRegExp: pattern=%s flags=%s"; | 6903 const char* format = "JSRegExp: pattern=%s flags=%s"; |
| 6808 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); | 6904 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); |
| 6809 char* chars = reinterpret_cast<char*>( | 6905 char* chars = reinterpret_cast<char*>( |
| 6810 Isolate::Current()->current_zone()->Allocate(len + 1)); | 6906 Isolate::Current()->current_zone()->Allocate(len + 1)); |
| 6811 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); | 6907 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); |
| 6812 return chars; | 6908 return chars; |
| 6813 } | 6909 } |
| 6814 | 6910 |
| 6815 } // namespace dart | 6911 } // namespace dart |
| OLD | NEW |