Index: runtime/vm/dart_api_impl.cc |
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
index 000de16b4ce87f3ad9ae0d0bce6a68906f19c131..e72ca2f1411b101949a291d99fd6e17156d6f3c7 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); |
} |
@@ -409,6 +419,19 @@ DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { |
return reinterpret_cast<Dart_Handle>(new_ref); |
} |
+static Dart_Handle AllocateFinalizableHandle( |
+ FinalizablePersistentHandles* handles, |
+ Dart_Handle object, |
+ void* peer, |
+ Dart_WeakPersistentHandleFinalizer callback) { |
+ const Object& ref = Object::Handle(Api::UnwrapHandle(object)); |
+ FinalizablePersistentHandle* finalizable_ref = handles->AllocateHandle(); |
+ finalizable_ref->set_raw(ref); |
+ finalizable_ref->set_peer(peer); |
+ finalizable_ref->set_callback(callback); |
+ return reinterpret_cast<Dart_Handle>(finalizable_ref); |
+} |
+ |
DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( |
Dart_Handle object, |
@@ -419,13 +442,26 @@ DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( |
DARTSCOPE_NOCHECKS(isolate); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
- const Object& ref = Object::Handle(Api::UnwrapHandle(object)); |
- WeakPersistentHandle* weak_ref = |
- state->weak_persistent_handles().AllocateHandle(); |
- weak_ref->set_raw(ref); |
- weak_ref->set_peer(peer); |
- weak_ref->set_callback(callback); |
- return reinterpret_cast<Dart_Handle>(weak_ref); |
+ return AllocateFinalizableHandle(&state->weak_persistent_handles(), |
+ object, |
+ peer, |
+ callback); |
+} |
+ |
+ |
+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); |
+ return AllocateFinalizableHandle(&state->prologue_weak_persistent_handles(), |
+ object, |
+ peer, |
+ callback); |
} |
@@ -434,16 +470,22 @@ DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) { |
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 +499,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, |