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

Unified Diff: runtime/vm/object.cc

Issue 2275803002: Assign external sizes to external strings and to external typed data created by the VM. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: sync Created 4 years, 4 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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object_snapshot.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object_snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698