Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: runtime/vm/object.cc

Issue 8383029: Implement external strings. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: pre-review clean-up Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698