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

Unified Diff: runtime/vm/dart_api_state.h

Issue 8984006: Implement weak persistent handles in the Dart API. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix whitespace. Created 9 years 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_state.h
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index 81f65d9a75e3af2e80269e4aad03ad9491242892..04f34d50c698e11219b96db069ab104fc394a4a1 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -81,11 +81,36 @@ void ProtectedHandleCallback();
// dart API.
class PersistentHandle {
public:
- enum {
+ enum Kind {
StrongReference = 0,
WeakReference,
};
+ // Adaptor for visiting handles with matching reference kind.
+ class Visitor : public HandleVisitor {
+ public:
+ explicit Visitor(ObjectPointerVisitor* visitor, Kind kind) {
Ivan Posva 2011/12/19 22:41:36 explicit not needed here.
cshapiro 2011/12/20 00:58:57 Right, done.
+ ASSERT(visitor != NULL);
+ kind_ = kind;
+ object_pointer_visitor_ = visitor;
+ }
+
+ void Visit(uword* addr) {
+ PersistentHandle* handle = reinterpret_cast<PersistentHandle*>(addr);
+ if (handle->kind() == kind_) {
+ object_pointer_visitor_->VisitPointer(&handle->raw_);
+ }
+ }
+
+ ~Visitor() {}
+
+ private:
+ Kind kind_;
+ ObjectPointerVisitor* object_pointer_visitor_;
+
+ DISALLOW_COPY_AND_ASSIGN(Visitor);
+ };
+
// Accessors.
RawObject* raw() const { return raw_; }
void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
@@ -93,8 +118,8 @@ class PersistentHandle {
static intptr_t raw_offset() { return OFFSET_OF(PersistentHandle, raw_); }
void* callback() const { return callback_; }
void set_callback(void* value) { callback_ = value; }
- intptr_t type() const { return type_; }
- void set_type(intptr_t value) { type_ = value; }
+ Kind kind() const { return kind_; }
+ void set_kind(Kind value) { kind_ = value; }
// Some handles are protected from being freed via the external dart api.
bool IsProtected() {
@@ -122,7 +147,8 @@ class PersistentHandle {
RawObject* raw_;
void* callback_;
- intptr_t type_;
+ void* peer_;
+ Kind kind_;
DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods.
DISALLOW_COPY_AND_ASSIGN(PersistentHandle);
};
@@ -199,6 +225,24 @@ class PersistentHandles : Handles<kPersistentHandleSizeInWords,
kOffsetOfRawPtrInPersistentHandle>::VisitObjectPointers(visitor);
}
+ // Visits the object pointers in strong persistent handles.
+ void VisitStrongObjectPointers(ObjectPointerVisitor* visitor) {
+ PersistentHandle::Visitor strong_visitor(visitor,
+ PersistentHandle::StrongReference);
+ Handles<kPersistentHandleSizeInWords,
+ kPersistentHandlesPerChunk,
+ kOffsetOfRawPtrInPersistentHandle>::Visit(&strong_visitor);
+ }
+
+ // Visits the object pointers in weak persistent handles.
+ void VisitWeakObjectPointers(ObjectPointerVisitor* visitor) {
+ PersistentHandle::Visitor weak_visitor(visitor,
+ PersistentHandle::WeakReference);
+ Handles<kPersistentHandleSizeInWords,
+ kPersistentHandlesPerChunk,
+ kOffsetOfRawPtrInPersistentHandle>::Visit(&weak_visitor);
+ }
+
// Allocates a persistent handle, these have to be destroyed explicitly
// by calling FreeHandle.
PersistentHandle* AllocateHandle() {
@@ -210,7 +254,7 @@ class PersistentHandles : Handles<kPersistentHandleSizeInWords,
handle = reinterpret_cast<PersistentHandle*>(AllocateScopedHandle());
}
handle->set_callback(NULL);
- handle->set_type(PersistentHandle::StrongReference);
+ handle->set_kind(PersistentHandle::StrongReference);
return handle;
}
@@ -301,13 +345,23 @@ class ApiState {
}
}
- void VisitObjectPointers(ObjectPointerVisitor* visitor) {
+ void VisitStrongObjectPointers(ObjectPointerVisitor* visitor) {
ApiLocalScope* scope = top_scope_;
while (scope != NULL) {
scope->local_handles()->VisitObjectPointers(visitor);
scope = scope->previous();
}
- persistent_handles().VisitObjectPointers(visitor);
+
+ persistent_handles().VisitStrongObjectPointers(visitor);
+ }
+
+ void VisitWeakObjectPointers(ObjectPointerVisitor* visitor) {
+ persistent_handles().VisitWeakObjectPointers(visitor);
+ }
+
+ void VisitObjectPointers(ObjectPointerVisitor* visitor) {
+ VisitStrongObjectPointers(visitor);
+ VisitWeakObjectPointers(visitor);
}
bool IsValidLocalHandle(Dart_Handle object) const {

Powered by Google App Engine
This is Rietveld 408576698