| Index: runtime/vm/dart_api_impl.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl.cc (revision 33249)
|
| +++ runtime/vm/dart_api_impl.cc (working copy)
|
| @@ -155,29 +155,6 @@
|
| }
|
|
|
|
|
| -PersistentHandle* Api::UnwrapAsPersistentHandle(Dart_PersistentHandle object) {
|
| - ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(object));
|
| - return reinterpret_cast<PersistentHandle*>(object);
|
| -}
|
| -
|
| -
|
| -FinalizablePersistentHandle* Api::UnwrapAsWeakPersistentHandle(
|
| - Dart_WeakPersistentHandle object) {
|
| - ASSERT(Isolate::Current()->api_state()->IsValidWeakPersistentHandle(object) ||
|
| - Isolate::Current()->api_state()->
|
| - IsValidPrologueWeakPersistentHandle(object));
|
| - return reinterpret_cast<FinalizablePersistentHandle*>(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.
|
| @@ -358,10 +335,29 @@
|
|
|
| void Api::SetWeakHandleReturnValue(NativeArguments* args,
|
| Dart_WeakPersistentHandle retval) {
|
| - args->SetReturnUnsafe(Api::UnwrapAsWeakPersistentHandle(retval)->raw());
|
| + args->SetReturnUnsafe(FinalizablePersistentHandle::Cast(retval)->raw());
|
| }
|
|
|
|
|
| +PersistentHandle* PersistentHandle::Cast(Dart_PersistentHandle handle) {
|
| + ASSERT(Isolate::Current()->api_state()->IsValidPersistentHandle(handle));
|
| + return reinterpret_cast<PersistentHandle*>(handle);
|
| +}
|
| +
|
| +
|
| +FinalizablePersistentHandle* FinalizablePersistentHandle::Cast(
|
| + Dart_WeakPersistentHandle handle) {
|
| +#if defined(DEBUG)
|
| + ApiState* state = Isolate::Current()->api_state();
|
| + ASSERT(state->IsValidWeakPersistentHandle(handle) ||
|
| + state->IsValidPrologueWeakPersistentHandle(handle));
|
| +#endif
|
| + uword addr = reinterpret_cast<uword>(handle);
|
| + return reinterpret_cast<FinalizablePersistentHandle*>(
|
| + addr & ~kWeakPersistentTagMask);
|
| +}
|
| +
|
| +
|
| // --- Handles ---
|
|
|
| DART_EXPORT bool Dart_IsError(Dart_Handle handle) {
|
| @@ -568,9 +564,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 = PersistentHandle::Cast(object);
|
| + return Api::NewHandle(isolate, ref->raw());
|
| }
|
|
|
|
|
| @@ -580,10 +575,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 =
|
| + FinalizablePersistentHandle::Cast(object);
|
| + return Api::NewHandle(isolate, weak_ref->raw());
|
| }
|
|
|
|
|
| @@ -595,7 +589,7 @@
|
| const Object& old_ref = Object::Handle(isolate, Api::UnwrapHandle(object));
|
| PersistentHandle* new_ref = state->persistent_handles().AllocateHandle();
|
| new_ref->set_raw(old_ref);
|
| - return reinterpret_cast<Dart_PersistentHandle>(new_ref);
|
| + return new_ref->apiHandle();
|
| }
|
|
|
|
|
| @@ -607,25 +601,34 @@
|
| ASSERT(state != NULL);
|
| ASSERT(state->IsValidPersistentHandle(obj1));
|
| const Object& obj2_ref = Object::Handle(isolate, Api::UnwrapHandle(obj2));
|
| - PersistentHandle* obj1_ref = Api::UnwrapAsPersistentHandle(obj1);
|
| + PersistentHandle* obj1_ref = PersistentHandle::Cast(obj1);
|
| obj1_ref->set_raw(obj2_ref);
|
| }
|
|
|
|
|
| static Dart_WeakPersistentHandle AllocateFinalizableHandle(
|
| Isolate* isolate,
|
| - FinalizablePersistentHandles* handles,
|
| Dart_Handle object,
|
| + bool is_prologue,
|
| void* peer,
|
| Dart_WeakPersistentHandleFinalizer callback) {
|
| + ApiState* state = isolate->api_state();
|
| + ASSERT(state != NULL);
|
| ReusableObjectHandleScope reused_obj_handle(isolate);
|
| Object& ref = reused_obj_handle.Handle();
|
| ref = Api::UnwrapHandle(object);
|
| - FinalizablePersistentHandle* finalizable_ref = handles->AllocateHandle();
|
| + FinalizablePersistentHandle* finalizable_ref = is_prologue ?
|
| + state->prologue_weak_persistent_handles().AllocateHandle() :
|
| + state->weak_persistent_handles().AllocateHandle();
|
| +
|
| 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 finalizable_ref->apiPrologueHandle();
|
| + } else {
|
| + return finalizable_ref->apiHandle();
|
| + }
|
| }
|
|
|
|
|
| @@ -635,11 +638,9 @@
|
| Dart_WeakPersistentHandleFinalizer callback) {
|
| Isolate* isolate = Isolate::Current();
|
| CHECK_ISOLATE(isolate);
|
| - ApiState* state = isolate->api_state();
|
| - ASSERT(state != NULL);
|
| return AllocateFinalizableHandle(isolate,
|
| - &state->weak_persistent_handles(),
|
| object,
|
| + false,
|
| peer,
|
| callback);
|
| }
|
| @@ -651,11 +652,9 @@
|
| Dart_WeakPersistentHandleFinalizer callback) {
|
| Isolate* isolate = Isolate::Current();
|
| CHECK_ISOLATE(isolate);
|
| - ApiState* state = isolate->api_state();
|
| - ASSERT(state != NULL);
|
| return AllocateFinalizableHandle(isolate,
|
| - &state->prologue_weak_persistent_handles(),
|
| object,
|
| + true,
|
| peer,
|
| callback);
|
| }
|
| @@ -666,7 +665,7 @@
|
| CHECK_ISOLATE(isolate);
|
| ApiState* state = isolate->api_state();
|
| ASSERT(state != NULL);
|
| - PersistentHandle* ref = Api::UnwrapAsPersistentHandle(object);
|
| + PersistentHandle* ref = PersistentHandle::Cast(object);
|
| ASSERT(!state->IsProtectedHandle(ref));
|
| if (!state->IsProtectedHandle(ref)) {
|
| state->persistent_handles().FreeHandle(ref);
|
| @@ -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::Cast(object);
|
| + state->prologue_weak_persistent_handles().FreeHandle(weak_ref);
|
| + } else {
|
| + ASSERT(!state->IsValidPrologueWeakPersistentHandle(object));
|
| + FinalizablePersistentHandle* weak_ref =
|
| + FinalizablePersistentHandle::Cast(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);
|
| }
|
|
|
|
|
|
|