OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |