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

Side by Side Diff: runtime/vm/dart_api_state.h

Issue 177093010: Use a tag bit for indicating prologue weak persistent handles, this avoids (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 9 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "platform/thread.h" 10 #include "platform/thread.h"
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 PersistentHandle* Next() { 164 PersistentHandle* Next() {
165 return reinterpret_cast<PersistentHandle*>(raw_); 165 return reinterpret_cast<PersistentHandle*>(raw_);
166 } 166 }
167 void SetNext(PersistentHandle* free_list) { 167 void SetNext(PersistentHandle* free_list) {
168 raw_ = reinterpret_cast<RawObject*>(free_list); 168 raw_ = reinterpret_cast<RawObject*>(free_list);
169 ASSERT(!raw_->IsHeapObject()); 169 ASSERT(!raw_->IsHeapObject());
170 } 170 }
171 void FreeHandle(PersistentHandle* free_list) { 171 void FreeHandle(PersistentHandle* free_list) {
172 SetNext(free_list); 172 SetNext(free_list);
173 } 173 }
174 174
Ivan Posva 2014/03/03 21:00:19 external and Cast might need to be added here.
siva 2014/03/04 00:24:48 Done.
175 RawObject* raw_; 175 RawObject* raw_;
176 DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods. 176 DISALLOW_ALLOCATION(); // Allocated through AllocateHandle methods.
177 DISALLOW_COPY_AND_ASSIGN(PersistentHandle); 177 DISALLOW_COPY_AND_ASSIGN(PersistentHandle);
178 }; 178 };
179 179
180 180
181 // Implementation of persistent handles which are handed out through the 181 // Implementation of persistent handles which are handed out through the
182 // dart API. 182 // dart API.
183 class FinalizablePersistentHandle { 183 class FinalizablePersistentHandle {
184 public: 184 public:
185 // Accessors. 185 // Accessors.
186 RawObject* raw() const { return raw_; } 186 RawObject* raw() const { return raw_; }
187 void set_raw(RawObject* raw) { raw_ = raw; } 187 void set_raw(RawObject* raw) { raw_ = raw; }
188 void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); } 188 void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
189 void set_raw(const Object& object) { raw_ = object.raw(); } 189 void set_raw(const Object& object) { raw_ = object.raw(); }
190 RawObject** raw_addr() { return &raw_; } 190 RawObject** raw_addr() { return &raw_; }
191 static intptr_t raw_offset() { 191 static intptr_t raw_offset() {
192 return OFFSET_OF(FinalizablePersistentHandle, raw_); 192 return OFFSET_OF(FinalizablePersistentHandle, raw_);
193 } 193 }
194 void* peer() const { return peer_; } 194 void* peer() const { return peer_; }
195 void set_peer(void* peer) { peer_ = peer; } 195 void set_peer(void* peer) { peer_ = peer; }
196 Dart_WeakPersistentHandleFinalizer callback() const { return callback_; } 196 Dart_WeakPersistentHandleFinalizer callback() const { return callback_; }
197 void set_callback(Dart_WeakPersistentHandleFinalizer callback) { 197 void set_callback(Dart_WeakPersistentHandleFinalizer callback) {
198 callback_ = callback; 198 callback_ = callback;
199 } 199 }
200 200 static bool IsPrologueWeakPersistentHandle(Dart_WeakPersistentHandle handle) {
201 static void Finalize(FinalizablePersistentHandle* handle) { 201 uword addr = reinterpret_cast<uword>(handle);
202 return (addr & kWeakPersistentTagMask) == kPrologueWeakPersistentTag;
203 }
204 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.
205 FinalizablePersistentHandle* handle) {
206 uword addr = reinterpret_cast<uword>(handle);
207 return reinterpret_cast<Dart_WeakPersistentHandle>(
208 addr | kPrologueWeakPersistentTag);
209 }
210 static Dart_WeakPersistentHandle AsDartWeakPersistentHandle(
211 FinalizablePersistentHandle* handle) {
212 return reinterpret_cast<Dart_WeakPersistentHandle>(handle);
213 }
214 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.
215 Dart_WeakPersistentHandle handle) {
216 uword addr = reinterpret_cast<uword>(handle);
217 return reinterpret_cast<FinalizablePersistentHandle*>(
218 addr & ~kWeakPersistentTagMask);
219 }
220 static void Finalize(FinalizablePersistentHandle* handle,
221 bool is_prologue_weak) {
202 Dart_WeakPersistentHandleFinalizer callback = handle->callback(); 222 Dart_WeakPersistentHandleFinalizer callback = handle->callback();
203 if (callback != NULL) { 223 if (callback != NULL) {
204 void* peer = handle->peer(); 224 void* peer = handle->peer();
205 handle->Clear(); 225 handle->Clear();
206 (*callback)(reinterpret_cast<Dart_WeakPersistentHandle>(handle), peer); 226 Dart_WeakPersistentHandle object =
227 is_prologue_weak ? AsDartPrologueWeakPersistentHandle(handle) :
228 AsDartWeakPersistentHandle(handle);
229 (*callback)(object, peer);
207 } else { 230 } else {
208 handle->Clear(); 231 handle->Clear();
209 } 232 }
210 } 233 }
211 234
212 private: 235 private:
236 enum {
237 kWeakPersistentTag = 0,
238 kPrologueWeakPersistentTag = 1,
239 kWeakPersistentTagSize = 1,
240 kWeakPersistentTagMask = 1,
241 };
242
213 friend class FinalizablePersistentHandles; 243 friend class FinalizablePersistentHandles;
214 244
215 FinalizablePersistentHandle() : raw_(NULL), peer_(NULL), callback_(NULL) { } 245 FinalizablePersistentHandle() : raw_(NULL), peer_(NULL), callback_(NULL) { }
216 ~FinalizablePersistentHandle() { } 246 ~FinalizablePersistentHandle() { }
217 247
218 // Overload the raw_ field as a next pointer when adding freed 248 // Overload the raw_ field as a next pointer when adding freed
219 // handles to the free list. 249 // handles to the free list.
220 FinalizablePersistentHandle* Next() { 250 FinalizablePersistentHandle* Next() {
221 return reinterpret_cast<FinalizablePersistentHandle*>(raw_); 251 return reinterpret_cast<FinalizablePersistentHandle*>(raw_);
222 } 252 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 static const int kOffsetOfRawPtrInFinalizablePersistentHandle = 0; 426 static const int kOffsetOfRawPtrInFinalizablePersistentHandle = 0;
397 class FinalizablePersistentHandles 427 class FinalizablePersistentHandles
398 : Handles<kFinalizablePersistentHandleSizeInWords, 428 : Handles<kFinalizablePersistentHandleSizeInWords,
399 kFinalizablePersistentHandlesPerChunk, 429 kFinalizablePersistentHandlesPerChunk,
400 kOffsetOfRawPtrInFinalizablePersistentHandle> { 430 kOffsetOfRawPtrInFinalizablePersistentHandle> {
401 public: 431 public:
402 FinalizablePersistentHandles() 432 FinalizablePersistentHandles()
403 : Handles<kFinalizablePersistentHandleSizeInWords, 433 : Handles<kFinalizablePersistentHandleSizeInWords,
404 kFinalizablePersistentHandlesPerChunk, 434 kFinalizablePersistentHandlesPerChunk,
405 kOffsetOfRawPtrInFinalizablePersistentHandle>(), 435 kOffsetOfRawPtrInFinalizablePersistentHandle>(),
406 free_list_(NULL) { } 436 free_list_(NULL) { }
407 ~FinalizablePersistentHandles() { 437 ~FinalizablePersistentHandles() {
408 free_list_ = NULL; 438 free_list_ = NULL;
409 } 439 }
410 440
411 // Accessors. 441 // Accessors.
412 FinalizablePersistentHandle* free_list() const { return free_list_; } 442 FinalizablePersistentHandle* free_list() const { return free_list_; }
413 void set_free_list(FinalizablePersistentHandle* value) { free_list_ = value; } 443 void set_free_list(FinalizablePersistentHandle* value) { free_list_ = value; }
414 444
415 // Visit all handles stored in the various handle blocks. 445 // Visit all handles stored in the various handle blocks.
416 void VisitHandles(HandleVisitor* visitor) { 446 void VisitHandles(HandleVisitor* visitor, bool is_prologue_weak) {
417 Handles<kFinalizablePersistentHandleSizeInWords, 447 Handles<kFinalizablePersistentHandleSizeInWords,
418 kFinalizablePersistentHandlesPerChunk, 448 kFinalizablePersistentHandlesPerChunk,
419 kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit(visitor); 449 kOffsetOfRawPtrInFinalizablePersistentHandle>::Visit(
450 visitor, is_prologue_weak);
420 } 451 }
421 452
422 // Visit all object pointers stored in the various handles. 453 // Visit all object pointers stored in the various handles.
423 void VisitObjectPointers(ObjectPointerVisitor* visitor) { 454 void VisitObjectPointers(ObjectPointerVisitor* visitor) {
424 Handles<kFinalizablePersistentHandleSizeInWords, 455 Handles<kFinalizablePersistentHandleSizeInWords,
425 kFinalizablePersistentHandlesPerChunk, 456 kFinalizablePersistentHandlesPerChunk,
426 kOffsetOfRawPtrInFinalizablePersistentHandle>::VisitObjectPointers( 457 kOffsetOfRawPtrInFinalizablePersistentHandle>::VisitObjectPointers(
427 visitor); 458 visitor);
428 } 459 }
429 460
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 values_(values), num_values_(values_length) { 503 values_(values), num_values_(values_length) {
473 } 504 }
474 ~WeakReferenceSet() {} 505 ~WeakReferenceSet() {}
475 506
476 WeakReferenceSet* next() const { return next_; } 507 WeakReferenceSet* next() const { return next_; }
477 508
478 intptr_t num_keys() const { return num_keys_; } 509 intptr_t num_keys() const { return num_keys_; }
479 RawObject** get_key(intptr_t i) { 510 RawObject** get_key(intptr_t i) {
480 ASSERT(i >= 0); 511 ASSERT(i >= 0);
481 ASSERT(i < num_keys_); 512 ASSERT(i < num_keys_);
482 return (reinterpret_cast<FinalizablePersistentHandle*>(keys_[i]))-> 513 FinalizablePersistentHandle* ref =
483 raw_addr(); 514 FinalizablePersistentHandle::AsFinalizablePersistentHandle(keys_[i]);
515 return ref->raw_addr();
484 } 516 }
485 517
486 intptr_t num_values() const { return num_values_; } 518 intptr_t num_values() const { return num_values_; }
487 RawObject** get_value(intptr_t i) { 519 RawObject** get_value(intptr_t i) {
488 ASSERT(i >= 0); 520 ASSERT(i >= 0);
489 ASSERT(i < num_values_); 521 ASSERT(i < num_values_);
490 return (reinterpret_cast<FinalizablePersistentHandle*>(values_[i]))-> 522 FinalizablePersistentHandle* ref =
491 raw_addr(); 523 FinalizablePersistentHandle::AsFinalizablePersistentHandle(values_[i]);
524 return ref->raw_addr();
492 } 525 }
493 526
494 static WeakReferenceSet* Pop(WeakReferenceSet** queue) { 527 static WeakReferenceSet* Pop(WeakReferenceSet** queue) {
495 ASSERT(queue != NULL); 528 ASSERT(queue != NULL);
496 WeakReferenceSet* head = *queue; 529 WeakReferenceSet* head = *queue;
497 if (head != NULL) { 530 if (head != NULL) {
498 *queue = head->next(); 531 *queue = head->next();
499 head->next_ = NULL; 532 head->next_ = NULL;
500 } 533 }
501 return head; 534 return head;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 scope = scope->previous(); 678 scope = scope->previous();
646 } 679 }
647 persistent_handles().VisitObjectPointers(visitor); 680 persistent_handles().VisitObjectPointers(visitor);
648 if (visit_prologue_weak_handles) { 681 if (visit_prologue_weak_handles) {
649 prologue_weak_persistent_handles().VisitObjectPointers(visitor); 682 prologue_weak_persistent_handles().VisitObjectPointers(visitor);
650 } 683 }
651 } 684 }
652 685
653 void VisitWeakHandles(HandleVisitor* visitor, 686 void VisitWeakHandles(HandleVisitor* visitor,
654 bool visit_prologue_weak_handles) { 687 bool visit_prologue_weak_handles) {
655 weak_persistent_handles().VisitHandles(visitor); 688 weak_persistent_handles().VisitHandles(visitor, false);
656 if (visit_prologue_weak_handles) { 689 if (visit_prologue_weak_handles) {
657 prologue_weak_persistent_handles().VisitHandles(visitor); 690 prologue_weak_persistent_handles().VisitHandles(visitor, true);
658 } 691 }
659 } 692 }
660 693
661 bool IsValidLocalHandle(Dart_Handle object) const { 694 bool IsValidLocalHandle(Dart_Handle object) const {
662 ApiLocalScope* scope = top_scope_; 695 ApiLocalScope* scope = top_scope_;
663 while (scope != NULL) { 696 while (scope != NULL) {
664 if (scope->local_handles()->IsValidHandle(object)) { 697 if (scope->local_handles()->IsValidHandle(object)) {
665 return true; 698 return true;
666 } 699 }
667 scope = scope->previous(); 700 scope = scope->previous();
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 ApiNativeScope::Current()->zone()) {} 815 ApiNativeScope::Current()->zone()) {}
783 ApiGrowableArray() 816 ApiGrowableArray()
784 : BaseGrowableArray<T, ValueObject>( 817 : BaseGrowableArray<T, ValueObject>(
785 ApiNativeScope::Current()->zone()) {} 818 ApiNativeScope::Current()->zone()) {}
786 }; 819 };
787 820
788 821
789 } // namespace dart 822 } // namespace dart
790 823
791 #endif // VM_DART_API_STATE_H_ 824 #endif // VM_DART_API_STATE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698