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

Side by Side Diff: runtime/vm/object.cc

Issue 9368049: Add external byte array API and finalize external strings and byte arrays. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address review comments Created 8 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.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 "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
11 #include "vm/code_generator.h" 11 #include "vm/code_generator.h"
12 #include "vm/code_index_table.h" 12 #include "vm/code_index_table.h"
13 #include "vm/code_patcher.h" 13 #include "vm/code_patcher.h"
14 #include "vm/compiler.h" 14 #include "vm/compiler.h"
15 #include "vm/compiler_stats.h" 15 #include "vm/compiler_stats.h"
16 #include "vm/class_finalizer.h" 16 #include "vm/class_finalizer.h"
17 #include "vm/dart.h" 17 #include "vm/dart.h"
18 #include "vm/dart_api_state.h"
18 #include "vm/dart_entry.h" 19 #include "vm/dart_entry.h"
19 #include "vm/debuginfo.h" 20 #include "vm/debuginfo.h"
20 #include "vm/exceptions.h" 21 #include "vm/exceptions.h"
21 #include "vm/growable_array.h" 22 #include "vm/growable_array.h"
22 #include "vm/heap.h" 23 #include "vm/heap.h"
23 #include "vm/ic_data.h" 24 #include "vm/ic_data.h"
24 #include "vm/object_store.h" 25 #include "vm/object_store.h"
25 #include "vm/parser.h" 26 #include "vm/parser.h"
26 #include "vm/runtime_entry.h" 27 #include "vm/runtime_entry.h"
27 #include "vm/scopes.h" 28 #include "vm/scopes.h"
(...skipping 6511 matching lines...) Expand 10 before | Expand all | Expand 10 after
6539 result ^= FourByteString::New(len, space); 6540 result ^= FourByteString::New(len, space);
6540 } 6541 }
6541 String::Copy(result, 0, str, 0, len); 6542 String::Copy(result, 0, str, 0, len);
6542 return result.raw(); 6543 return result.raw();
6543 } 6544 }
6544 6545
6545 6546
6546 RawString* String::NewExternal(const uint8_t* characters, 6547 RawString* String::NewExternal(const uint8_t* characters,
6547 intptr_t len, 6548 intptr_t len,
6548 void* peer, 6549 void* peer,
6549 PeerFinalizer callback, 6550 Dart_PeerFinalizer callback,
6550 Heap::Space space) { 6551 Heap::Space space) {
6551 return ExternalOneByteString::New(characters, len, peer, callback, space); 6552 return ExternalOneByteString::New(characters, len, peer, callback, space);
6552 } 6553 }
6553 6554
6554 6555
6555 RawString* String::NewExternal(const uint16_t* characters, 6556 RawString* String::NewExternal(const uint16_t* characters,
6556 intptr_t len, 6557 intptr_t len,
6557 void* peer, 6558 void* peer,
6558 PeerFinalizer callback, 6559 Dart_PeerFinalizer callback,
6559 Heap::Space space) { 6560 Heap::Space space) {
6560 return ExternalTwoByteString::New(characters, len, peer, callback, space); 6561 return ExternalTwoByteString::New(characters, len, peer, callback, space);
6561 } 6562 }
6562 6563
6563 6564
6564 RawString* String::NewExternal(const uint32_t* characters, 6565 RawString* String::NewExternal(const uint32_t* characters,
6565 intptr_t len, 6566 intptr_t len,
6566 void* peer, 6567 void* peer,
6567 PeerFinalizer callback, 6568 Dart_PeerFinalizer callback,
6568 Heap::Space space) { 6569 Heap::Space space) {
6569 return ExternalFourByteString::New(characters, len, peer, callback, space); 6570 return ExternalFourByteString::New(characters, len, peer, callback, space);
6570 } 6571 }
6571 6572
6572 6573
6573 void String::Copy(const String& dst, intptr_t dst_offset, 6574 void String::Copy(const String& dst, intptr_t dst_offset,
6574 const uint8_t* characters, 6575 const uint8_t* characters,
6575 intptr_t len) { 6576 intptr_t len) {
6576 ASSERT(dst_offset >= 0); 6577 ASSERT(dst_offset >= 0);
6577 ASSERT(len >= 0); 6578 ASSERT(len >= 0);
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after
7324 } 7325 }
7325 return result.raw(); 7326 return result.raw();
7326 } 7327 }
7327 7328
7328 7329
7329 const char* FourByteString::ToCString() const { 7330 const char* FourByteString::ToCString() const {
7330 return String::ToCString(); 7331 return String::ToCString();
7331 } 7332 }
7332 7333
7333 7334
7334 RawExternalOneByteString* ExternalOneByteString::New(const uint8_t* data, 7335 static void AddFinalizer(const Object& referent,
7335 intptr_t len, 7336 void* peer,
7336 void* peer, 7337 Dart_WeakPersistentHandleFinalizer callback) {
7337 PeerFinalizer callback, 7338 ASSERT(callback != NULL);
7338 Heap::Space space) { 7339 ApiState* state = Isolate::Current()->api_state();
7340 ASSERT(state != NULL);
7341 WeakPersistentHandle* weak_ref =
7342 state->weak_persistent_handles().AllocateHandle();
7343 weak_ref->set_raw(referent);
7344 weak_ref->set_peer(peer);
7345 weak_ref->set_callback(callback);
7346 }
7347
7348
7349 RawExternalOneByteString* ExternalOneByteString::New(
7350 const uint8_t* data,
7351 intptr_t len,
7352 void* peer,
7353 Dart_PeerFinalizer callback,
7354 Heap::Space space) {
7339 Isolate* isolate = Isolate::Current(); 7355 Isolate* isolate = Isolate::Current();
7340 7356
7341 const Class& cls = 7357 const Class& cls =
7342 Class::Handle(isolate->object_store()->external_one_byte_string_class()); 7358 Class::Handle(isolate->object_store()->external_one_byte_string_class());
7343 ExternalOneByteString& result = ExternalOneByteString::Handle(); 7359 ExternalOneByteString& result = ExternalOneByteString::Handle();
7360 ExternalStringData<uint8_t>* external_data =
7361 new ExternalStringData<uint8_t>(data, peer, callback);
7344 { 7362 {
7345 ExternalStringData<uint8_t>* external_data =
7346 new ExternalStringData<uint8_t>(data, peer, callback);
7347 RawObject* raw = Object::Allocate(cls, 7363 RawObject* raw = Object::Allocate(cls,
7348 ExternalOneByteString::InstanceSize(), 7364 ExternalOneByteString::InstanceSize(),
7349 space); 7365 space);
7350 NoGCScope no_gc; 7366 NoGCScope no_gc;
7351 result ^= raw; 7367 result ^= raw;
7352 result.SetLength(len); 7368 result.SetLength(len);
7353 result.SetHash(0); 7369 result.SetHash(0);
7354 result.SetExternalData(external_data); 7370 result.SetExternalData(external_data);
7355 } 7371 }
7372 AddFinalizer(result, external_data, ExternalOneByteString::Finalize);
7356 return result.raw(); 7373 return result.raw();
7357 } 7374 }
7358 7375
7359 7376
7377 static void DeleteWeakPersistentHandle(Dart_Handle handle) {
7378 ApiState* state = Isolate::Current()->api_state();
7379 ASSERT(state != NULL);
7380 WeakPersistentHandle* weak_ref =
7381 reinterpret_cast<WeakPersistentHandle*>(handle);
7382 ASSERT(state->IsValidWeakPersistentHandle(handle));
7383 state->weak_persistent_handles().FreeHandle(weak_ref);
7384 }
7385
7386
7387 void ExternalOneByteString::Finalize(Dart_Handle handle, void* peer) {
7388 delete reinterpret_cast<ExternalStringData<uint8_t>*>(peer);
7389 DeleteWeakPersistentHandle(handle);
7390 }
7391
7392
7360 const char* ExternalOneByteString::ToCString() const { 7393 const char* ExternalOneByteString::ToCString() const {
7361 return String::ToCString(); 7394 return String::ToCString();
7362 } 7395 }
7363 7396
7364 7397
7365 RawExternalTwoByteString* ExternalTwoByteString::New(const uint16_t* data, 7398 RawExternalTwoByteString* ExternalTwoByteString::New(
7366 intptr_t len, 7399 const uint16_t* data,
7367 void* peer, 7400 intptr_t len,
7368 PeerFinalizer callback, 7401 void* peer,
7369 Heap::Space space) { 7402 Dart_PeerFinalizer callback,
7403 Heap::Space space) {
7370 Isolate* isolate = Isolate::Current(); 7404 Isolate* isolate = Isolate::Current();
7371 7405
7372 const Class& cls = 7406 const Class& cls =
7373 Class::Handle(isolate->object_store()->external_two_byte_string_class()); 7407 Class::Handle(isolate->object_store()->external_two_byte_string_class());
7374 ExternalTwoByteString& result = ExternalTwoByteString::Handle(); 7408 ExternalTwoByteString& result = ExternalTwoByteString::Handle();
7409 ExternalStringData<uint16_t>* external_data =
7410 new ExternalStringData<uint16_t>(data, peer, callback);
7375 { 7411 {
7376 ExternalStringData<uint16_t>* external_data =
7377 new ExternalStringData<uint16_t>(data, peer, callback);
7378 RawObject* raw = Object::Allocate(cls, 7412 RawObject* raw = Object::Allocate(cls,
7379 ExternalTwoByteString::InstanceSize(), 7413 ExternalTwoByteString::InstanceSize(),
7380 space); 7414 space);
7381 NoGCScope no_gc; 7415 NoGCScope no_gc;
7382 result ^= raw; 7416 result ^= raw;
7383 result.SetLength(len); 7417 result.SetLength(len);
7384 result.SetHash(0); 7418 result.SetHash(0);
7385 result.SetExternalData(external_data); 7419 result.SetExternalData(external_data);
7386 } 7420 }
7421 AddFinalizer(result, external_data, ExternalTwoByteString::Finalize);
7387 return result.raw(); 7422 return result.raw();
7388 } 7423 }
7389 7424
7390 7425
7426 void ExternalTwoByteString::Finalize(Dart_Handle handle, void* peer) {
7427 delete reinterpret_cast<ExternalStringData<uint16_t>*>(peer);
7428 DeleteWeakPersistentHandle(handle);
7429 }
7430
7431
7391 const char* ExternalTwoByteString::ToCString() const { 7432 const char* ExternalTwoByteString::ToCString() const {
7392 return String::ToCString(); 7433 return String::ToCString();
7393 } 7434 }
7394 7435
7395 7436
7396 RawExternalFourByteString* ExternalFourByteString::New(const uint32_t* data, 7437 RawExternalFourByteString* ExternalFourByteString::New(
7397 intptr_t len, 7438 const uint32_t* data,
7398 void* peer, 7439 intptr_t len,
7399 PeerFinalizer callback, 7440 void* peer,
7400 Heap::Space space) { 7441 Dart_PeerFinalizer callback,
7442 Heap::Space space) {
7401 Isolate* isolate = Isolate::Current(); 7443 Isolate* isolate = Isolate::Current();
7402 7444
7403 const Class& cls = 7445 const Class& cls =
7404 Class::Handle(isolate->object_store()->external_four_byte_string_class()); 7446 Class::Handle(isolate->object_store()->external_four_byte_string_class());
7405 ExternalFourByteString& result = ExternalFourByteString::Handle(); 7447 ExternalFourByteString& result = ExternalFourByteString::Handle();
7448 ExternalStringData<uint32_t>* external_data =
7449 new ExternalStringData<uint32_t>(data, peer, callback);
7406 { 7450 {
7407 ExternalStringData<uint32_t>* external_data =
7408 new ExternalStringData<uint32_t>(data, peer, callback);
7409 RawObject* raw = Object::Allocate(cls, 7451 RawObject* raw = Object::Allocate(cls,
7410 ExternalFourByteString::InstanceSize(), 7452 ExternalFourByteString::InstanceSize(),
7411 space); 7453 space);
7412 NoGCScope no_gc; 7454 NoGCScope no_gc;
7413 result ^= raw; 7455 result ^= raw;
7414 result.SetLength(len); 7456 result.SetLength(len);
7415 result.SetHash(0); 7457 result.SetHash(0);
7416 result.SetExternalData(external_data); 7458 result.SetExternalData(external_data);
7417 } 7459 }
7460 AddFinalizer(result, external_data, ExternalFourByteString::Finalize);
7418 return result.raw(); 7461 return result.raw();
7419 } 7462 }
7420 7463
7421 7464
7465 void ExternalFourByteString::Finalize(Dart_Handle handle, void* peer) {
7466 delete reinterpret_cast<ExternalStringData<uint32_t>*>(peer);
7467 DeleteWeakPersistentHandle(handle);
7468 }
7469
7470
7422 const char* ExternalFourByteString::ToCString() const { 7471 const char* ExternalFourByteString::ToCString() const {
7423 return String::ToCString(); 7472 return String::ToCString();
7424 } 7473 }
7425 7474
7426 7475
7427 RawBool* Bool::True() { 7476 RawBool* Bool::True() {
7428 return Isolate::Current()->object_store()->true_value(); 7477 return Isolate::Current()->object_store()->true_value();
7429 } 7478 }
7430 7479
7431 7480
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
7652 } 7701 }
7653 return result.raw(); 7702 return result.raw();
7654 } 7703 }
7655 7704
7656 7705
7657 const char* InternalByteArray::ToCString() const { 7706 const char* InternalByteArray::ToCString() const {
7658 return "_InternalByteArray"; 7707 return "_InternalByteArray";
7659 } 7708 }
7660 7709
7661 7710
7711 void ExternalByteArray::Finalize(Dart_Handle handle, void* peer) {
7712 delete reinterpret_cast<ExternalByteArrayData*>(peer);
7713 DeleteWeakPersistentHandle(handle);
7714 }
7715
7716
7662 RawExternalByteArray* ExternalByteArray::New(uint8_t* data, 7717 RawExternalByteArray* ExternalByteArray::New(uint8_t* data,
7663 intptr_t len, 7718 intptr_t len,
7719 void* peer,
7720 Dart_PeerFinalizer callback,
7664 Heap::Space space) { 7721 Heap::Space space) {
7665 Isolate* isolate = Isolate::Current(); 7722 Isolate* isolate = Isolate::Current();
7666 const Class& external_byte_array_class = 7723 const Class& external_byte_array_class =
7667 Class::Handle(isolate->object_store()->external_byte_array_class()); 7724 Class::Handle(isolate->object_store()->external_byte_array_class());
7668 ExternalByteArray& result = ExternalByteArray::Handle(); 7725 ExternalByteArray& result = ExternalByteArray::Handle();
7726 ExternalByteArrayData* external_data =
7727 new ExternalByteArrayData(data, peer, callback);
7669 { 7728 {
7670 RawObject* raw = Object::Allocate(external_byte_array_class, 7729 RawObject* raw = Object::Allocate(external_byte_array_class,
7671 ExternalByteArray::InstanceSize(), 7730 ExternalByteArray::InstanceSize(),
7672 space); 7731 space);
7673 NoGCScope no_gc; 7732 NoGCScope no_gc;
7674 result ^= raw; 7733 result ^= raw;
7675 result.SetLength(len); 7734 result.SetLength(len);
7676 result.SetData(data); 7735 result.SetExternalData(external_data);
7677 } 7736 }
7737 AddFinalizer(result, external_data, ExternalByteArray::Finalize);
7678 return result.raw(); 7738 return result.raw();
7679 } 7739 }
7680 7740
7681 7741
7682 const char* ExternalByteArray::ToCString() const { 7742 const char* ExternalByteArray::ToCString() const {
7683 return "_ExternalByteArray"; 7743 return "_ExternalByteArray";
7684 } 7744 }
7685 7745
7686 7746
7687 RawClosure* Closure::New(const Function& function, 7747 RawClosure* Closure::New(const Function& function,
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
7986 const String& str = String::Handle(pattern()); 8046 const String& str = String::Handle(pattern());
7987 const char* format = "JSRegExp: pattern=%s flags=%s"; 8047 const char* format = "JSRegExp: pattern=%s flags=%s";
7988 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 8048 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
7989 char* chars = reinterpret_cast<char*>( 8049 char* chars = reinterpret_cast<char*>(
7990 Isolate::Current()->current_zone()->Allocate(len + 1)); 8050 Isolate::Current()->current_zone()->Allocate(len + 1));
7991 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 8051 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
7992 return chars; 8052 return chars;
7993 } 8053 }
7994 8054
7995 } // namespace dart 8055 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698