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

Unified 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: minor pre-review changes 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 side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698