| Index: runtime/vm/dart_api_state.h
|
| diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
|
| index f039db0a2ec002ee97e07cf72c473d561fa1e482..feaa60716dbca57736798bc2680b739d00e7ed3a 100644
|
| --- a/runtime/vm/dart_api_state.h
|
| +++ b/runtime/vm/dart_api_state.h
|
| @@ -120,14 +120,16 @@ class PersistentHandle {
|
|
|
| // Implementation of persistent handles which are handed out through the
|
| // dart API.
|
| -class WeakPersistentHandle {
|
| +class FinalizablePersistentHandle {
|
| public:
|
| // Accessors.
|
| RawObject* raw() const { return raw_; }
|
| void set_raw(RawObject* raw) { raw_ = raw; }
|
| void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
|
| void set_raw(const Object& object) { raw_ = object.raw(); }
|
| - static intptr_t raw_offset() { return OFFSET_OF(WeakPersistentHandle, raw_); }
|
| + static intptr_t raw_offset() {
|
| + return OFFSET_OF(FinalizablePersistentHandle, raw_);
|
| + }
|
| void* peer() const { return peer_; }
|
| void set_peer(void* peer) { peer_ = peer; }
|
| Dart_WeakPersistentHandleFinalizer callback() const { return callback_; }
|
| @@ -135,7 +137,7 @@ class WeakPersistentHandle {
|
| callback_ = callback;
|
| }
|
|
|
| - static void Finalize(WeakPersistentHandle* handle) {
|
| + static void Finalize(FinalizablePersistentHandle* handle) {
|
| Dart_WeakPersistentHandleFinalizer callback = handle->callback();
|
| if (callback != NULL) {
|
| void* peer = handle->peer();
|
| @@ -147,21 +149,21 @@ class WeakPersistentHandle {
|
| }
|
|
|
| private:
|
| - friend class WeakPersistentHandles;
|
| + friend class FinalizablePersistentHandles;
|
|
|
| - WeakPersistentHandle() : raw_(NULL), peer_(NULL), callback_(NULL) { }
|
| - ~WeakPersistentHandle() { }
|
| + FinalizablePersistentHandle() : raw_(NULL), peer_(NULL), callback_(NULL) { }
|
| + ~FinalizablePersistentHandle() { }
|
|
|
| // Overload the raw_ field as a next pointer when adding freed
|
| // handles to the free list.
|
| - WeakPersistentHandle* Next() {
|
| - return reinterpret_cast<WeakPersistentHandle*>(raw_);
|
| + FinalizablePersistentHandle* Next() {
|
| + return reinterpret_cast<FinalizablePersistentHandle*>(raw_);
|
| }
|
| - void SetNext(WeakPersistentHandle* free_list) {
|
| + void SetNext(FinalizablePersistentHandle* free_list) {
|
| raw_ = reinterpret_cast<RawObject*>(free_list);
|
| ASSERT(!raw_->IsHeapObject());
|
| }
|
| - void FreeHandle(WeakPersistentHandle* free_list) {
|
| + void FreeHandle(FinalizablePersistentHandle* free_list) {
|
| SetNext(free_list);
|
| }
|
|
|
| @@ -175,7 +177,7 @@ class WeakPersistentHandle {
|
| void* peer_;
|
| Dart_WeakPersistentHandleFinalizer callback_;
|
| DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods.
|
| - DISALLOW_COPY_AND_ASSIGN(WeakPersistentHandle);
|
| + DISALLOW_COPY_AND_ASSIGN(FinalizablePersistentHandle);
|
| };
|
|
|
|
|
| @@ -285,49 +287,60 @@ class PersistentHandles : Handles<kPersistentHandleSizeInWords,
|
| };
|
|
|
|
|
| -// Weak persistent handles repository structure.
|
| -static const int kWeakPersistentHandleSizeInWords =
|
| - sizeof(WeakPersistentHandle) / kWordSize;
|
| -static const int kWeakPersistentHandlesPerChunk = 64;
|
| -static const int kOffsetOfRawPtrInWeakPersistentHandle = 0;
|
| -class WeakPersistentHandles : Handles<kWeakPersistentHandleSizeInWords,
|
| - kWeakPersistentHandlesPerChunk,
|
| - kOffsetOfRawPtrInWeakPersistentHandle> {
|
| +// Finalizable persistent handles repository structure.
|
| +static const int kFinalizablePersistentHandleSizeInWords =
|
| + sizeof(FinalizablePersistentHandle) / kWordSize;
|
| +static const int kFinalizablePersistentHandlesPerChunk = 64;
|
| +static const int kOffsetOfRawPtrInFinalizablePersistentHandle = 0;
|
| +class FinalizablePersistentHandles
|
| + : Handles<kFinalizablePersistentHandleSizeInWords,
|
| + kFinalizablePersistentHandlesPerChunk,
|
| + kOffsetOfRawPtrInFinalizablePersistentHandle> {
|
| public:
|
| - WeakPersistentHandles() : Handles<kWeakPersistentHandleSizeInWords,
|
| - kWeakPersistentHandlesPerChunk,
|
| - kOffsetOfRawPtrInWeakPersistentHandle>(),
|
| - free_list_(NULL) { }
|
| - ~WeakPersistentHandles() {
|
| + FinalizablePersistentHandles()
|
| + : Handles<kFinalizablePersistentHandleSizeInWords,
|
| + kFinalizablePersistentHandlesPerChunk,
|
| + kOffsetOfRawPtrInFinalizablePersistentHandle>(),
|
| + free_list_(NULL) { }
|
| + ~FinalizablePersistentHandles() {
|
| free_list_ = NULL;
|
| }
|
|
|
| // Accessors.
|
| - WeakPersistentHandle* free_list() const { return free_list_; }
|
| - void set_free_list(WeakPersistentHandle* value) { free_list_ = value; }
|
| + FinalizablePersistentHandle* free_list() const { return free_list_; }
|
| + void set_free_list(FinalizablePersistentHandle* value) { free_list_ = value; }
|
|
|
| // Visit all handles stored in the various handle blocks.
|
| - void VisitWeakPersistentHandles(HandleVisitor* visitor) {
|
| - Handles<kWeakPersistentHandleSizeInWords,
|
| - kWeakPersistentHandlesPerChunk,
|
| - kOffsetOfRawPtrInWeakPersistentHandle>::Visit(visitor);
|
| + void VisitHandles(HandleVisitor* visitor) {
|
| + Handles<kFinalizablePersistentHandleSizeInWords,
|
| + kFinalizablePersistentHandlesPerChunk,
|
| + kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit(visitor);
|
| + }
|
| +
|
| + // Visit all object pointers stored in the various handles.
|
| + void VisitObjectPointers(ObjectPointerVisitor* visitor) {
|
| + Handles<kFinalizablePersistentHandleSizeInWords,
|
| + kFinalizablePersistentHandlesPerChunk,
|
| + kOffsetOfRawPtrInFinalizablePersistentHandle>::VisitObjectPointers(
|
| + visitor);
|
| }
|
|
|
| // Allocates a persistent handle, these have to be destroyed explicitly
|
| // by calling FreeHandle.
|
| - WeakPersistentHandle* AllocateHandle() {
|
| - WeakPersistentHandle* handle;
|
| + FinalizablePersistentHandle* AllocateHandle() {
|
| + FinalizablePersistentHandle* handle;
|
| if (free_list_ != NULL) {
|
| handle = free_list_;
|
| free_list_ = handle->Next();
|
| } else {
|
| - handle = reinterpret_cast<WeakPersistentHandle*>(AllocateScopedHandle());
|
| + handle = reinterpret_cast<FinalizablePersistentHandle*>(
|
| + AllocateScopedHandle());
|
| }
|
| handle->set_callback(NULL);
|
| return handle;
|
| }
|
|
|
| - void FreeHandle(WeakPersistentHandle* handle) {
|
| + void FreeHandle(FinalizablePersistentHandle* handle) {
|
| handle->FreeHandle(free_list());
|
| set_free_list(handle);
|
| }
|
| @@ -343,8 +356,8 @@ class WeakPersistentHandles : Handles<kWeakPersistentHandleSizeInWords,
|
| }
|
|
|
| private:
|
| - WeakPersistentHandle* free_list_;
|
| - DISALLOW_COPY_AND_ASSIGN(WeakPersistentHandles);
|
| + FinalizablePersistentHandle* free_list_;
|
| + DISALLOW_COPY_AND_ASSIGN(FinalizablePersistentHandles);
|
| };
|
|
|
|
|
| @@ -458,14 +471,22 @@ class ApiState {
|
| // Accessors.
|
| ApiLocalScope* top_scope() const { return top_scope_; }
|
| void set_top_scope(ApiLocalScope* value) { top_scope_ = value; }
|
| +
|
| PersistentHandles& persistent_handles() { return persistent_handles_; }
|
| - WeakPersistentHandles& weak_persistent_handles() {
|
| +
|
| + FinalizablePersistentHandles& weak_persistent_handles() {
|
| return weak_persistent_handles_;
|
| }
|
| +
|
| + FinalizablePersistentHandles& prologue_weak_persistent_handles() {
|
| + return prologue_weak_persistent_handles_;
|
| + }
|
| +
|
| WeakReference* delayed_weak_references() { return delayed_weak_references_; }
|
| void set_delayed_weak_references(WeakReference* reference) {
|
| delayed_weak_references_ = reference;
|
| }
|
| +
|
| void UnwindScopes(uword sp) {
|
| while (top_scope_ != NULL && top_scope_->stack_marker() < sp) {
|
| ApiLocalScope* scope = top_scope_;
|
| @@ -474,17 +495,25 @@ class ApiState {
|
| }
|
| }
|
|
|
| - void VisitObjectPointers(ObjectPointerVisitor* visitor) {
|
| + void VisitObjectPointers(ObjectPointerVisitor* visitor,
|
| + bool visit_prologue_weak_handles) {
|
| ApiLocalScope* scope = top_scope_;
|
| while (scope != NULL) {
|
| scope->local_handles()->VisitObjectPointers(visitor);
|
| scope = scope->previous();
|
| }
|
| persistent_handles().VisitObjectPointers(visitor);
|
| + if (visit_prologue_weak_handles) {
|
| + prologue_weak_persistent_handles().VisitObjectPointers(visitor);
|
| + }
|
| }
|
|
|
| - void VisitWeakHandles(HandleVisitor* visitor) {
|
| - weak_persistent_handles().VisitWeakPersistentHandles(visitor);
|
| + void VisitWeakHandles(HandleVisitor* visitor,
|
| + bool visit_prologue_weak_handles) {
|
| + weak_persistent_handles().VisitHandles(visitor);
|
| + if (visit_prologue_weak_handles) {
|
| + prologue_weak_persistent_handles().VisitHandles(visitor);
|
| + }
|
| }
|
|
|
| bool IsValidLocalHandle(Dart_Handle object) const {
|
| @@ -506,6 +535,10 @@ class ApiState {
|
| return weak_persistent_handles_.IsValidHandle(object);
|
| }
|
|
|
| + bool IsValidPrologueWeakPersistentHandle(Dart_Handle object) const {
|
| + return prologue_weak_persistent_handles_.IsValidHandle(object);
|
| + }
|
| +
|
| bool IsProtectedHandle(PersistentHandle* object) const {
|
| if (object == NULL) return false;
|
| return object == null_ || object == true_ || object == false_;
|
| @@ -569,7 +602,8 @@ class ApiState {
|
|
|
| private:
|
| PersistentHandles persistent_handles_;
|
| - WeakPersistentHandles weak_persistent_handles_;
|
| + FinalizablePersistentHandles weak_persistent_handles_;
|
| + FinalizablePersistentHandles prologue_weak_persistent_handles_;
|
| ApiLocalScope* top_scope_;
|
| WeakReference* delayed_weak_references_;
|
|
|
|
|