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

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: sync 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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object_snapshot.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
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 external_size,
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 Dart_WeakPersistentHandleFinalizer finalizer; 20460 Dart_WeakPersistentHandleFinalizer finalizer;
20461 { 20461 {
20462 NoSafepointScope no_safepoint; 20462 NoSafepointScope no_safepoint;
20463 ASSERT(array != NULL); 20463 ASSERT(array != NULL);
20464 intptr_t str_length = this->Length(); 20464 intptr_t str_length = this->Length();
20465 ASSERT(length >= (str_length * this->CharSize())); 20465 ASSERT(external_size >= (str_length * this->CharSize()));
20466 intptr_t class_id = raw()->GetClassId(); 20466 intptr_t class_id = raw()->GetClassId();
20467 20467
20468 ASSERT(!InVMHeap()); 20468 ASSERT(!InVMHeap());
20469 if (class_id == kOneByteStringCid) { 20469 if (class_id == kOneByteStringCid) {
20470 intptr_t used_size = ExternalOneByteString::InstanceSize(); 20470 intptr_t used_size = ExternalOneByteString::InstanceSize();
20471 intptr_t original_size = OneByteString::InstanceSize(str_length); 20471 intptr_t original_size = OneByteString::InstanceSize(str_length);
20472 ASSERT(original_size >= used_size); 20472 ASSERT(original_size >= used_size);
20473 20473
20474 // Copy the data into the external array. 20474 // Copy the data into the external array.
20475 if (str_length > 0) { 20475 if (str_length > 0) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
20534 ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>( 20534 ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>(
20535 ext_array, peer, cback); 20535 ext_array, peer, cback);
20536 ASSERT(result.Length() == str_length); 20536 ASSERT(result.Length() == str_length);
20537 ASSERT(!result.HasHash() || 20537 ASSERT(!result.HasHash() ||
20538 (result.Hash() == String::Hash(ext_array, str_length))); 20538 (result.Hash() == String::Hash(ext_array, str_length)));
20539 ExternalTwoByteString::SetExternalData(result, ext_data); 20539 ExternalTwoByteString::SetExternalData(result, ext_data);
20540 external_data = ext_data; 20540 external_data = ext_data;
20541 finalizer = ExternalTwoByteString::Finalize; 20541 finalizer = ExternalTwoByteString::Finalize;
20542 } 20542 }
20543 } // NoSafepointScope 20543 } // NoSafepointScope
20544 AddFinalizer(result, external_data, finalizer); 20544 AddFinalizer(result, external_data, finalizer, external_size);
20545 return this->raw(); 20545 return this->raw();
20546 } 20546 }
20547 20547
20548 20548
20549 RawString* String::Transform(int32_t (*mapping)(int32_t ch), 20549 RawString* String::Transform(int32_t (*mapping)(int32_t ch),
20550 const String& str, 20550 const String& str,
20551 Heap::Space space) { 20551 Heap::Space space) {
20552 ASSERT(!str.IsNull()); 20552 ASSERT(!str.IsNull());
20553 bool has_mapping = false; 20553 bool has_mapping = false;
20554 int32_t dst_max = 0; 20554 int32_t dst_max = 0;
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
20983 if (length > 0) { 20983 if (length > 0) {
20984 uint8_t* dest = &result->ptr()->data()[0]; 20984 uint8_t* dest = &result->ptr()->data()[0];
20985 const uint8_t* src = &raw_ptr(str)->data()[begin_index]; 20985 const uint8_t* src = &raw_ptr(str)->data()[begin_index];
20986 memmove(dest, src, length); 20986 memmove(dest, src, length);
20987 } 20987 }
20988 return result; 20988 return result;
20989 } 20989 }
20990 20990
20991 20991
20992 void OneByteString::SetPeer(const String& str, 20992 void OneByteString::SetPeer(const String& str,
20993 intptr_t external_size,
20993 void* peer, 20994 void* peer,
20994 Dart_PeerFinalizer cback) { 20995 Dart_PeerFinalizer cback) {
20995 ASSERT(!str.IsNull() && str.IsOneByteString()); 20996 ASSERT(!str.IsNull() && str.IsOneByteString());
20996 ASSERT(peer != NULL); 20997 ASSERT(peer != NULL);
20997 ExternalStringData<uint8_t>* ext_data = 20998 ExternalStringData<uint8_t>* ext_data =
20998 new ExternalStringData<uint8_t>(NULL, peer, cback); 20999 new ExternalStringData<uint8_t>(NULL, peer, cback);
20999 AddFinalizer(str, ext_data, OneByteString::Finalize); 21000 AddFinalizer(str, ext_data, OneByteString::Finalize, external_size);
21000 Isolate::Current()->heap()->SetPeer(str.raw(), peer); 21001 Isolate::Current()->heap()->SetPeer(str.raw(), peer);
21001 } 21002 }
21002 21003
21003 21004
21004 void OneByteString::Finalize(void* isolate_callback_data, 21005 void OneByteString::Finalize(void* isolate_callback_data,
21005 Dart_WeakPersistentHandle handle, 21006 Dart_WeakPersistentHandle handle,
21006 void* peer) { 21007 void* peer) {
21007 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer); 21008 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer);
21008 } 21009 }
21009 21010
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
21194 ASSERT(len == 2); 21195 ASSERT(len == 2);
21195 Utf16::Encode(dst, CharAddr(result, i)); 21196 Utf16::Encode(dst, CharAddr(result, i));
21196 } 21197 }
21197 i += len; 21198 i += len;
21198 } 21199 }
21199 return TwoByteString::raw(result); 21200 return TwoByteString::raw(result);
21200 } 21201 }
21201 21202
21202 21203
21203 void TwoByteString::SetPeer(const String& str, 21204 void TwoByteString::SetPeer(const String& str,
21205 intptr_t external_size,
21204 void* peer, 21206 void* peer,
21205 Dart_PeerFinalizer cback) { 21207 Dart_PeerFinalizer cback) {
21206 ASSERT(!str.IsNull() && str.IsTwoByteString()); 21208 ASSERT(!str.IsNull() && str.IsTwoByteString());
21207 ASSERT(peer != NULL); 21209 ASSERT(peer != NULL);
21208 ExternalStringData<uint16_t>* ext_data = 21210 ExternalStringData<uint16_t>* ext_data =
21209 new ExternalStringData<uint16_t>(NULL, peer, cback); 21211 new ExternalStringData<uint16_t>(NULL, peer, cback);
21210 AddFinalizer(str, ext_data, TwoByteString::Finalize); 21212 AddFinalizer(str, ext_data, TwoByteString::Finalize, external_size);
21211 Isolate::Current()->heap()->SetPeer(str.raw(), peer); 21213 Isolate::Current()->heap()->SetPeer(str.raw(), peer);
21212 } 21214 }
21213 21215
21214 21216
21215 void TwoByteString::Finalize(void* isolate_callback_data, 21217 void TwoByteString::Finalize(void* isolate_callback_data,
21216 Dart_WeakPersistentHandle handle, 21218 Dart_WeakPersistentHandle handle,
21217 void* peer) { 21219 void* peer) {
21218 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer); 21220 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer);
21219 } 21221 }
21220 21222
(...skipping 17 matching lines...) Expand all
21238 { 21240 {
21239 RawObject* raw = Object::Allocate(ExternalOneByteString::kClassId, 21241 RawObject* raw = Object::Allocate(ExternalOneByteString::kClassId,
21240 ExternalOneByteString::InstanceSize(), 21242 ExternalOneByteString::InstanceSize(),
21241 space); 21243 space);
21242 NoSafepointScope no_safepoint; 21244 NoSafepointScope no_safepoint;
21243 result ^= raw; 21245 result ^= raw;
21244 result.SetLength(len); 21246 result.SetLength(len);
21245 result.SetHash(0); 21247 result.SetHash(0);
21246 SetExternalData(result, external_data); 21248 SetExternalData(result, external_data);
21247 } 21249 }
21248 AddFinalizer(result, external_data, ExternalOneByteString::Finalize); 21250 intptr_t external_size = len;
21251 AddFinalizer(result, external_data, ExternalOneByteString::Finalize,
21252 external_size);
21249 return ExternalOneByteString::raw(result); 21253 return ExternalOneByteString::raw(result);
21250 } 21254 }
21251 21255
21252 21256
21253 void ExternalOneByteString::Finalize(void* isolate_callback_data, 21257 void ExternalOneByteString::Finalize(void* isolate_callback_data,
21254 Dart_WeakPersistentHandle handle, 21258 Dart_WeakPersistentHandle handle,
21255 void* peer) { 21259 void* peer) {
21256 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer); 21260 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer);
21257 } 21261 }
21258 21262
(...skipping 17 matching lines...) Expand all
21276 { 21280 {
21277 RawObject* raw = Object::Allocate(ExternalTwoByteString::kClassId, 21281 RawObject* raw = Object::Allocate(ExternalTwoByteString::kClassId,
21278 ExternalTwoByteString::InstanceSize(), 21282 ExternalTwoByteString::InstanceSize(),
21279 space); 21283 space);
21280 NoSafepointScope no_safepoint; 21284 NoSafepointScope no_safepoint;
21281 result ^= raw; 21285 result ^= raw;
21282 result.SetLength(len); 21286 result.SetLength(len);
21283 result.SetHash(0); 21287 result.SetHash(0);
21284 SetExternalData(result, external_data); 21288 SetExternalData(result, external_data);
21285 } 21289 }
21286 AddFinalizer(result, external_data, ExternalTwoByteString::Finalize); 21290 intptr_t external_size = len * 2;
21291 AddFinalizer(result, external_data, ExternalTwoByteString::Finalize,
21292 external_size);
21287 return ExternalTwoByteString::raw(result); 21293 return ExternalTwoByteString::raw(result);
21288 } 21294 }
21289 21295
21290 21296
21291 void ExternalTwoByteString::Finalize(void* isolate_callback_data, 21297 void ExternalTwoByteString::Finalize(void* isolate_callback_data,
21292 Dart_WeakPersistentHandle handle, 21298 Dart_WeakPersistentHandle handle,
21293 void* peer) { 21299 void* peer) {
21294 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer); 21300 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer);
21295 } 21301 }
21296 21302
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
22070 #define CASE_TYPED_DATA_CLASS(clazz) \ 22076 #define CASE_TYPED_DATA_CLASS(clazz) \
22071 case kTypedData##clazz##Cid: return #clazz; 22077 case kTypedData##clazz##Cid: return #clazz;
22072 CLASS_LIST_TYPED_DATA(CASE_TYPED_DATA_CLASS); 22078 CLASS_LIST_TYPED_DATA(CASE_TYPED_DATA_CLASS);
22073 #undef CASE_TYPED_DATA_CLASS 22079 #undef CASE_TYPED_DATA_CLASS
22074 } 22080 }
22075 return "TypedData"; 22081 return "TypedData";
22076 } 22082 }
22077 22083
22078 22084
22079 FinalizablePersistentHandle* ExternalTypedData::AddFinalizer( 22085 FinalizablePersistentHandle* ExternalTypedData::AddFinalizer(
22080 void* peer, Dart_WeakPersistentHandleFinalizer callback) const { 22086 void* peer,
22081 return dart::AddFinalizer(*this, peer, callback); 22087 Dart_WeakPersistentHandleFinalizer callback,
22088 intptr_t external_size) const {
22089 return dart::AddFinalizer(*this, peer, callback, external_size);
22082 } 22090 }
22083 22091
22084 22092
22085 RawExternalTypedData* ExternalTypedData::New(intptr_t class_id, 22093 RawExternalTypedData* ExternalTypedData::New(intptr_t class_id,
22086 uint8_t* data, 22094 uint8_t* data,
22087 intptr_t len, 22095 intptr_t len,
22088 Heap::Space space) { 22096 Heap::Space space) {
22089 ExternalTypedData& result = ExternalTypedData::Handle(); 22097 ExternalTypedData& result = ExternalTypedData::Handle();
22090 { 22098 {
22091 RawObject* raw = Object::Allocate(class_id, 22099 RawObject* raw = Object::Allocate(class_id,
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after
22721 return UserTag::null(); 22729 return UserTag::null();
22722 } 22730 }
22723 22731
22724 22732
22725 const char* UserTag::ToCString() const { 22733 const char* UserTag::ToCString() const {
22726 const String& tag_label = String::Handle(label()); 22734 const String& tag_label = String::Handle(label());
22727 return tag_label.ToCString(); 22735 return tag_label.ToCString();
22728 } 22736 }
22729 22737
22730 } // namespace dart 22738 } // namespace dart
OLDNEW
« 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