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