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

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

Issue 9655011: Implement prologue weak persistent handles. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: final revision Created 8 years, 9 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/dart_api_impl.h ('k') | runtime/vm/dart_api_impl_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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart.h" 10 #include "vm/dart.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 ref->set_raw(object); 99 ref->set_raw(object);
100 return reinterpret_cast<Dart_Handle>(ref); 100 return reinterpret_cast<Dart_Handle>(ref);
101 } 101 }
102 102
103 RawObject* Api::UnwrapHandle(Dart_Handle object) { 103 RawObject* Api::UnwrapHandle(Dart_Handle object) {
104 #ifdef DEBUG 104 #ifdef DEBUG
105 Isolate* isolate = Isolate::Current(); 105 Isolate* isolate = Isolate::Current();
106 ASSERT(isolate != NULL); 106 ASSERT(isolate != NULL);
107 ApiState* state = isolate->api_state(); 107 ApiState* state = isolate->api_state();
108 ASSERT(state != NULL); 108 ASSERT(state != NULL);
109 ASSERT(state->IsValidWeakPersistentHandle(object) || 109 ASSERT(state->IsValidPrologueWeakPersistentHandle(object) ||
110 state->IsValidWeakPersistentHandle(object) ||
110 state->IsValidPersistentHandle(object) || 111 state->IsValidPersistentHandle(object) ||
111 state->IsValidLocalHandle(object)); 112 state->IsValidLocalHandle(object));
112 ASSERT(WeakPersistentHandle::raw_offset() == 0 && 113 ASSERT(FinalizablePersistentHandle::raw_offset() == 0 &&
113 PersistentHandle::raw_offset() == 0 && 114 PersistentHandle::raw_offset() == 0 &&
114 LocalHandle::raw_offset() == 0); 115 LocalHandle::raw_offset() == 0);
115 #endif 116 #endif
116 return *(reinterpret_cast<RawObject**>(object)); 117 return *(reinterpret_cast<RawObject**>(object));
117 } 118 }
118 119
119 #define DEFINE_UNWRAP(Type) \ 120 #define DEFINE_UNWRAP(Type) \
120 const Type& Api::Unwrap##Type##Handle(Dart_Handle dart_handle) { \ 121 const Type& Api::Unwrap##Type##Handle(Dart_Handle dart_handle) { \
121 const Object& tmp = Object::Handle(Api::UnwrapHandle(dart_handle)); \ 122 const Object& tmp = Object::Handle(Api::UnwrapHandle(dart_handle)); \
122 Type& typed_handle = Type::Handle(); \ 123 Type& typed_handle = Type::Handle(); \
(...skipping 13 matching lines...) Expand all
136 } 137 }
137 138
138 139
139 PersistentHandle* Api::UnwrapAsPersistentHandle(const ApiState& state, 140 PersistentHandle* Api::UnwrapAsPersistentHandle(const ApiState& state,
140 Dart_Handle object) { 141 Dart_Handle object) {
141 ASSERT(state.IsValidPersistentHandle(object)); 142 ASSERT(state.IsValidPersistentHandle(object));
142 return reinterpret_cast<PersistentHandle*>(object); 143 return reinterpret_cast<PersistentHandle*>(object);
143 } 144 }
144 145
145 146
146 WeakPersistentHandle* Api::UnwrapAsWeakPersistentHandle(const ApiState& state, 147 FinalizablePersistentHandle* Api::UnwrapAsWeakPersistentHandle(
147 Dart_Handle object) { 148 const ApiState& state,
149 Dart_Handle object) {
148 ASSERT(state.IsValidWeakPersistentHandle(object)); 150 ASSERT(state.IsValidWeakPersistentHandle(object));
149 return reinterpret_cast<WeakPersistentHandle*>(object); 151 return reinterpret_cast<FinalizablePersistentHandle*>(object);
150 } 152 }
151 153
152 154
155 FinalizablePersistentHandle* Api::UnwrapAsPrologueWeakPersistentHandle(
156 const ApiState& state,
157 Dart_Handle object) {
158 ASSERT(state.IsValidPrologueWeakPersistentHandle(object));
159 return reinterpret_cast<FinalizablePersistentHandle*>(object);
160 }
161
162
153 Dart_Isolate Api::CastIsolate(Isolate* isolate) { 163 Dart_Isolate Api::CastIsolate(Isolate* isolate) {
154 return reinterpret_cast<Dart_Isolate>(isolate); 164 return reinterpret_cast<Dart_Isolate>(isolate);
155 } 165 }
156 166
157 167
158 Dart_Handle Api::Success() { 168 Dart_Handle Api::Success() {
159 Isolate* isolate = Isolate::Current(); 169 Isolate* isolate = Isolate::Current();
160 ASSERT(isolate != NULL); 170 ASSERT(isolate != NULL);
161 ApiState* state = isolate->api_state(); 171 ApiState* state = isolate->api_state();
162 ASSERT(state != NULL); 172 ASSERT(state != NULL);
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 CHECK_ISOLATE(isolate); 412 CHECK_ISOLATE(isolate);
403 DARTSCOPE_NOCHECKS(isolate); 413 DARTSCOPE_NOCHECKS(isolate);
404 ApiState* state = isolate->api_state(); 414 ApiState* state = isolate->api_state();
405 ASSERT(state != NULL); 415 ASSERT(state != NULL);
406 const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); 416 const Object& old_ref = Object::Handle(Api::UnwrapHandle(object));
407 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); 417 PersistentHandle* new_ref = state->persistent_handles().AllocateHandle();
408 new_ref->set_raw(old_ref); 418 new_ref->set_raw(old_ref);
409 return reinterpret_cast<Dart_Handle>(new_ref); 419 return reinterpret_cast<Dart_Handle>(new_ref);
410 } 420 }
411 421
422 static Dart_Handle AllocateFinalizableHandle(
423 FinalizablePersistentHandles* handles,
424 Dart_Handle object,
425 void* peer,
426 Dart_WeakPersistentHandleFinalizer callback) {
427 const Object& ref = Object::Handle(Api::UnwrapHandle(object));
428 FinalizablePersistentHandle* finalizable_ref = handles->AllocateHandle();
429 finalizable_ref->set_raw(ref);
430 finalizable_ref->set_peer(peer);
431 finalizable_ref->set_callback(callback);
432 return reinterpret_cast<Dart_Handle>(finalizable_ref);
433 }
434
412 435
413 DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( 436 DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle(
414 Dart_Handle object, 437 Dart_Handle object,
415 void* peer, 438 void* peer,
416 Dart_WeakPersistentHandleFinalizer callback) { 439 Dart_WeakPersistentHandleFinalizer callback) {
417 Isolate* isolate = Isolate::Current(); 440 Isolate* isolate = Isolate::Current();
418 CHECK_ISOLATE(isolate); 441 CHECK_ISOLATE(isolate);
419 DARTSCOPE_NOCHECKS(isolate); 442 DARTSCOPE_NOCHECKS(isolate);
420 ApiState* state = isolate->api_state(); 443 ApiState* state = isolate->api_state();
421 ASSERT(state != NULL); 444 ASSERT(state != NULL);
422 const Object& ref = Object::Handle(Api::UnwrapHandle(object)); 445 return AllocateFinalizableHandle(&state->weak_persistent_handles(),
423 WeakPersistentHandle* weak_ref = 446 object,
424 state->weak_persistent_handles().AllocateHandle(); 447 peer,
425 weak_ref->set_raw(ref); 448 callback);
426 weak_ref->set_peer(peer);
427 weak_ref->set_callback(callback);
428 return reinterpret_cast<Dart_Handle>(weak_ref);
429 } 449 }
430 450
431 451
452 DART_EXPORT Dart_Handle Dart_NewPrologueWeakPersistentHandle(
453 Dart_Handle object,
454 void* peer,
455 Dart_WeakPersistentHandleFinalizer callback) {
456 Isolate* isolate = Isolate::Current();
457 CHECK_ISOLATE(isolate);
458 DARTSCOPE_NOCHECKS(isolate);
459 ApiState* state = isolate->api_state();
460 ASSERT(state != NULL);
461 return AllocateFinalizableHandle(&state->prologue_weak_persistent_handles(),
462 object,
463 peer,
464 callback);
465 }
466
467
432 DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) { 468 DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) {
433 Isolate* isolate = Isolate::Current(); 469 Isolate* isolate = Isolate::Current();
434 CHECK_ISOLATE(isolate); 470 CHECK_ISOLATE(isolate);
435 ApiState* state = isolate->api_state(); 471 ApiState* state = isolate->api_state();
436 ASSERT(state != NULL); 472 ASSERT(state != NULL);
473 if (state->IsValidPrologueWeakPersistentHandle(object)) {
474 FinalizablePersistentHandle* prologue_weak_ref =
475 Api::UnwrapAsPrologueWeakPersistentHandle(*state, object);
476 state->prologue_weak_persistent_handles().FreeHandle(prologue_weak_ref);
477 return;
478 }
437 if (state->IsValidWeakPersistentHandle(object)) { 479 if (state->IsValidWeakPersistentHandle(object)) {
438 WeakPersistentHandle* weak_ref = 480 FinalizablePersistentHandle* weak_ref =
439 Api::UnwrapAsWeakPersistentHandle(*state, object); 481 Api::UnwrapAsWeakPersistentHandle(*state, object);
440 state->weak_persistent_handles().FreeHandle(weak_ref); 482 state->weak_persistent_handles().FreeHandle(weak_ref);
441 } else { 483 return;
442 PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); 484 }
443 ASSERT(!state->IsProtectedHandle(ref)); 485 PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object);
444 if (!state->IsProtectedHandle(ref)) { 486 ASSERT(!state->IsProtectedHandle(ref));
445 state->persistent_handles().FreeHandle(ref); 487 if (!state->IsProtectedHandle(ref)) {
446 } 488 state->persistent_handles().FreeHandle(ref);
447 } 489 }
448 } 490 }
449 491
450 492
451 DART_EXPORT bool Dart_IsWeakPersistentHandle(Dart_Handle object) { 493 DART_EXPORT bool Dart_IsWeakPersistentHandle(Dart_Handle object) {
452 Isolate* isolate = Isolate::Current(); 494 Isolate* isolate = Isolate::Current();
453 CHECK_ISOLATE(isolate); 495 CHECK_ISOLATE(isolate);
454 ApiState* state = isolate->api_state(); 496 ApiState* state = isolate->api_state();
455 ASSERT(state != NULL); 497 ASSERT(state != NULL);
456 return state->IsValidWeakPersistentHandle(object); 498 return state->IsValidWeakPersistentHandle(object);
457 } 499 }
458 500
459 501
502 DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(Dart_Handle object) {
503 Isolate* isolate = Isolate::Current();
504 CHECK_ISOLATE(isolate);
505 ApiState* state = isolate->api_state();
506 ASSERT(state != NULL);
507 return state->IsValidPrologueWeakPersistentHandle(object);
508 }
509
510
460 DART_EXPORT Dart_Handle Dart_NewWeakReferenceSet(Dart_Handle* keys, 511 DART_EXPORT Dart_Handle Dart_NewWeakReferenceSet(Dart_Handle* keys,
461 intptr_t num_keys, 512 intptr_t num_keys,
462 Dart_Handle* values, 513 Dart_Handle* values,
463 intptr_t num_values) { 514 intptr_t num_values) {
464 Isolate* isolate = Isolate::Current(); 515 Isolate* isolate = Isolate::Current();
465 CHECK_ISOLATE(isolate); 516 CHECK_ISOLATE(isolate);
466 ApiState* state = isolate->api_state(); 517 ApiState* state = isolate->api_state();
467 ASSERT(state != NULL); 518 ASSERT(state != NULL);
468 if (keys == NULL) { 519 if (keys == NULL) {
469 return Api::NewError("%s expects argument 'keys' to be non-null.", 520 return Api::NewError("%s expects argument 'keys' to be non-null.",
(...skipping 2724 matching lines...) Expand 10 before | Expand all | Expand 10 after
3194 *buffer = NULL; 3245 *buffer = NULL;
3195 } 3246 }
3196 delete debug_region; 3247 delete debug_region;
3197 } else { 3248 } else {
3198 *buffer = NULL; 3249 *buffer = NULL;
3199 *buffer_size = 0; 3250 *buffer_size = 0;
3200 } 3251 }
3201 } 3252 }
3202 3253
3203 } // namespace dart 3254 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.h ('k') | runtime/vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698