| Index: runtime/vm/dart_api_state.h
|
| ===================================================================
|
| --- runtime/vm/dart_api_state.h (revision 34251)
|
| +++ runtime/vm/dart_api_state.h (working copy)
|
| @@ -205,11 +205,6 @@
|
| void set_callback(Dart_WeakPersistentHandleFinalizer callback) {
|
| callback_ = callback;
|
| }
|
| - Dart_WeakPersistentHandle apiPrologueHandle() {
|
| - uword addr = reinterpret_cast<uword>(this);
|
| - return reinterpret_cast<Dart_WeakPersistentHandle>(
|
| - addr | kPrologueWeakPersistentTag);
|
| - }
|
| Dart_WeakPersistentHandle apiHandle() {
|
| return reinterpret_cast<Dart_WeakPersistentHandle>(this);
|
| }
|
| @@ -226,9 +221,9 @@
|
| }
|
|
|
| // Called when the referent becomes unreachable.
|
| - void UpdateUnreachable(Isolate* isolate, bool is_prologue_weak) {
|
| + void UpdateUnreachable(Isolate* isolate) {
|
| EnsureFreeExternal(isolate);
|
| - Finalize(isolate, this, is_prologue_weak);
|
| + Finalize(isolate, this);
|
| }
|
|
|
| // Called when the referent has moved, potentially between generations.
|
| @@ -247,27 +242,34 @@
|
| set_external_size(0);
|
| }
|
|
|
| - static bool IsPrologueWeakPersistentHandle(Dart_WeakPersistentHandle handle) {
|
| - uword addr = reinterpret_cast<uword>(handle);
|
| - return (addr & kWeakPersistentTagMask) == kPrologueWeakPersistentTag;
|
| + bool IsPrologueWeakPersistent() {
|
| + return PrologueWeakBit::decode(external_data_);
|
| }
|
| +
|
| + void SetPrologueWeakPersistent(bool value) {
|
| + external_data_ = PrologueWeakBit::update(value, external_data_);
|
| + }
|
| +
|
| static FinalizablePersistentHandle* Cast(Dart_WeakPersistentHandle handle);
|
|
|
| private:
|
| enum {
|
| - kWeakPersistentTag = 0,
|
| - kPrologueWeakPersistentTag = 1,
|
| - kWeakPersistentTagSize = 1,
|
| - kWeakPersistentTagMask = 1,
|
| + kExternalNewSpaceBit = 0,
|
| + kPrologueWeakBit = 1,
|
| + kExternalSizeBits = 2,
|
| + kExternalSizeBitsSize = (kBitsPerWord - 2),
|
| };
|
|
|
| // This part of external_data_ is the number of externally allocated bytes.
|
| // TODO(koda): Measure size in words instead.
|
| - class ExternalSizeBits : public BitField<intptr_t, 1, kBitsPerWord - 1> {};
|
| + class ExternalSizeBits : public BitField<intptr_t,
|
| + kExternalSizeBits,
|
| + kExternalSizeBitsSize> {}; // NOLINT
|
| // This bit of external_data_ is true if the referent was created in new
|
| // space and UpdateRelocated has not yet detected any promotion.
|
| - class ExternalNewSpaceBit : public BitField<bool, 0, 1> {};
|
| - // TODO(koda): Use bitfield also for the prologue tag.
|
| + class ExternalNewSpaceBit : public BitField<bool, kExternalNewSpaceBit, 1> {};
|
| + // This bit is used to indicate that it is a prologue weak persistent handle.
|
| + class PrologueWeakBit : public BitField<bool, kPrologueWeakBit, 1> {};
|
|
|
| friend class FinalizablePersistentHandles;
|
|
|
| @@ -278,9 +280,7 @@
|
| callback_(NULL) { }
|
| ~FinalizablePersistentHandle() { }
|
|
|
| - static void Finalize(Isolate* isolate,
|
| - FinalizablePersistentHandle* handle,
|
| - bool is_prologue_weak);
|
| + static void Finalize(Isolate* isolate, FinalizablePersistentHandle* handle);
|
|
|
| // Overload the raw_ field as a next pointer when adding freed
|
| // handles to the free list.
|
| @@ -308,6 +308,7 @@
|
| }
|
|
|
| void set_external_size(intptr_t size) {
|
| + ASSERT(ExternalSizeBits::is_valid(size));
|
| external_data_ = ExternalSizeBits::update(size, external_data_);
|
| }
|
|
|
| @@ -509,11 +510,11 @@
|
| void set_free_list(FinalizablePersistentHandle* value) { free_list_ = value; }
|
|
|
| // Visit all handles stored in the various handle blocks.
|
| - void VisitHandles(HandleVisitor* visitor, bool is_prologue_weak) {
|
| + void VisitHandles(HandleVisitor* visitor) {
|
| Handles<kFinalizablePersistentHandleSizeInWords,
|
| kFinalizablePersistentHandlesPerChunk,
|
| kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit(
|
| - visitor, is_prologue_weak);
|
| + visitor);
|
| }
|
|
|
| // Visit all object pointers stored in the various handles.
|
| @@ -751,9 +752,9 @@
|
|
|
| void VisitWeakHandles(HandleVisitor* visitor,
|
| bool visit_prologue_weak_handles) {
|
| - weak_persistent_handles().VisitHandles(visitor, false);
|
| + weak_persistent_handles().VisitHandles(visitor);
|
| if (visit_prologue_weak_handles) {
|
| - prologue_weak_persistent_handles().VisitHandles(visitor, true);
|
| + prologue_weak_persistent_handles().VisitHandles(visitor);
|
| }
|
| }
|
|
|
|
|