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

Side by Side 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: . Created 4 years, 3 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
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/become.h" 10 #include "vm/become.h"
(...skipping 8295 matching lines...) Expand 10 before | Expand all | Expand 10 after
8306 // This should be caught before we reach here. 8306 // This should be caught before we reach here.
8307 FATAL1("Fatal error in TokenStream::New: invalid len %" Pd "\n", len); 8307 FATAL1("Fatal error in TokenStream::New: invalid len %" Pd "\n", len);
8308 } 8308 }
8309 uint8_t* data = reinterpret_cast<uint8_t*>(::malloc(len)); 8309 uint8_t* data = reinterpret_cast<uint8_t*>(::malloc(len));
8310 ASSERT(data != NULL); 8310 ASSERT(data != NULL);
8311 Zone* zone = Thread::Current()->zone(); 8311 Zone* zone = Thread::Current()->zone();
8312 const ExternalTypedData& stream = ExternalTypedData::Handle( 8312 const ExternalTypedData& stream = ExternalTypedData::Handle(
8313 zone, 8313 zone,
8314 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, 8314 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
8315 data, len, Heap::kOld)); 8315 data, len, Heap::kOld));
8316 stream.AddFinalizer(data, DataFinalizer); 8316 stream.AddFinalizer(data, DataFinalizer, len);
8317 const TokenStream& result = TokenStream::Handle(zone, TokenStream::New()); 8317 const TokenStream& result = TokenStream::Handle(zone, TokenStream::New());
8318 result.SetStream(stream); 8318 result.SetStream(stream);
8319 return result.raw(); 8319 return result.raw();
8320 } 8320 }
8321 8321
8322 8322
8323 // CompressedTokenMap maps String and LiteralToken keys to Smi values. 8323 // CompressedTokenMap maps String and LiteralToken keys to Smi values.
8324 // It also supports lookup by TokenDescriptor. 8324 // It also supports lookup by TokenDescriptor.
8325 class CompressedTokenTraits { 8325 class CompressedTokenTraits {
8326 public: 8326 public:
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
8499 CompressedTokenStreamData data(token_objects, &map); 8499 CompressedTokenStreamData data(token_objects, &map);
8500 Scanner scanner(source, private_key); 8500 Scanner scanner(source, private_key);
8501 scanner.ScanAll(&data); 8501 scanner.ScanAll(&data);
8502 INC_STAT(thread, num_tokens_scanned, data.NumTokens()); 8502 INC_STAT(thread, num_tokens_scanned, data.NumTokens());
8503 8503
8504 // Create and setup the token stream object. 8504 // Create and setup the token stream object.
8505 const ExternalTypedData& stream = ExternalTypedData::Handle( 8505 const ExternalTypedData& stream = ExternalTypedData::Handle(
8506 zone, 8506 zone,
8507 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, 8507 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
8508 data.GetStream(), data.Length(), Heap::kOld)); 8508 data.GetStream(), data.Length(), Heap::kOld));
8509 stream.AddFinalizer(data.GetStream(), DataFinalizer); 8509 intptr_t external_size = data.Length();
8510 stream.AddFinalizer(data.GetStream(), DataFinalizer, external_size);
siva 2016/08/29 23:03:45 In this case we are not allocating a new buffer bu
rmacnak 2016/08/30 20:49:17 DataFinalizer here does a free, so this can't be p
8510 const TokenStream& result = TokenStream::Handle(zone, New()); 8511 const TokenStream& result = TokenStream::Handle(zone, New());
8511 result.SetPrivateKey(private_key); 8512 result.SetPrivateKey(private_key);
8512 { 8513 {
8513 NoSafepointScope no_safepoint; 8514 NoSafepointScope no_safepoint;
8514 result.SetStream(stream); 8515 result.SetStream(stream);
8515 result.SetTokenObjects(token_objects); 8516 result.SetTokenObjects(token_objects);
8516 } 8517 }
8517 8518
8518 token_objects_map = map.Release().raw(); 8519 token_objects_map = map.Release().raw();
8519 if (use_shared_tokens) { 8520 if (use_shared_tokens) {
(...skipping 11910 matching lines...) Expand 10 before | Expand all | Expand 10 after
20430 20431
20431 void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const { 20432 void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const {
20432 ASSERT(array_len >= Utf8::Length(*this)); 20433 ASSERT(array_len >= Utf8::Length(*this));
20433 Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len); 20434 Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len);
20434 } 20435 }
20435 20436
20436 20437
20437 static FinalizablePersistentHandle* AddFinalizer( 20438 static FinalizablePersistentHandle* AddFinalizer(
20438 const Object& referent, 20439 const Object& referent,
20439 void* peer, 20440 void* peer,
20440 Dart_WeakPersistentHandleFinalizer callback) { 20441 Dart_WeakPersistentHandleFinalizer callback,
20442 intptr_t external_size) {
20441 ASSERT((callback != NULL && peer != NULL) || 20443 ASSERT((callback != NULL && peer != NULL) ||
20442 (callback == NULL && peer == NULL)); 20444 (callback == NULL && peer == NULL));
20443 // TODO(19482): Make API consistent for external size of strings/typed data.
20444 const intptr_t external_size = 0;
20445 return FinalizablePersistentHandle::New(Isolate::Current(), 20445 return FinalizablePersistentHandle::New(Isolate::Current(),
20446 referent, 20446 referent,
20447 peer, 20447 peer,
20448 callback, 20448 callback,
20449 external_size); 20449 external_size);
20450 } 20450 }
20451 20451
20452 20452
20453 RawString* String::MakeExternal(void* array, 20453 RawString* String::MakeExternal(void* array,
20454 intptr_t length, 20454 intptr_t length,
20455 void* peer, 20455 void* peer,
20456 Dart_PeerFinalizer cback) const { 20456 Dart_PeerFinalizer cback) const {
20457 ASSERT(FLAG_support_externalizable_strings); 20457 ASSERT(FLAG_support_externalizable_strings);
20458 String& result = String::Handle(); 20458 String& result = String::Handle();
20459 void* external_data; 20459 void* external_data;
20460 intptr_t external_size;
20460 Dart_WeakPersistentHandleFinalizer finalizer; 20461 Dart_WeakPersistentHandleFinalizer finalizer;
20461 { 20462 {
20462 NoSafepointScope no_safepoint; 20463 NoSafepointScope no_safepoint;
20463 ASSERT(array != NULL); 20464 ASSERT(array != NULL);
20464 intptr_t str_length = this->Length(); 20465 intptr_t str_length = this->Length();
20465 ASSERT(length >= (str_length * this->CharSize())); 20466 ASSERT(length >= (str_length * this->CharSize()));
20466 intptr_t class_id = raw()->GetClassId(); 20467 intptr_t class_id = raw()->GetClassId();
20467 20468
20468 ASSERT(!InVMHeap()); 20469 ASSERT(!InVMHeap());
20469 if (class_id == kOneByteStringCid) { 20470 if (class_id == kOneByteStringCid) {
(...skipping 23 matching lines...) Expand all
20493 } while (tags != old_tags); 20494 } while (tags != old_tags);
20494 result = this->raw(); 20495 result = this->raw();
20495 const uint8_t* ext_array = reinterpret_cast<const uint8_t*>(array); 20496 const uint8_t* ext_array = reinterpret_cast<const uint8_t*>(array);
20496 ExternalStringData<uint8_t>* ext_data = new ExternalStringData<uint8_t>( 20497 ExternalStringData<uint8_t>* ext_data = new ExternalStringData<uint8_t>(
20497 ext_array, peer, cback); 20498 ext_array, peer, cback);
20498 ASSERT(result.Length() == str_length); 20499 ASSERT(result.Length() == str_length);
20499 ASSERT(!result.HasHash() || 20500 ASSERT(!result.HasHash() ||
20500 (result.Hash() == String::Hash(ext_array, str_length))); 20501 (result.Hash() == String::Hash(ext_array, str_length)));
20501 ExternalOneByteString::SetExternalData(result, ext_data); 20502 ExternalOneByteString::SetExternalData(result, ext_data);
20502 external_data = ext_data; 20503 external_data = ext_data;
20504 external_size = str_length;
siva 2016/08/29 23:03:45 Shouldn't external_size just be 'length' as that i
rmacnak 2016/08/30 20:49:17 Yes. Renamed external_size here and external_alloc
20503 finalizer = ExternalOneByteString::Finalize; 20505 finalizer = ExternalOneByteString::Finalize;
20504 } else { 20506 } else {
20505 ASSERT(class_id == kTwoByteStringCid); 20507 ASSERT(class_id == kTwoByteStringCid);
20506 intptr_t used_size = ExternalTwoByteString::InstanceSize(); 20508 intptr_t used_size = ExternalTwoByteString::InstanceSize();
20507 intptr_t original_size = TwoByteString::InstanceSize(str_length); 20509 intptr_t original_size = TwoByteString::InstanceSize(str_length);
20508 ASSERT(original_size >= used_size); 20510 ASSERT(original_size >= used_size);
20509 20511
20510 // Copy the data into the external array. 20512 // Copy the data into the external array.
20511 if (str_length > 0) { 20513 if (str_length > 0) {
20512 memmove(array, 20514 memmove(array,
(...skipping 18 matching lines...) Expand all
20531 } while (tags != old_tags); 20533 } while (tags != old_tags);
20532 result = this->raw(); 20534 result = this->raw();
20533 const uint16_t* ext_array = reinterpret_cast<const uint16_t*>(array); 20535 const uint16_t* ext_array = reinterpret_cast<const uint16_t*>(array);
20534 ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>( 20536 ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>(
20535 ext_array, peer, cback); 20537 ext_array, peer, cback);
20536 ASSERT(result.Length() == str_length); 20538 ASSERT(result.Length() == str_length);
20537 ASSERT(!result.HasHash() || 20539 ASSERT(!result.HasHash() ||
20538 (result.Hash() == String::Hash(ext_array, str_length))); 20540 (result.Hash() == String::Hash(ext_array, str_length)));
20539 ExternalTwoByteString::SetExternalData(result, ext_data); 20541 ExternalTwoByteString::SetExternalData(result, ext_data);
20540 external_data = ext_data; 20542 external_data = ext_data;
20543 external_size = str_length * 2;
20541 finalizer = ExternalTwoByteString::Finalize; 20544 finalizer = ExternalTwoByteString::Finalize;
20542 } 20545 }
20543 } // NoSafepointScope 20546 } // NoSafepointScope
20544 AddFinalizer(result, external_data, finalizer); 20547 AddFinalizer(result, external_data, finalizer, external_size);
20545 return this->raw(); 20548 return this->raw();
20546 } 20549 }
20547 20550
20548 20551
20549 RawString* String::Transform(int32_t (*mapping)(int32_t ch), 20552 RawString* String::Transform(int32_t (*mapping)(int32_t ch),
20550 const String& str, 20553 const String& str,
20551 Heap::Space space) { 20554 Heap::Space space) {
20552 ASSERT(!str.IsNull()); 20555 ASSERT(!str.IsNull());
20553 bool has_mapping = false; 20556 bool has_mapping = false;
20554 int32_t dst_max = 0; 20557 int32_t dst_max = 0;
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
20989 } 20992 }
20990 20993
20991 20994
20992 void OneByteString::SetPeer(const String& str, 20995 void OneByteString::SetPeer(const String& str,
20993 void* peer, 20996 void* peer,
20994 Dart_PeerFinalizer cback) { 20997 Dart_PeerFinalizer cback) {
20995 ASSERT(!str.IsNull() && str.IsOneByteString()); 20998 ASSERT(!str.IsNull() && str.IsOneByteString());
20996 ASSERT(peer != NULL); 20999 ASSERT(peer != NULL);
20997 ExternalStringData<uint8_t>* ext_data = 21000 ExternalStringData<uint8_t>* ext_data =
20998 new ExternalStringData<uint8_t>(NULL, peer, cback); 21001 new ExternalStringData<uint8_t>(NULL, peer, cback);
20999 AddFinalizer(str, ext_data, OneByteString::Finalize); 21002 intptr_t external_size = str.Length();
siva 2016/08/29 23:03:45 For the same reason I am wondering if OneByteStrin
rmacnak 2016/08/30 20:49:17 Pushed through from Dart_MakeExternalString.
21003 AddFinalizer(str, ext_data, OneByteString::Finalize, external_size);
21000 Isolate::Current()->heap()->SetPeer(str.raw(), peer); 21004 Isolate::Current()->heap()->SetPeer(str.raw(), peer);
21001 } 21005 }
21002 21006
21003 21007
21004 void OneByteString::Finalize(void* isolate_callback_data, 21008 void OneByteString::Finalize(void* isolate_callback_data,
21005 Dart_WeakPersistentHandle handle, 21009 Dart_WeakPersistentHandle handle,
21006 void* peer) { 21010 void* peer) {
21007 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer); 21011 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer);
21008 } 21012 }
21009 21013
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
21200 } 21204 }
21201 21205
21202 21206
21203 void TwoByteString::SetPeer(const String& str, 21207 void TwoByteString::SetPeer(const String& str,
21204 void* peer, 21208 void* peer,
21205 Dart_PeerFinalizer cback) { 21209 Dart_PeerFinalizer cback) {
21206 ASSERT(!str.IsNull() && str.IsTwoByteString()); 21210 ASSERT(!str.IsNull() && str.IsTwoByteString());
21207 ASSERT(peer != NULL); 21211 ASSERT(peer != NULL);
21208 ExternalStringData<uint16_t>* ext_data = 21212 ExternalStringData<uint16_t>* ext_data =
21209 new ExternalStringData<uint16_t>(NULL, peer, cback); 21213 new ExternalStringData<uint16_t>(NULL, peer, cback);
21210 AddFinalizer(str, ext_data, TwoByteString::Finalize); 21214 intptr_t external_size = str.Length() * 2;
21215 AddFinalizer(str, ext_data, TwoByteString::Finalize, external_size);
21211 Isolate::Current()->heap()->SetPeer(str.raw(), peer); 21216 Isolate::Current()->heap()->SetPeer(str.raw(), peer);
21212 } 21217 }
21213 21218
21214 21219
21215 void TwoByteString::Finalize(void* isolate_callback_data, 21220 void TwoByteString::Finalize(void* isolate_callback_data,
21216 Dart_WeakPersistentHandle handle, 21221 Dart_WeakPersistentHandle handle,
21217 void* peer) { 21222 void* peer) {
21218 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer); 21223 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer);
21219 } 21224 }
21220 21225
(...skipping 17 matching lines...) Expand all
21238 { 21243 {
21239 RawObject* raw = Object::Allocate(ExternalOneByteString::kClassId, 21244 RawObject* raw = Object::Allocate(ExternalOneByteString::kClassId,
21240 ExternalOneByteString::InstanceSize(), 21245 ExternalOneByteString::InstanceSize(),
21241 space); 21246 space);
21242 NoSafepointScope no_safepoint; 21247 NoSafepointScope no_safepoint;
21243 result ^= raw; 21248 result ^= raw;
21244 result.SetLength(len); 21249 result.SetLength(len);
21245 result.SetHash(0); 21250 result.SetHash(0);
21246 SetExternalData(result, external_data); 21251 SetExternalData(result, external_data);
21247 } 21252 }
21248 AddFinalizer(result, external_data, ExternalOneByteString::Finalize); 21253 intptr_t external_size = len;
21254 AddFinalizer(result, external_data, ExternalOneByteString::Finalize,
21255 external_size);
21249 return ExternalOneByteString::raw(result); 21256 return ExternalOneByteString::raw(result);
21250 } 21257 }
21251 21258
21252 21259
21253 void ExternalOneByteString::Finalize(void* isolate_callback_data, 21260 void ExternalOneByteString::Finalize(void* isolate_callback_data,
21254 Dart_WeakPersistentHandle handle, 21261 Dart_WeakPersistentHandle handle,
21255 void* peer) { 21262 void* peer) {
21256 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer); 21263 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer);
21257 } 21264 }
21258 21265
(...skipping 17 matching lines...) Expand all
21276 { 21283 {
21277 RawObject* raw = Object::Allocate(ExternalTwoByteString::kClassId, 21284 RawObject* raw = Object::Allocate(ExternalTwoByteString::kClassId,
21278 ExternalTwoByteString::InstanceSize(), 21285 ExternalTwoByteString::InstanceSize(),
21279 space); 21286 space);
21280 NoSafepointScope no_safepoint; 21287 NoSafepointScope no_safepoint;
21281 result ^= raw; 21288 result ^= raw;
21282 result.SetLength(len); 21289 result.SetLength(len);
21283 result.SetHash(0); 21290 result.SetHash(0);
21284 SetExternalData(result, external_data); 21291 SetExternalData(result, external_data);
21285 } 21292 }
21286 AddFinalizer(result, external_data, ExternalTwoByteString::Finalize); 21293 intptr_t external_size = len * 2;
21294 AddFinalizer(result, external_data, ExternalTwoByteString::Finalize,
21295 external_size);
21287 return ExternalTwoByteString::raw(result); 21296 return ExternalTwoByteString::raw(result);
21288 } 21297 }
21289 21298
21290 21299
21291 void ExternalTwoByteString::Finalize(void* isolate_callback_data, 21300 void ExternalTwoByteString::Finalize(void* isolate_callback_data,
21292 Dart_WeakPersistentHandle handle, 21301 Dart_WeakPersistentHandle handle,
21293 void* peer) { 21302 void* peer) {
21294 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer); 21303 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer);
21295 } 21304 }
21296 21305
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
22070 #define CASE_TYPED_DATA_CLASS(clazz) \ 22079 #define CASE_TYPED_DATA_CLASS(clazz) \
22071 case kTypedData##clazz##Cid: return #clazz; 22080 case kTypedData##clazz##Cid: return #clazz;
22072 CLASS_LIST_TYPED_DATA(CASE_TYPED_DATA_CLASS); 22081 CLASS_LIST_TYPED_DATA(CASE_TYPED_DATA_CLASS);
22073 #undef CASE_TYPED_DATA_CLASS 22082 #undef CASE_TYPED_DATA_CLASS
22074 } 22083 }
22075 return "TypedData"; 22084 return "TypedData";
22076 } 22085 }
22077 22086
22078 22087
22079 FinalizablePersistentHandle* ExternalTypedData::AddFinalizer( 22088 FinalizablePersistentHandle* ExternalTypedData::AddFinalizer(
22080 void* peer, Dart_WeakPersistentHandleFinalizer callback) const { 22089 void* peer,
22081 return dart::AddFinalizer(*this, peer, callback); 22090 Dart_WeakPersistentHandleFinalizer callback,
22091 intptr_t external_size) const {
22092 return dart::AddFinalizer(*this, peer, callback, external_size);
22082 } 22093 }
22083 22094
22084 22095
22085 RawExternalTypedData* ExternalTypedData::New(intptr_t class_id, 22096 RawExternalTypedData* ExternalTypedData::New(intptr_t class_id,
22086 uint8_t* data, 22097 uint8_t* data,
22087 intptr_t len, 22098 intptr_t len,
22088 Heap::Space space) { 22099 Heap::Space space) {
22089 ExternalTypedData& result = ExternalTypedData::Handle(); 22100 ExternalTypedData& result = ExternalTypedData::Handle();
22090 { 22101 {
22091 RawObject* raw = Object::Allocate(class_id, 22102 RawObject* raw = Object::Allocate(class_id,
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after
22721 return UserTag::null(); 22732 return UserTag::null();
22722 } 22733 }
22723 22734
22724 22735
22725 const char* UserTag::ToCString() const { 22736 const char* UserTag::ToCString() const {
22726 const String& tag_label = String::Handle(label()); 22737 const String& tag_label = String::Handle(label());
22727 return tag_label.ToCString(); 22738 return tag_label.ToCString();
22728 } 22739 }
22729 22740
22730 } // namespace dart 22741 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698