| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 3ad9de1e8beb6c646a19597c1de7316e0e7cf5af..406e182d5222943dbf41bb29c7b931e4ba087acf 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -8313,7 +8313,7 @@ RawTokenStream* TokenStream::New(intptr_t len) {
|
| zone,
|
| ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
|
| data, len, Heap::kOld));
|
| - stream.AddFinalizer(data, DataFinalizer);
|
| + stream.AddFinalizer(data, DataFinalizer, len);
|
| const TokenStream& result = TokenStream::Handle(zone, TokenStream::New());
|
| result.SetStream(stream);
|
| return result.raw();
|
| @@ -8506,7 +8506,8 @@ RawTokenStream* TokenStream::New(const String& source,
|
| zone,
|
| ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
|
| data.GetStream(), data.Length(), Heap::kOld));
|
| - stream.AddFinalizer(data.GetStream(), DataFinalizer);
|
| + intptr_t external_size = data.Length();
|
| + stream.AddFinalizer(data.GetStream(), DataFinalizer, external_size);
|
| const TokenStream& result = TokenStream::Handle(zone, New());
|
| result.SetPrivateKey(private_key);
|
| {
|
| @@ -20437,11 +20438,10 @@ void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const {
|
| static FinalizablePersistentHandle* AddFinalizer(
|
| const Object& referent,
|
| void* peer,
|
| - Dart_WeakPersistentHandleFinalizer callback) {
|
| + Dart_WeakPersistentHandleFinalizer callback,
|
| + intptr_t external_size) {
|
| ASSERT((callback != NULL && peer != NULL) ||
|
| (callback == NULL && peer == NULL));
|
| - // TODO(19482): Make API consistent for external size of strings/typed data.
|
| - const intptr_t external_size = 0;
|
| return FinalizablePersistentHandle::New(Isolate::Current(),
|
| referent,
|
| peer,
|
| @@ -20451,7 +20451,7 @@ static FinalizablePersistentHandle* AddFinalizer(
|
|
|
|
|
| RawString* String::MakeExternal(void* array,
|
| - intptr_t length,
|
| + intptr_t external_size,
|
| void* peer,
|
| Dart_PeerFinalizer cback) const {
|
| ASSERT(FLAG_support_externalizable_strings);
|
| @@ -20462,7 +20462,7 @@ RawString* String::MakeExternal(void* array,
|
| NoSafepointScope no_safepoint;
|
| ASSERT(array != NULL);
|
| intptr_t str_length = this->Length();
|
| - ASSERT(length >= (str_length * this->CharSize()));
|
| + ASSERT(external_size >= (str_length * this->CharSize()));
|
| intptr_t class_id = raw()->GetClassId();
|
|
|
| ASSERT(!InVMHeap());
|
| @@ -20541,7 +20541,7 @@ RawString* String::MakeExternal(void* array,
|
| finalizer = ExternalTwoByteString::Finalize;
|
| }
|
| } // NoSafepointScope
|
| - AddFinalizer(result, external_data, finalizer);
|
| + AddFinalizer(result, external_data, finalizer, external_size);
|
| return this->raw();
|
| }
|
|
|
| @@ -20990,13 +20990,14 @@ RawOneByteString* OneByteString::SubStringUnchecked(const String& str,
|
|
|
|
|
| void OneByteString::SetPeer(const String& str,
|
| + intptr_t external_size,
|
| void* peer,
|
| Dart_PeerFinalizer cback) {
|
| ASSERT(!str.IsNull() && str.IsOneByteString());
|
| ASSERT(peer != NULL);
|
| ExternalStringData<uint8_t>* ext_data =
|
| new ExternalStringData<uint8_t>(NULL, peer, cback);
|
| - AddFinalizer(str, ext_data, OneByteString::Finalize);
|
| + AddFinalizer(str, ext_data, OneByteString::Finalize, external_size);
|
| Isolate::Current()->heap()->SetPeer(str.raw(), peer);
|
| }
|
|
|
| @@ -21201,13 +21202,14 @@ RawTwoByteString* TwoByteString::Transform(int32_t (*mapping)(int32_t ch),
|
|
|
|
|
| void TwoByteString::SetPeer(const String& str,
|
| + intptr_t external_size,
|
| void* peer,
|
| Dart_PeerFinalizer cback) {
|
| ASSERT(!str.IsNull() && str.IsTwoByteString());
|
| ASSERT(peer != NULL);
|
| ExternalStringData<uint16_t>* ext_data =
|
| new ExternalStringData<uint16_t>(NULL, peer, cback);
|
| - AddFinalizer(str, ext_data, TwoByteString::Finalize);
|
| + AddFinalizer(str, ext_data, TwoByteString::Finalize, external_size);
|
| Isolate::Current()->heap()->SetPeer(str.raw(), peer);
|
| }
|
|
|
| @@ -21245,7 +21247,9 @@ RawExternalOneByteString* ExternalOneByteString::New(
|
| result.SetHash(0);
|
| SetExternalData(result, external_data);
|
| }
|
| - AddFinalizer(result, external_data, ExternalOneByteString::Finalize);
|
| + intptr_t external_size = len;
|
| + AddFinalizer(result, external_data, ExternalOneByteString::Finalize,
|
| + external_size);
|
| return ExternalOneByteString::raw(result);
|
| }
|
|
|
| @@ -21283,7 +21287,9 @@ RawExternalTwoByteString* ExternalTwoByteString::New(
|
| result.SetHash(0);
|
| SetExternalData(result, external_data);
|
| }
|
| - AddFinalizer(result, external_data, ExternalTwoByteString::Finalize);
|
| + intptr_t external_size = len * 2;
|
| + AddFinalizer(result, external_data, ExternalTwoByteString::Finalize,
|
| + external_size);
|
| return ExternalTwoByteString::raw(result);
|
| }
|
|
|
| @@ -22077,8 +22083,10 @@ const char* TypedData::ToCString() const {
|
|
|
|
|
| FinalizablePersistentHandle* ExternalTypedData::AddFinalizer(
|
| - void* peer, Dart_WeakPersistentHandleFinalizer callback) const {
|
| - return dart::AddFinalizer(*this, peer, callback);
|
| + void* peer,
|
| + Dart_WeakPersistentHandleFinalizer callback,
|
| + intptr_t external_size) const {
|
| + return dart::AddFinalizer(*this, peer, callback, external_size);
|
| }
|
|
|
|
|
|
|