Chromium Code Reviews| Index: runtime/vm/dart_api_state.h |
| =================================================================== |
| --- runtime/vm/dart_api_state.h (revision 33182) |
| +++ runtime/vm/dart_api_state.h (working copy) |
| @@ -197,19 +197,49 @@ |
| void set_callback(Dart_WeakPersistentHandleFinalizer callback) { |
| callback_ = callback; |
| } |
| - |
| - static void Finalize(FinalizablePersistentHandle* handle) { |
| + static bool IsPrologueWeakPersistentHandle(Dart_WeakPersistentHandle handle) { |
| + uword addr = reinterpret_cast<uword>(handle); |
| + return (addr & kWeakPersistentTagMask) == kPrologueWeakPersistentTag; |
| + } |
| + static Dart_WeakPersistentHandle AsDartPrologueWeakPersistentHandle( |
|
Ivan Posva
2014/03/03 21:00:19
Make this a method such as external on Finalizable
siva
2014/03/04 00:24:48
Done.
|
| + FinalizablePersistentHandle* handle) { |
| + uword addr = reinterpret_cast<uword>(handle); |
| + return reinterpret_cast<Dart_WeakPersistentHandle>( |
| + addr | kPrologueWeakPersistentTag); |
| + } |
| + static Dart_WeakPersistentHandle AsDartWeakPersistentHandle( |
| + FinalizablePersistentHandle* handle) { |
| + return reinterpret_cast<Dart_WeakPersistentHandle>(handle); |
| + } |
| + static FinalizablePersistentHandle* AsFinalizablePersistentHandle( |
|
Ivan Posva
2014/03/03 21:00:19
How about renaming this as FinalizablePersistentHa
siva
2014/03/04 00:24:48
Done.
|
| + Dart_WeakPersistentHandle handle) { |
| + uword addr = reinterpret_cast<uword>(handle); |
| + return reinterpret_cast<FinalizablePersistentHandle*>( |
| + addr & ~kWeakPersistentTagMask); |
| + } |
| + static void Finalize(FinalizablePersistentHandle* handle, |
| + bool is_prologue_weak) { |
| Dart_WeakPersistentHandleFinalizer callback = handle->callback(); |
| if (callback != NULL) { |
| void* peer = handle->peer(); |
| handle->Clear(); |
| - (*callback)(reinterpret_cast<Dart_WeakPersistentHandle>(handle), peer); |
| + Dart_WeakPersistentHandle object = |
| + is_prologue_weak ? AsDartPrologueWeakPersistentHandle(handle) : |
| + AsDartWeakPersistentHandle(handle); |
| + (*callback)(object, peer); |
| } else { |
| handle->Clear(); |
| } |
| } |
| private: |
| + enum { |
| + kWeakPersistentTag = 0, |
| + kPrologueWeakPersistentTag = 1, |
| + kWeakPersistentTagSize = 1, |
| + kWeakPersistentTagMask = 1, |
| + }; |
| + |
| friend class FinalizablePersistentHandles; |
| FinalizablePersistentHandle() : raw_(NULL), peer_(NULL), callback_(NULL) { } |
| @@ -403,7 +433,7 @@ |
| : Handles<kFinalizablePersistentHandleSizeInWords, |
| kFinalizablePersistentHandlesPerChunk, |
| kOffsetOfRawPtrInFinalizablePersistentHandle>(), |
| - free_list_(NULL) { } |
| + free_list_(NULL) { } |
| ~FinalizablePersistentHandles() { |
| free_list_ = NULL; |
| } |
| @@ -413,10 +443,11 @@ |
| void set_free_list(FinalizablePersistentHandle* value) { free_list_ = value; } |
| // Visit all handles stored in the various handle blocks. |
| - void VisitHandles(HandleVisitor* visitor) { |
| + void VisitHandles(HandleVisitor* visitor, bool is_prologue_weak) { |
| Handles<kFinalizablePersistentHandleSizeInWords, |
| kFinalizablePersistentHandlesPerChunk, |
| - kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit(visitor); |
| + kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit( |
| + visitor, is_prologue_weak); |
| } |
| // Visit all object pointers stored in the various handles. |
| @@ -479,16 +510,18 @@ |
| RawObject** get_key(intptr_t i) { |
| ASSERT(i >= 0); |
| ASSERT(i < num_keys_); |
| - return (reinterpret_cast<FinalizablePersistentHandle*>(keys_[i]))-> |
| - raw_addr(); |
| + FinalizablePersistentHandle* ref = |
| + FinalizablePersistentHandle::AsFinalizablePersistentHandle(keys_[i]); |
| + return ref->raw_addr(); |
| } |
| intptr_t num_values() const { return num_values_; } |
| RawObject** get_value(intptr_t i) { |
| ASSERT(i >= 0); |
| ASSERT(i < num_values_); |
| - return (reinterpret_cast<FinalizablePersistentHandle*>(values_[i]))-> |
| - raw_addr(); |
| + FinalizablePersistentHandle* ref = |
| + FinalizablePersistentHandle::AsFinalizablePersistentHandle(values_[i]); |
| + return ref->raw_addr(); |
| } |
| static WeakReferenceSet* Pop(WeakReferenceSet** queue) { |
| @@ -652,9 +685,9 @@ |
| void VisitWeakHandles(HandleVisitor* visitor, |
| bool visit_prologue_weak_handles) { |
| - weak_persistent_handles().VisitHandles(visitor); |
| + weak_persistent_handles().VisitHandles(visitor, false); |
| if (visit_prologue_weak_handles) { |
| - prologue_weak_persistent_handles().VisitHandles(visitor); |
| + prologue_weak_persistent_handles().VisitHandles(visitor, true); |
| } |
| } |