Index: runtime/vm/dart_api_impl.cc |
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
index 3a6f0aedd7af6421757bca0fe544bb6340e9e548..4d6140c65b69bf92479e6e8979a3a1a4303c3ad4 100644 |
--- a/runtime/vm/dart_api_impl.cc |
+++ b/runtime/vm/dart_api_impl.cc |
@@ -155,9 +155,11 @@ RawObject* Api::UnwrapHandle(Dart_Handle object) { |
ASSERT(isolate != NULL); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
- ASSERT(state->IsValidPersistentHandle(object) || |
+ ASSERT(state->IsValidWeakPersistentHandle(object) || |
+ state->IsValidPersistentHandle(object) || |
state->IsValidLocalHandle(object)); |
- ASSERT(PersistentHandle::raw_offset() == 0 && |
+ ASSERT(WeakPersistentHandle::raw_offset() == 0 && |
+ PersistentHandle::raw_offset() == 0 && |
LocalHandle::raw_offset() == 0); |
#endif |
return *(reinterpret_cast<RawObject**>(object)); |
@@ -190,6 +192,13 @@ PersistentHandle* Api::UnwrapAsPersistentHandle(const ApiState& state, |
} |
+WeakPersistentHandle* Api::UnwrapAsWeakPersistentHandle(const ApiState& state, |
+ Dart_Handle object) { |
+ ASSERT(state.IsValidWeakPersistentHandle(object)); |
+ return reinterpret_cast<WeakPersistentHandle*>(object); |
+} |
+ |
+ |
Dart_Isolate Api::CastIsolate(Isolate* isolate) { |
return reinterpret_cast<Dart_Isolate>(isolate); |
} |
@@ -457,7 +466,7 @@ DART_EXPORT Dart_Handle Dart_IsSame(Dart_Handle obj1, Dart_Handle obj2, |
} |
-static PersistentHandle* AllocatePersistentHandle(Dart_Handle object) { |
+DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { |
Isolate* isolate = Isolate::Current(); |
CHECK_ISOLATE(isolate); |
DARTSCOPE_NOCHECKS(isolate); |
@@ -466,12 +475,6 @@ static PersistentHandle* AllocatePersistentHandle(Dart_Handle object) { |
const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); |
PersistentHandle* new_ref = state->persistent_handles().AllocateHandle(); |
new_ref->set_raw(old_ref); |
- return new_ref; |
-} |
- |
- |
-DART_EXPORT Dart_Handle Dart_NewPersistentHandle(Dart_Handle object) { |
- PersistentHandle* new_ref = AllocatePersistentHandle(object); |
return reinterpret_cast<Dart_Handle>(new_ref); |
} |
@@ -480,8 +483,15 @@ DART_EXPORT Dart_Handle Dart_NewWeakPersistentHandle( |
Dart_Handle object, |
void* peer, |
Dart_PeerFinalizer callback) { |
- PersistentHandle* new_ref = AllocatePersistentHandle(object); |
- new_ref->set_kind(PersistentHandle::WeakReference); |
+ Isolate* isolate = Isolate::Current(); |
+ CHECK_ISOLATE(isolate); |
+ DARTSCOPE_NOCHECKS(isolate); |
+ ApiState* state = isolate->api_state(); |
+ ASSERT(state != NULL); |
+ const Object& old_ref = Object::Handle(Api::UnwrapHandle(object)); |
+ WeakPersistentHandle* new_ref = |
+ state->weak_persistent_handles().AllocateHandle(); |
+ new_ref->set_raw(old_ref); |
new_ref->set_peer(peer); |
new_ref->set_callback(callback); |
return reinterpret_cast<Dart_Handle>(new_ref); |
@@ -493,10 +503,16 @@ DART_EXPORT void Dart_DeletePersistentHandle(Dart_Handle object) { |
CHECK_ISOLATE(isolate); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
- PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); |
- ASSERT(!ref->IsProtected()); |
- if (!ref->IsProtected()) { |
- state->persistent_handles().FreeHandle(ref); |
+ if (state->IsValidWeakPersistentHandle(object)) { |
+ WeakPersistentHandle* 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); |
+ } |
} |
} |
@@ -506,11 +522,7 @@ DART_EXPORT bool Dart_IsWeakPersistentHandle(Dart_Handle object) { |
CHECK_ISOLATE(isolate); |
ApiState* state = isolate->api_state(); |
ASSERT(state != NULL); |
- if (state->IsValidPersistentHandle(object)) { |
- PersistentHandle* ref = Api::UnwrapAsPersistentHandle(*state, object); |
- return ref->kind() == PersistentHandle::WeakReference; |
- } |
- return false; |
+ return state->IsValidWeakPersistentHandle(object); |
} |