Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
| index d9d3aef5a9368452595a07aa84e4ac4af0fd3e76..a315837b58ffd9523dce2d087a46a9bafe6b8ec4 100644 |
| --- a/runtime/vm/dart_api_impl.cc |
| +++ b/runtime/vm/dart_api_impl.cc |
| @@ -106,10 +106,11 @@ RawObject* Api::UnwrapHandle(Dart_Handle object) { |
| ASSERT(isolate != NULL); |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| - ASSERT(state->IsValidWeakPersistentHandle(object) || |
| + ASSERT(state->IsValidPrologueWeakPersistentHandle(object) || |
| + state->IsValidWeakPersistentHandle(object) || |
| state->IsValidPersistentHandle(object) || |
| state->IsValidLocalHandle(object)); |
| - ASSERT(WeakPersistentHandle::raw_offset() == 0 && |
| + ASSERT(FinalizablePersistentHandle::raw_offset() == 0 && |
| PersistentHandle::raw_offset() == 0 && |
| LocalHandle::raw_offset() == 0); |
| #endif |
| @@ -143,10 +144,19 @@ PersistentHandle* Api::UnwrapAsPersistentHandle(const ApiState& state, |
| } |
| -WeakPersistentHandle* Api::UnwrapAsWeakPersistentHandle(const ApiState& state, |
| - Dart_Handle object) { |
| +FinalizablePersistentHandle* Api::UnwrapAsWeakPersistentHandle( |
| + const ApiState& state, |
| + Dart_Handle object) { |
| ASSERT(state.IsValidWeakPersistentHandle(object)); |
| - return reinterpret_cast<WeakPersistentHandle*>(object); |
| + return reinterpret_cast<FinalizablePersistentHandle*>(object); |
| +} |
| + |
| + |
| +FinalizablePersistentHandle* Api::UnwrapAsPrologueWeakPersistentHandle( |
| + const ApiState& state, |
| + Dart_Handle object) { |
| + ASSERT(state.IsValidPrologueWeakPersistentHandle(object)); |
| + return reinterpret_cast<FinalizablePersistentHandle*>(object); |
| } |
| @@ -420,7 +430,7 @@ DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| const Object& ref = Object::Handle(Api::UnwrapHandle(object)); |
| - WeakPersistentHandle* weak_ref = |
| + FinalizablePersistentHandle* weak_ref = |
| state->weak_persistent_handles().AllocateHandle(); |
| weak_ref->set_raw(ref); |
| weak_ref->set_peer(peer); |
| @@ -429,21 +439,46 @@ DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( |
| } |
| +DART_EXPORT Dart_Handle Dart_NewPrologueWeakPersistentHandle( |
| + Dart_Handle object, |
| + void* peer, |
| + Dart_WeakPersistentHandleFinalizer callback) { |
| + Isolate* isolate = Isolate::Current(); |
| + CHECK_ISOLATE(isolate); |
| + DARTSCOPE_NOCHECKS(isolate); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| + const Object& ref = Object::Handle(Api::UnwrapHandle(object)); |
| + FinalizablePersistentHandle* prologue_weak_ref = |
| + state->prologue_weak_persistent_handles().AllocateHandle(); |
| + prologue_weak_ref->set_raw(ref); |
| + prologue_weak_ref->set_peer(peer); |
| + prologue_weak_ref->set_callback(callback); |
| + return reinterpret_cast<Dart_Handle>(prologue_weak_ref); |
|
siva
2012/03/09 21:48:41
This seems identical to Dart_NewWeakPersistentHand
cshapiro
2012/03/13 23:06:43
Yes, it is pretty close. I have factored out the
|
| +} |
| + |
| + |
| DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) { |
| Isolate* isolate = Isolate::Current(); |
| CHECK_ISOLATE(isolate); |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| + if (state->IsValidPrologueWeakPersistentHandle(object)) { |
| + FinalizablePersistentHandle* prologue_weak_ref = |
| + Api::UnwrapAsPrologueWeakPersistentHandle(*state, object); |
| + state->prologue_weak_persistent_handles().FreeHandle(prologue_weak_ref); |
| + return; |
| + } |
| if (state->IsValidWeakPersistentHandle(object)) { |
| - WeakPersistentHandle* weak_ref = |
| + FinalizablePersistentHandle* weak_ref = |
| Api::UnwrapAsWeakPersistentHandle(*state, object); |
| state->weak_persistent_handles().FreeHandle(weak_ref); |
| - } else { |
| - PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); |
| - ASSERT(!state->IsProtectedHandle(ref)); |
| - if (!state->IsProtectedHandle(ref)) { |
| - state->persistent_handles().FreeHandle(ref); |
| - } |
| + return; |
| + } |
| + PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); |
| + ASSERT(!state->IsProtectedHandle(ref)); |
| + if (!state->IsProtectedHandle(ref)) { |
| + state->persistent_handles().FreeHandle(ref); |
| } |
| } |
| @@ -457,6 +492,15 @@ DART_EXPORT bool Dart_IsWeakPersistentHandle(Dart_Handle object) { |
| } |
| +DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(Dart_Handle object) { |
| + Isolate* isolate = Isolate::Current(); |
| + CHECK_ISOLATE(isolate); |
| + ApiState* state = isolate->api_state(); |
| + ASSERT(state != NULL); |
| + return state->IsValidPrologueWeakPersistentHandle(object); |
| +} |
| + |
| + |
| DART_EXPORT Dart_Handle Dart_NewWeakReferenceSet(Dart_Handle* keys, |
| intptr_t num_keys, |
| Dart_Handle* values, |