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

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 177093010: Use a tag bit for indicating prologue weak persistent handles, this avoids (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 10 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
===================================================================
--- runtime/vm/dart_api_impl.cc (revision 33182)
+++ runtime/vm/dart_api_impl.cc (working copy)
@@ -166,18 +166,10 @@
ASSERT(Isolate::Current()->api_state()->IsValidWeakPersistentHandle(object) ||
Isolate::Current()->api_state()->
IsValidPrologueWeakPersistentHandle(object));
- return reinterpret_cast<FinalizablePersistentHandle*>(object);
+ return FinalizablePersistentHandle::AsFinalizablePersistentHandle(object);
}
-FinalizablePersistentHandle* Api::UnwrapAsPrologueWeakPersistentHandle(
- Dart_WeakPersistentHandle object) {
- ASSERT(Isolate::Current()->api_state()->IsValidPrologueWeakPersistentHandle(
- object));
- return reinterpret_cast<FinalizablePersistentHandle*>(object);
-}
-
-
Dart_Handle Api::CheckIsolateState(Isolate* isolate) {
if (!isolate->AllowClassFinalization()) {
// Class finalization is blocked for the isolate. Do nothing.
@@ -568,9 +560,8 @@
CHECK_ISOLATE(isolate);
ApiState* state = isolate->api_state();
ASSERT(state != NULL);
- ASSERT(state->IsValidPersistentHandle(object));
- return Api::NewHandle(isolate,
- reinterpret_cast<PersistentHandle*>(object)->raw());
+ PersistentHandle* ref = Api::UnwrapAsPersistentHandle(object);
+ return Api::NewHandle(isolate, ref->raw());
}
@@ -580,10 +571,9 @@
CHECK_ISOLATE(isolate);
ApiState* state = isolate->api_state();
ASSERT(state != NULL);
- ASSERT(state->IsValidWeakPersistentHandle(object) ||
- state->IsValidPrologueWeakPersistentHandle(object));
- return Api::NewHandle(
- isolate, reinterpret_cast<FinalizablePersistentHandle*>(object)->raw());
+ FinalizablePersistentHandle* weak_ref =
+ Api::UnwrapAsWeakPersistentHandle(object);
+ return Api::NewHandle(isolate, weak_ref->raw());
}
@@ -616,6 +606,7 @@
Isolate* isolate,
FinalizablePersistentHandles* handles,
Dart_Handle object,
+ bool is_prologue,
void* peer,
Dart_WeakPersistentHandleFinalizer callback) {
ReusableObjectHandleScope reused_obj_handle(isolate);
@@ -625,7 +616,13 @@
finalizable_ref->set_raw(ref);
finalizable_ref->set_peer(peer);
finalizable_ref->set_callback(callback);
- return reinterpret_cast<Dart_WeakPersistentHandle>(finalizable_ref);
+ if (is_prologue) {
+ return FinalizablePersistentHandle::
+ AsDartPrologueWeakPersistentHandle(finalizable_ref);
+ } else {
+ return FinalizablePersistentHandle::
+ AsDartWeakPersistentHandle(finalizable_ref);
+ }
}
@@ -640,6 +637,7 @@
return AllocateFinalizableHandle(isolate,
&state->weak_persistent_handles(),
object,
+ false,
peer,
callback);
}
@@ -656,6 +654,7 @@
return AllocateFinalizableHandle(isolate,
&state->prologue_weak_persistent_handles(),
object,
+ true,
peer,
callback);
}
@@ -680,26 +679,31 @@
CHECK_ISOLATE(isolate);
ApiState* state = isolate->api_state();
ASSERT(state != NULL);
- if (state->IsValidPrologueWeakPersistentHandle(object)) {
- FinalizablePersistentHandle* prologue_weak_ref =
- Api::UnwrapAsPrologueWeakPersistentHandle(object);
- state->prologue_weak_persistent_handles().FreeHandle(prologue_weak_ref);
- return;
+ if (FinalizablePersistentHandle::IsPrologueWeakPersistentHandle(object)) {
+ ASSERT(state->IsValidPrologueWeakPersistentHandle(object));
+ FinalizablePersistentHandle* weak_ref =
+ FinalizablePersistentHandle::AsFinalizablePersistentHandle(object);
+ state->prologue_weak_persistent_handles().FreeHandle(weak_ref);
+ } else {
+ ASSERT(!state->IsValidPrologueWeakPersistentHandle(object));
+ FinalizablePersistentHandle* weak_ref =
+ FinalizablePersistentHandle::AsFinalizablePersistentHandle(object);
+ state->weak_persistent_handles().FreeHandle(weak_ref);
}
- FinalizablePersistentHandle* weak_ref =
- Api::UnwrapAsWeakPersistentHandle(object);
- state->weak_persistent_handles().FreeHandle(weak_ref);
- return;
}
DART_EXPORT bool Dart_IsPrologueWeakPersistentHandle(
Dart_WeakPersistentHandle object) {
+#if defined(DEBUG)
Isolate* isolate = Isolate::Current();
CHECK_ISOLATE(isolate);
ApiState* state = isolate->api_state();
ASSERT(state != NULL);
- return state->IsValidPrologueWeakPersistentHandle(object);
+ ASSERT(state->IsValidPrologueWeakPersistentHandle(object) ==
+ FinalizablePersistentHandle::IsPrologueWeakPersistentHandle(object));
+#endif
+ return FinalizablePersistentHandle::IsPrologueWeakPersistentHandle(object);
}

Powered by Google App Engine
This is Rietveld 408576698