Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_DART_API_STATE_H_ | 5 #ifndef VM_DART_API_STATE_H_ |
| 6 #define VM_DART_API_STATE_H_ | 6 #define VM_DART_API_STATE_H_ |
| 7 | 7 |
| 8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
| 9 | 9 |
| 10 #include "vm/dart_api_impl.h" | 10 #include "vm/dart_api_impl.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 | 74 |
| 75 // A distinguished callback which indicates that a persistent handle | 75 // A distinguished callback which indicates that a persistent handle |
| 76 // should not be deleted from the dart api. | 76 // should not be deleted from the dart api. |
| 77 void ProtectedHandleCallback(); | 77 void ProtectedHandleCallback(); |
| 78 | 78 |
| 79 | 79 |
| 80 // Implementation of persistent handles which are handed out through the | 80 // Implementation of persistent handles which are handed out through the |
| 81 // dart API. | 81 // dart API. |
| 82 class PersistentHandle { | 82 class PersistentHandle { |
| 83 public: | 83 public: |
| 84 enum { | 84 enum Kind { |
| 85 StrongReference = 0, | 85 StrongReference = 0, |
| 86 WeakReference, | 86 WeakReference, |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 // Adaptor for visiting handles with matching reference kind. | |
| 90 class Visitor : public HandleVisitor { | |
| 91 public: | |
| 92 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.
| |
| 93 ASSERT(visitor != NULL); | |
| 94 kind_ = kind; | |
| 95 object_pointer_visitor_ = visitor; | |
| 96 } | |
| 97 | |
| 98 void Visit(uword* addr) { | |
| 99 PersistentHandle* handle = reinterpret_cast<PersistentHandle*>(addr); | |
| 100 if (handle->kind() == kind_) { | |
| 101 object_pointer_visitor_->VisitPointer(&handle->raw_); | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 ~Visitor() {} | |
| 106 | |
| 107 private: | |
| 108 Kind kind_; | |
| 109 ObjectPointerVisitor* object_pointer_visitor_; | |
| 110 | |
| 111 DISALLOW_COPY_AND_ASSIGN(Visitor); | |
| 112 }; | |
| 113 | |
| 89 // Accessors. | 114 // Accessors. |
| 90 RawObject* raw() const { return raw_; } | 115 RawObject* raw() const { return raw_; } |
| 91 void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); } | 116 void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); } |
| 92 void set_raw(const Object& object) { raw_ = object.raw(); } | 117 void set_raw(const Object& object) { raw_ = object.raw(); } |
| 93 static intptr_t raw_offset() { return OFFSET_OF(PersistentHandle, raw_); } | 118 static intptr_t raw_offset() { return OFFSET_OF(PersistentHandle, raw_); } |
| 94 void* callback() const { return callback_; } | 119 void* callback() const { return callback_; } |
| 95 void set_callback(void* value) { callback_ = value; } | 120 void set_callback(void* value) { callback_ = value; } |
| 96 intptr_t type() const { return type_; } | 121 Kind kind() const { return kind_; } |
| 97 void set_type(intptr_t value) { type_ = value; } | 122 void set_kind(Kind value) { kind_ = value; } |
| 98 | 123 |
| 99 // Some handles are protected from being freed via the external dart api. | 124 // Some handles are protected from being freed via the external dart api. |
| 100 bool IsProtected() { | 125 bool IsProtected() { |
| 101 return callback() == &ProtectedHandleCallback; | 126 return callback() == &ProtectedHandleCallback; |
| 102 } | 127 } |
| 103 | 128 |
| 104 private: | 129 private: |
| 105 friend class PersistentHandles; | 130 friend class PersistentHandles; |
| 106 | 131 |
| 107 PersistentHandle() { } | 132 PersistentHandle() { } |
| 108 ~PersistentHandle() { } | 133 ~PersistentHandle() { } |
| 109 | 134 |
| 110 // Overload the callback_ field as a next pointer when adding freed | 135 // Overload the callback_ field as a next pointer when adding freed |
| 111 // handles to the free list. | 136 // handles to the free list. |
| 112 PersistentHandle* Next() { | 137 PersistentHandle* Next() { |
| 113 return reinterpret_cast<PersistentHandle*>(callback_); | 138 return reinterpret_cast<PersistentHandle*>(callback_); |
| 114 } | 139 } |
| 115 void SetNext(PersistentHandle* free_list) { | 140 void SetNext(PersistentHandle* free_list) { |
| 116 callback_ = reinterpret_cast<void*>(free_list); | 141 callback_ = reinterpret_cast<void*>(free_list); |
| 117 } | 142 } |
| 118 void FreeHandle(PersistentHandle* free_list) { | 143 void FreeHandle(PersistentHandle* free_list) { |
| 119 raw_ = NULL; | 144 raw_ = NULL; |
| 120 SetNext(free_list); | 145 SetNext(free_list); |
| 121 } | 146 } |
| 122 | 147 |
| 123 RawObject* raw_; | 148 RawObject* raw_; |
| 124 void* callback_; | 149 void* callback_; |
| 125 intptr_t type_; | 150 void* peer_; |
| 151 Kind kind_; | |
| 126 DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods. | 152 DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods. |
| 127 DISALLOW_COPY_AND_ASSIGN(PersistentHandle); | 153 DISALLOW_COPY_AND_ASSIGN(PersistentHandle); |
| 128 }; | 154 }; |
| 129 | 155 |
| 130 | 156 |
| 131 // Local handles repository structure. | 157 // Local handles repository structure. |
| 132 static const int kLocalHandleSizeInWords = sizeof(LocalHandle) / kWordSize; | 158 static const int kLocalHandleSizeInWords = sizeof(LocalHandle) / kWordSize; |
| 133 static const int kLocalHandlesPerChunk = 64; | 159 static const int kLocalHandlesPerChunk = 64; |
| 134 static const int kOffsetOfRawPtrInLocalHandle = 0; | 160 static const int kOffsetOfRawPtrInLocalHandle = 0; |
| 135 class LocalHandles : Handles<kLocalHandleSizeInWords, | 161 class LocalHandles : Handles<kLocalHandleSizeInWords, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 PersistentHandle* free_list() const { return free_list_; } | 218 PersistentHandle* free_list() const { return free_list_; } |
| 193 void set_free_list(PersistentHandle* value) { free_list_ = value; } | 219 void set_free_list(PersistentHandle* value) { free_list_ = value; } |
| 194 | 220 |
| 195 // Visit all object pointers stored in the various handles. | 221 // Visit all object pointers stored in the various handles. |
| 196 void VisitObjectPointers(ObjectPointerVisitor* visitor) { | 222 void VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| 197 Handles<kPersistentHandleSizeInWords, | 223 Handles<kPersistentHandleSizeInWords, |
| 198 kPersistentHandlesPerChunk, | 224 kPersistentHandlesPerChunk, |
| 199 kOffsetOfRawPtrInPersistentHandle>::VisitObjectPointers(visitor); | 225 kOffsetOfRawPtrInPersistentHandle>::VisitObjectPointers(visitor); |
| 200 } | 226 } |
| 201 | 227 |
| 228 // Visits the object pointers in strong persistent handles. | |
| 229 void VisitStrongObjectPointers(ObjectPointerVisitor* visitor) { | |
| 230 PersistentHandle::Visitor strong_visitor(visitor, | |
| 231 PersistentHandle::StrongReference); | |
| 232 Handles<kPersistentHandleSizeInWords, | |
| 233 kPersistentHandlesPerChunk, | |
| 234 kOffsetOfRawPtrInPersistentHandle>::Visit(&strong_visitor); | |
| 235 } | |
| 236 | |
| 237 // Visits the object pointers in weak persistent handles. | |
| 238 void VisitWeakObjectPointers(ObjectPointerVisitor* visitor) { | |
| 239 PersistentHandle::Visitor weak_visitor(visitor, | |
| 240 PersistentHandle::WeakReference); | |
| 241 Handles<kPersistentHandleSizeInWords, | |
| 242 kPersistentHandlesPerChunk, | |
| 243 kOffsetOfRawPtrInPersistentHandle>::Visit(&weak_visitor); | |
| 244 } | |
| 245 | |
| 202 // Allocates a persistent handle, these have to be destroyed explicitly | 246 // Allocates a persistent handle, these have to be destroyed explicitly |
| 203 // by calling FreeHandle. | 247 // by calling FreeHandle. |
| 204 PersistentHandle* AllocateHandle() { | 248 PersistentHandle* AllocateHandle() { |
| 205 PersistentHandle* handle; | 249 PersistentHandle* handle; |
| 206 if (free_list_ != NULL) { | 250 if (free_list_ != NULL) { |
| 207 handle = free_list_; | 251 handle = free_list_; |
| 208 free_list_ = handle->Next(); | 252 free_list_ = handle->Next(); |
| 209 } else { | 253 } else { |
| 210 handle = reinterpret_cast<PersistentHandle*>(AllocateScopedHandle()); | 254 handle = reinterpret_cast<PersistentHandle*>(AllocateScopedHandle()); |
| 211 } | 255 } |
| 212 handle->set_callback(NULL); | 256 handle->set_callback(NULL); |
| 213 handle->set_type(PersistentHandle::StrongReference); | 257 handle->set_kind(PersistentHandle::StrongReference); |
| 214 return handle; | 258 return handle; |
| 215 } | 259 } |
| 216 | 260 |
| 217 void FreeHandle(PersistentHandle* handle) { | 261 void FreeHandle(PersistentHandle* handle) { |
| 218 handle->FreeHandle(free_list()); | 262 handle->FreeHandle(free_list()); |
| 219 set_free_list(handle); | 263 set_free_list(handle); |
| 220 } | 264 } |
| 221 | 265 |
| 222 // Validate if passed in handle is a Persistent Handle. | 266 // Validate if passed in handle is a Persistent Handle. |
| 223 bool IsValidHandle(Dart_Handle object) const { | 267 bool IsValidHandle(Dart_Handle object) const { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 294 PersistentHandles& persistent_handles() { return persistent_handles_; } | 338 PersistentHandles& persistent_handles() { return persistent_handles_; } |
| 295 | 339 |
| 296 void UnwindScopes(uword sp) { | 340 void UnwindScopes(uword sp) { |
| 297 while (top_scope_ != NULL && top_scope_->stack_marker() < sp) { | 341 while (top_scope_ != NULL && top_scope_->stack_marker() < sp) { |
| 298 ApiLocalScope* scope = top_scope_; | 342 ApiLocalScope* scope = top_scope_; |
| 299 top_scope_ = top_scope_->previous(); | 343 top_scope_ = top_scope_->previous(); |
| 300 delete scope; | 344 delete scope; |
| 301 } | 345 } |
| 302 } | 346 } |
| 303 | 347 |
| 304 void VisitObjectPointers(ObjectPointerVisitor* visitor) { | 348 void VisitStrongObjectPointers(ObjectPointerVisitor* visitor) { |
| 305 ApiLocalScope* scope = top_scope_; | 349 ApiLocalScope* scope = top_scope_; |
| 306 while (scope != NULL) { | 350 while (scope != NULL) { |
| 307 scope->local_handles()->VisitObjectPointers(visitor); | 351 scope->local_handles()->VisitObjectPointers(visitor); |
| 308 scope = scope->previous(); | 352 scope = scope->previous(); |
| 309 } | 353 } |
| 310 persistent_handles().VisitObjectPointers(visitor); | 354 |
| 355 persistent_handles().VisitStrongObjectPointers(visitor); | |
| 356 } | |
| 357 | |
| 358 void VisitWeakObjectPointers(ObjectPointerVisitor* visitor) { | |
| 359 persistent_handles().VisitWeakObjectPointers(visitor); | |
| 360 } | |
| 361 | |
| 362 void VisitObjectPointers(ObjectPointerVisitor* visitor) { | |
| 363 VisitStrongObjectPointers(visitor); | |
| 364 VisitWeakObjectPointers(visitor); | |
| 311 } | 365 } |
| 312 | 366 |
| 313 bool IsValidLocalHandle(Dart_Handle object) const { | 367 bool IsValidLocalHandle(Dart_Handle object) const { |
| 314 ApiLocalScope* scope = top_scope_; | 368 ApiLocalScope* scope = top_scope_; |
| 315 while (scope != NULL) { | 369 while (scope != NULL) { |
| 316 if (scope->local_handles()->IsValidHandle(object)) { | 370 if (scope->local_handles()->IsValidHandle(object)) { |
| 317 return true; | 371 return true; |
| 318 } | 372 } |
| 319 scope = scope->previous(); | 373 scope = scope->previous(); |
| 320 } | 374 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 PersistentHandle* null_; | 441 PersistentHandle* null_; |
| 388 PersistentHandle* true_; | 442 PersistentHandle* true_; |
| 389 PersistentHandle* false_; | 443 PersistentHandle* false_; |
| 390 | 444 |
| 391 DISALLOW_COPY_AND_ASSIGN(ApiState); | 445 DISALLOW_COPY_AND_ASSIGN(ApiState); |
| 392 }; | 446 }; |
| 393 | 447 |
| 394 } // namespace dart | 448 } // namespace dart |
| 395 | 449 |
| 396 #endif // VM_DART_API_STATE_H_ | 450 #endif // VM_DART_API_STATE_H_ |
| OLD | NEW |