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

Unified Diff: runtime/vm/object.cc

Issue 11318018: - Represent strings internally in UTF-16 format, this makes it (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/object.cc
===================================================================
--- runtime/vm/object.cc (revision 14314)
+++ runtime/vm/object.cc (working copy)
@@ -612,12 +612,6 @@
RegisterPrivateClass(cls, name, core_lib);
pending_classes.Add(cls, Heap::kOld);
- cls = Class::New<FourByteString>();
- object_store->set_four_byte_string_class(cls);
- name = Symbols::FourByteString();
- RegisterPrivateClass(cls, name, core_lib);
- pending_classes.Add(cls, Heap::kOld);
-
cls = Class::New<ExternalOneByteString>();
object_store->set_external_one_byte_string_class(cls);
name = Symbols::ExternalOneByteString();
@@ -630,12 +624,6 @@
RegisterPrivateClass(cls, name, core_lib);
pending_classes.Add(cls, Heap::kOld);
- cls = Class::New<ExternalFourByteString>();
- object_store->set_external_four_byte_string_class(cls);
- name = Symbols::ExternalFourByteString();
- RegisterPrivateClass(cls, name, core_lib);
- pending_classes.Add(cls, Heap::kOld);
-
cls = Class::New<Stacktrace>();
object_store->set_stacktrace_class(cls);
name = Symbols::Stacktrace();
@@ -1103,18 +1091,12 @@
cls = Class::New<TwoByteString>();
object_store->set_two_byte_string_class(cls);
- cls = Class::New<FourByteString>();
- object_store->set_four_byte_string_class(cls);
-
cls = Class::New<ExternalOneByteString>();
object_store->set_external_one_byte_string_class(cls);
cls = Class::New<ExternalTwoByteString>();
object_store->set_external_two_byte_string_class(cls);
- cls = Class::New<ExternalFourByteString>();
- object_store->set_external_four_byte_string_class(cls);
-
cls = Class::New<Bool>();
object_store->set_bool_class(cls);
@@ -1247,10 +1229,8 @@
return Symbols::New("double");
case kOneByteStringCid:
case kTwoByteStringCid:
- case kFourByteStringCid:
case kExternalOneByteStringCid:
case kExternalTwoByteStringCid:
- case kExternalFourByteStringCid:
return Symbols::New("String");
case kArrayCid:
case kImmutableArrayCid:
@@ -9823,17 +9803,22 @@
bool String::Equals(const char* str) const {
+ ASSERT(str != NULL);
+ intptr_t len = strlen(str);
for (intptr_t i = 0; i < this->Length(); ++i) {
if (*str == '\0') {
// Lengths don't match.
return false;
}
int32_t ch;
- intptr_t consumed = Utf8::Decode(str, &ch);
+ intptr_t consumed = Utf8::Decode(reinterpret_cast<const uint8_t*>(str),
+ len,
+ &ch);
if (consumed == 0 || this->CharAt(i) != ch) {
return false;
}
str += consumed;
+ len -= consumed;
}
return *str == '\0';
}
@@ -9927,76 +9912,70 @@
RawString* String::New(const char* str, Heap::Space space) {
- intptr_t width = 0;
- intptr_t len = Utf8::CodePointCount(str, &width);
- if (width == 1) {
- const OneByteString& onestr
+ ASSERT(str != NULL);
+ intptr_t array_len = strlen(str);
+ const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(str);
+ return String::New(utf8_array, array_len, space);
+}
+
+
+RawString* String::New(const uint8_t* utf8_array,
+ intptr_t array_len,
+ Heap::Space space) {
+ Utf8::Type type;
+ intptr_t len = Utf8::CodePointCount(utf8_array, array_len, &type);
+ if (type == Utf8::kAscii) {
+ const OneByteString& strobj
= OneByteString::Handle(OneByteString::New(len, space));
if (len > 0) {
NoGCScope no_gc;
- Utf8::Decode(str, onestr.CharAddr(0), len);
+ Utf8::DecodeToAscii(utf8_array, array_len, strobj.CharAddr(0), len);
}
- return onestr.raw();
- } else if (width == 2) {
- const TwoByteString& twostr =
- TwoByteString::Handle(TwoByteString::New(len, space));
- NoGCScope no_gc;
- Utf8::Decode(str, twostr.CharAddr(0), len);
- return twostr.raw();
+ return strobj.raw();
}
- ASSERT(width == 4);
- const FourByteString& fourstr =
- FourByteString::Handle(FourByteString::New(len, space));
+ ASSERT((type == Utf8::kBMP) || (type == Utf8::kSMP));
+ const TwoByteString& strobj =
+ TwoByteString::Handle(TwoByteString::New(len, space));
NoGCScope no_gc;
- Utf8::Decode(str, fourstr.CharAddr(0), len);
- return fourstr.raw();
+ Utf8::DecodeToUTF16(utf8_array, array_len, strobj.CharAddr(0), len);
+ return strobj.raw();
}
-RawString* String::New(const uint8_t* characters,
- intptr_t len,
+RawString* String::New(const uint16_t* utf16_array,
+ intptr_t array_len,
Heap::Space space) {
- return OneByteString::New(characters, len, space);
-}
-
-
-RawString* String::New(const uint16_t* characters,
- intptr_t len,
- Heap::Space space) {
bool is_one_byte_string = true;
- for (intptr_t i = 0; i < len; ++i) {
- if (characters[i] > 0xFF) {
+ for (intptr_t i = 0; i < array_len; ++i) {
+ if (utf16_array[i] > 0x7F) {
is_one_byte_string = false;
break;
}
}
if (is_one_byte_string) {
- return OneByteString::New(characters, len, space);
+ return OneByteString::New(utf16_array, array_len, space);
}
- return TwoByteString::New(characters, len, space);
+ return TwoByteString::New(utf16_array, array_len, space);
}
-RawString* String::New(const uint32_t* characters,
- intptr_t len,
+RawString* String::New(const uint32_t* utf32_array,
+ intptr_t array_len,
Heap::Space space) {
bool is_one_byte_string = true;
- bool is_two_byte_string = true;
- for (intptr_t i = 0; i < len; ++i) {
- if (characters[i] > 0xFFFF) {
- is_two_byte_string = false;
+ intptr_t utf16_len = array_len;
+ for (intptr_t i = 0; i < array_len; ++i) {
+ if (utf32_array[i] > 0x7F) {
is_one_byte_string = false;
- break;
- } else if (characters[i] > 0xFF) {
- is_one_byte_string = false;
}
+ if (utf32_array[i] > 0xFFFF) {
+ utf16_len += 1;
+ }
}
if (is_one_byte_string) {
- return OneByteString::New(characters, len, space);
- } else if (is_two_byte_string) {
- return TwoByteString::New(characters, len, space);
+ return OneByteString::New(utf32_array, array_len, space);
}
- return FourByteString::New(characters, len, space);
+ return TwoByteString::New(utf16_len, utf32_array, array_len, space);
}
@@ -10010,11 +9989,9 @@
intptr_t char_size = str.CharSize();
if (char_size == kOneByteChar) {
result ^= OneByteString::New(len, space);
- } else if (char_size == kTwoByteChar) {
- result ^= TwoByteString::New(len, space);
} else {
- ASSERT(char_size == kFourByteChar);
- result ^= FourByteString::New(len, space);
+ ASSERT(char_size == kTwoByteChar);
+ result ^= TwoByteString::New(len, space);
}
String::Copy(result, 0, str, 0, len);
return result.raw();
@@ -10039,15 +10016,6 @@
}
-RawString* String::NewExternal(const uint32_t* characters,
- intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
- Heap::Space space) {
- return ExternalFourByteString::New(characters, len, peer, callback, space);
-}
-
-
void String::Copy(const String& dst, intptr_t dst_offset,
const uint8_t* characters,
intptr_t len) {
@@ -10066,74 +10034,30 @@
for (intptr_t i = 0; i < len; ++i) {
*twostr.CharAddr(i + dst_offset) = characters[i];
}
- } else {
- ASSERT(dst.IsFourByteString());
- const FourByteString& fourstr = FourByteString::Cast(dst);
- NoGCScope no_gc;
- for (intptr_t i = 0; i < len; ++i) {
- *fourstr.CharAddr(i + dst_offset) = characters[i];
- }
}
}
void String::Copy(const String& dst, intptr_t dst_offset,
- const uint16_t* characters,
- intptr_t len) {
+ const uint16_t* utf16_array,
+ intptr_t array_len) {
ASSERT(dst_offset >= 0);
- ASSERT(len >= 0);
- ASSERT(len <= (dst.Length() - dst_offset));
+ ASSERT(array_len >= 0);
+ ASSERT(array_len <= (dst.Length() - dst_offset));
if (dst.IsOneByteString()) {
const OneByteString& onestr = OneByteString::Cast(dst);
NoGCScope no_gc;
- for (intptr_t i = 0; i < len; ++i) {
- ASSERT(characters[i] <= 0xFF);
- *onestr.CharAddr(i + dst_offset) = characters[i];
+ for (intptr_t i = 0; i < array_len; ++i) {
+ ASSERT(utf16_array[i] <= 0x7F);
+ *onestr.CharAddr(i + dst_offset) = utf16_array[i];
}
- } else if (dst.IsTwoByteString()) {
- const TwoByteString& twostr = TwoByteString::Cast(dst);
- NoGCScope no_gc;
- if (len > 0) {
- memmove(twostr.CharAddr(dst_offset), characters, len * 2);
- }
} else {
- ASSERT(dst.IsFourByteString());
- const FourByteString& fourstr = FourByteString::Cast(dst);
- NoGCScope no_gc;
- for (intptr_t i = 0; i < len; ++i) {
- *fourstr.CharAddr(i + dst_offset) = characters[i];
- }
- }
-}
-
-
-void String::Copy(const String& dst, intptr_t dst_offset,
- const uint32_t* characters,
- intptr_t len) {
- ASSERT(dst_offset >= 0);
- ASSERT(len >= 0);
- ASSERT(len <= (dst.Length() - dst_offset));
- if (dst.IsOneByteString()) {
- const OneByteString& onestr = OneByteString::Cast(dst);
- NoGCScope no_gc;
- for (intptr_t i = 0; i < len; ++i) {
- ASSERT(characters[i] <= 0xFF);
- *onestr.CharAddr(i + dst_offset) = characters[i];
- }
- } else if (dst.IsTwoByteString()) {
+ ASSERT(dst.IsTwoByteString());
const TwoByteString& twostr = TwoByteString::Cast(dst);
NoGCScope no_gc;
- for (intptr_t i = 0; i < len; ++i) {
- ASSERT(characters[i] <= 0xFFFF);
- *twostr.CharAddr(i + dst_offset) = characters[i];
+ if (array_len > 0) {
+ memmove(twostr.CharAddr(dst_offset), utf16_array, (array_len * 2));
}
- } else {
- ASSERT(dst.IsFourByteString());
- const FourByteString& fourstr = FourByteString::Cast(dst);
- NoGCScope no_gc;
- if (len > 0) {
- memmove(fourstr.CharAddr(dst_offset), characters, len * 4);
- }
}
}
@@ -10159,7 +10083,8 @@
NoGCScope no_gc;
String::Copy(dst, dst_offset, onestr.CharAddr(0) + src_offset, len);
}
- } else if (char_size == kTwoByteChar) {
+ } else {
+ ASSERT(char_size == kTwoByteChar);
if (src.IsTwoByteString()) {
const TwoByteString& twostr = TwoByteString::Cast(src);
NoGCScope no_gc;
@@ -10170,19 +10095,6 @@
NoGCScope no_gc;
String::Copy(dst, dst_offset, twostr.CharAddr(0) + src_offset, len);
}
- } else {
- ASSERT(char_size == kFourByteChar);
- if (src.IsFourByteString()) {
- const FourByteString& fourstr = FourByteString::Cast(src);
- NoGCScope no_gc;
- String::Copy(dst, dst_offset, fourstr.CharAddr(0) + src_offset, len);
- } else {
- ASSERT(src.IsExternalFourByteString());
- const ExternalFourByteString& fourstr =
- ExternalFourByteString::Cast(src);
- NoGCScope no_gc;
- String::Copy(dst, dst_offset, fourstr.CharAddr(0) + src_offset, len);
- }
}
}
}
@@ -10193,13 +10105,9 @@
const OneByteString& onestr = OneByteString::Cast(str);
return onestr.EscapeSpecialCharacters(raw_str);
}
- if (str.IsTwoByteString()) {
- const TwoByteString& twostr = TwoByteString::Cast(str);
- return twostr.EscapeSpecialCharacters(raw_str);
- }
- ASSERT(str.IsFourByteString());
- const FourByteString& fourstr = FourByteString::Cast(str);
- return fourstr.EscapeSpecialCharacters(raw_str);
+ ASSERT(str.IsTwoByteString());
+ const TwoByteString& twostr = TwoByteString::Cast(str);
+ return twostr.EscapeSpecialCharacters(raw_str);
}
@@ -10232,9 +10140,6 @@
Heap::Space space) {
ASSERT(!str1.IsNull() && !str2.IsNull());
intptr_t char_size = Utils::Maximum(str1.CharSize(), str2.CharSize());
- if (char_size == kFourByteChar) {
- return FourByteString::Concat(str1, str2, space);
- }
if (char_size == kTwoByteChar) {
return TwoByteString::Concat(str1, str2, space);
}
@@ -10256,11 +10161,9 @@
}
if (char_size == kOneByteChar) {
return OneByteString::ConcatAll(strings, result_len, space);
- } else if (char_size == kTwoByteChar) {
- return TwoByteString::ConcatAll(strings, result_len, space);
}
- ASSERT(char_size == kFourByteChar);
- return FourByteString::ConcatAll(strings, result_len, space);
+ ASSERT(char_size == kTwoByteChar);
+ return TwoByteString::ConcatAll(strings, result_len, space);
}
@@ -10290,32 +10193,19 @@
}
String& result = String::Handle();
bool is_one_byte_string = true;
- bool is_two_byte_string = true;
intptr_t char_size = str.CharSize();
if (char_size == kTwoByteChar) {
for (intptr_t i = begin_index; i < begin_index + length; ++i) {
- if (str.CharAt(i) > 0xFF) {
+ if (str.CharAt(i) > 0x7F) {
is_one_byte_string = false;
break;
}
}
- } else if (char_size == kFourByteChar) {
- for (intptr_t i = begin_index; i < begin_index + length; ++i) {
- if (str.CharAt(i) > 0xFFFF) {
- is_one_byte_string = false;
- is_two_byte_string = false;
- break;
- } else if (str.CharAt(i) > 0xFF) {
- is_one_byte_string = false;
- }
- }
}
if (is_one_byte_string) {
result ^= OneByteString::New(length, space);
- } else if (is_two_byte_string) {
- result ^= TwoByteString::New(length, space);
} else {
- result ^= FourByteString::New(length, space);
+ result ^= TwoByteString::New(length, space);
}
String::Copy(result, 0, str, begin_index, length);
return result.raw();
@@ -10325,13 +10215,27 @@
const char* String::ToCString() const {
intptr_t len = Utf8::Length(*this);
Zone* zone = Isolate::Current()->current_zone();
- char* result = zone->Alloc<char>(len + 1);
- Utf8::Encode(*this, result, len);
+ uint8_t* result = zone->Alloc<uint8_t>(len + 1);
+ ToUTF8(result, len);
result[len] = 0;
- return result;
+ return reinterpret_cast<const char*>(result);
}
+void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const {
+ if (CharSize() == kOneByteChar) {
+ const OneByteString& obj = OneByteString::Cast(*this);
+ ASSERT(array_len >= obj.Length());
+ if (obj.Length() > 0) {
+ memmove(utf8_array, obj.CharAddr(0), obj.Length());
+ }
+ } else {
+ ASSERT(array_len >= Utf8::Length(*this));
+ Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len);
+ }
+}
+
+
RawString* String::Transform(int32_t (*mapping)(int32_t ch),
const String& str,
Heap::Space space) {
@@ -10351,14 +10255,11 @@
if (!has_mapping) {
return str.raw();
}
- if (dst_max <= 0xFF) {
+ if (dst_max <= 0x7F) {
return OneByteString::Transform(mapping, str, space);
}
- if (dst_max <= 0xFFFF) {
- return TwoByteString::Transform(mapping, str, space);
- }
- ASSERT(dst_max > 0xFFFF);
- return FourByteString::Transform(mapping, str, space);
+ ASSERT(dst_max > 0x7F);
+ return TwoByteString::Transform(mapping, str, space);
}
@@ -10489,7 +10390,10 @@
Heap::Space space) {
const OneByteString& result =
OneByteString::Handle(OneByteString::New(len, space));
- String::Copy(result, 0, characters, len);
+ if (len > 0) {
+ NoGCScope no_gc;
+ memmove(result.CharAddr(0), characters, len);
+ }
return result.raw();
}
@@ -10499,7 +10403,10 @@
Heap::Space space) {
const OneByteString& result =
OneByteString::Handle(OneByteString::New(len, space));
- String::Copy(result, 0, characters, len);
+ for (intptr_t i = 0; i < len; ++i) {
+ ASSERT(characters[i] <= 0x7F);
+ *result.CharAddr(i) = characters[i];
+ }
return result.raw();
}
@@ -10509,7 +10416,10 @@
Heap::Space space) {
const OneByteString& result =
OneByteString::Handle(OneByteString::New(len, space));
- String::Copy(result, 0, characters, len);
+ for (intptr_t i = 0; i < len; ++i) {
+ ASSERT(characters[i] <= 0x7F);
+ *result.CharAddr(i) = characters[i];
+ }
return result.raw();
}
@@ -10565,7 +10475,7 @@
OneByteString::Handle(OneByteString::New(len, space));
for (intptr_t i = 0; i < len; ++i) {
int32_t ch = mapping(str.CharAt(i));
- ASSERT(ch >= 0 && ch <= 0xFF);
+ ASSERT(ch >= 0 && ch <= 0x7F);
*result.CharAddr(i) = ch;
}
return result.raw();
@@ -10631,22 +10541,42 @@
}
-RawTwoByteString* TwoByteString::New(const uint16_t* characters,
- intptr_t len,
+RawTwoByteString* TwoByteString::New(const uint16_t* utf16_array,
+ intptr_t array_len,
Heap::Space space) {
+ ASSERT(array_len > 0);
const TwoByteString& result =
- TwoByteString::Handle(TwoByteString::New(len, space));
- String::Copy(result, 0, characters, len);
+ TwoByteString::Handle(TwoByteString::New(array_len, space));
+ {
+ NoGCScope no_gc;
+ memmove(result.CharAddr(0), utf16_array, (array_len * 2));
+ }
return result.raw();
}
-RawTwoByteString* TwoByteString::New(const uint32_t* characters,
- intptr_t len,
+RawTwoByteString* TwoByteString::New(intptr_t utf16_len,
+ const uint32_t* utf32_array,
+ intptr_t array_len,
Heap::Space space) {
+ ASSERT((array_len > 0) && (utf16_len >= array_len));
const TwoByteString& result =
- TwoByteString::Handle(TwoByteString::New(len, space));
- String::Copy(result, 0, characters, len);
+ TwoByteString::Handle(TwoByteString::New(utf16_len, space));
+ {
+ NoGCScope no_gc;
+ intptr_t j = 0;
+ for (intptr_t i = 0; i < array_len; ++i) {
+ if (utf32_array[i] > 0xffff) {
+ ASSERT(j < (utf16_len - 1));
+ Utf8::ConvertUTF32ToUTF16(utf32_array[i], result.CharAddr(j));
+ j += 2;
+ } else {
+ ASSERT(j < utf16_len);
+ *result.CharAddr(j) = utf32_array[i];
+ j += 1;
+ }
+ }
+ }
return result.raw();
}
@@ -10714,132 +10644,6 @@
}
-RawFourByteString* FourByteString::EscapeSpecialCharacters(bool raw_str) const {
- intptr_t len = Length();
- if (len > 0) {
- intptr_t num_escapes = 0;
- intptr_t index = 0;
- for (intptr_t i = 0; i < len; i++) {
- if (IsSpecialCharacter(*CharAddr(i)) ||
- (!raw_str && (*CharAddr(i) == '\\'))) {
- num_escapes += 1;
- }
- }
- const FourByteString& dststr = FourByteString::Handle(
- FourByteString::New(len + num_escapes, Heap::kNew));
- for (intptr_t i = 0; i < len; i++) {
- if (IsSpecialCharacter(*CharAddr(i))) {
- *(dststr.CharAddr(index)) = '\\';
- *(dststr.CharAddr(index + 1)) = SpecialCharacter(*CharAddr(i));
- index += 2;
- } else if (!raw_str && (*CharAddr(i) == '\\')) {
- *(dststr.CharAddr(index)) = '\\';
- *(dststr.CharAddr(index + 1)) = '\\';
- index += 2;
- } else {
- *(dststr.CharAddr(index)) = *CharAddr(i);
- index += 1;
- }
- }
- return dststr.raw();
- }
- return FourByteString::null();
-}
-
-
-RawFourByteString* FourByteString::New(intptr_t len,
- Heap::Space space) {
- ASSERT(Isolate::Current()->object_store()->four_byte_string_class() !=
- Class::null());
- if (len < 0 || len > kMaxElements) {
- // This should be caught before we reach here.
- FATAL1("Fatal error in FourByteString::New: invalid len %"Pd"\n", len);
- }
- FourByteString& result = FourByteString::Handle();
- {
- RawObject* raw = Object::Allocate(FourByteString::kClassId,
- FourByteString::InstanceSize(len),
- space);
- NoGCScope no_gc;
- result ^= raw;
- result.SetLength(len);
- result.SetHash(0);
- }
- return result.raw();
-}
-
-
-RawFourByteString* FourByteString::New(const uint32_t* characters,
- intptr_t len,
- Heap::Space space) {
- const FourByteString& result =
- FourByteString::Handle(FourByteString::New(len, space));
- String::Copy(result, 0, characters, len);
- return result.raw();
-}
-
-
-RawFourByteString* FourByteString::New(const FourByteString& str,
- Heap::Space space) {
- return FourByteString::New(str.CharAddr(0), str.Length(), space);
-}
-
-
-RawFourByteString* FourByteString::Concat(const String& str1,
- const String& str2,
- Heap::Space space) {
- intptr_t len1 = str1.Length();
- intptr_t len2 = str2.Length();
- intptr_t len = len1 + len2;
- const FourByteString& result =
- FourByteString::Handle(FourByteString::New(len, space));
- String::Copy(result, 0, str1, 0, len1);
- String::Copy(result, len1, str2, 0, len2);
- return result.raw();
-}
-
-
-RawFourByteString* FourByteString::ConcatAll(const Array& strings,
- intptr_t len,
- Heap::Space space) {
- const FourByteString& result =
- FourByteString::Handle(FourByteString::New(len, space));
- String& str = String::Handle();
- {
- intptr_t strings_len = strings.Length();
- intptr_t pos = 0;
- for (intptr_t i = 0; i < strings_len; i++) {
- str ^= strings.At(i);
- intptr_t str_len = str.Length();
- String::Copy(result, pos, str, 0, str_len);
- pos += str_len;
- }
- }
- return result.raw();
-}
-
-
-RawFourByteString* FourByteString::Transform(int32_t (*mapping)(int32_t ch),
- const String& str,
- Heap::Space space) {
- ASSERT(!str.IsNull());
- intptr_t len = str.Length();
- const FourByteString& result =
- FourByteString::Handle(FourByteString::New(len, space));
- for (intptr_t i = 0; i < len; ++i) {
- int32_t ch = mapping(str.CharAt(i));
- ASSERT(ch >= 0 && ch <= 0x10FFFF);
- *result.CharAddr(i) = ch;
- }
- return result.raw();
-}
-
-
-const char* FourByteString::ToCString() const {
- return String::ToCString();
-}
-
-
static void AddFinalizer(const Object& referent,
void* peer,
Dart_WeakPersistentHandleFinalizer callback) {
@@ -10948,48 +10752,6 @@
}
-RawExternalFourByteString* ExternalFourByteString::New(
- const uint32_t* data,
- intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
- Heap::Space space) {
- ASSERT(Isolate::Current()->object_store()->
- external_four_byte_string_class() != Class::null());
- if (len < 0 || len > kMaxElements) {
- // This should be caught before we reach here.
- FATAL1("Fatal error in ExternalFourByteString::New: invalid len %"Pd"\n",
- len);
- }
- ExternalFourByteString& result = ExternalFourByteString::Handle();
- ExternalStringData<uint32_t>* external_data =
- new ExternalStringData<uint32_t>(data, peer, callback);
- {
- RawObject* raw = Object::Allocate(ExternalFourByteString::kClassId,
- ExternalFourByteString::InstanceSize(),
- space);
- NoGCScope no_gc;
- result ^= raw;
- result.SetLength(len);
- result.SetHash(0);
- result.SetExternalData(external_data);
- }
- AddFinalizer(result, external_data, ExternalFourByteString::Finalize);
- return result.raw();
-}
-
-
-void ExternalFourByteString::Finalize(Dart_Handle handle, void* peer) {
- delete reinterpret_cast<ExternalStringData<uint32_t>*>(peer);
- DeleteWeakPersistentHandle(handle);
-}
-
-
-const char* ExternalFourByteString::ToCString() const {
- return String::ToCString();
-}
-
-
RawBool* Bool::True() {
return Isolate::Current()->object_store()->true_value();
}

Powered by Google App Engine
This is Rietveld 408576698