Chromium Code Reviews| OLD | NEW |
|---|---|
| 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_OBJECT_SET_H_ | 5 #ifndef VM_OBJECT_SET_H_ |
| 6 #define VM_OBJECT_SET_H_ | 6 #define VM_OBJECT_SET_H_ |
| 7 | 7 |
| 8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
| 9 #include "vm/raw_object.h" | |
| 10 #include "platform/utils.h" | |
|
siva
2012/12/05 16:06:40
This order is not consistent with most other files
cshapiro
2012/12/08 03:23:08
Correct. Done.
| |
| 9 | 11 |
| 10 namespace dart { | 12 namespace dart { |
| 11 | 13 |
| 12 class ObjectSet { | 14 class ObjectSet { |
| 13 public: | 15 public: |
| 14 ObjectSet(uword start, uword end) : start_(start), end_(end) { | 16 ObjectSet() { |
| 17 Init(0, 0); | |
| 18 } | |
| 19 | |
| 20 ObjectSet(uword start, uword end) { | |
| 21 Init(start, end); | |
| 22 } | |
| 23 | |
| 24 ~ObjectSet() { | |
| 25 delete[] allocation_; | |
| 26 } | |
| 27 | |
| 28 void Init(uword start, uword end) { | |
| 29 start_ = start; | |
| 30 end_ = end; | |
| 15 ASSERT(start_ <= end_); | 31 ASSERT(start_ <= end_); |
| 16 size_ = SizeFor((end_ - start_) >> kWordSizeLog2); | 32 size_ = SizeFor((end_ - start_) >> kWordSizeLog2); |
| 17 allocation_ = new uword[size_]; | 33 allocation_ = new uword[size_]; |
| 18 data_ = &allocation_[-((start >> kWordSizeLog2) / kBitsPerWord)]; | 34 data_ = &allocation_[-((start >> kWordSizeLog2) / kBitsPerWord)]; |
| 19 ASSERT(allocation_ == &data_[(start >> kWordSizeLog2) / kBitsPerWord]); | 35 ASSERT(allocation_ == &data_[(start >> kWordSizeLog2) / kBitsPerWord]); |
| 20 Clear(); | 36 Clear(); |
| 21 } | 37 } |
| 22 | 38 |
| 23 ~ObjectSet() { | |
| 24 delete[] allocation_; | |
| 25 } | |
| 26 | |
| 27 bool Contains(RawObject* raw_obj) const { | 39 bool Contains(RawObject* raw_obj) const { |
| 28 uword raw_addr = RawObject::ToAddr(raw_obj); | 40 uword raw_addr = RawObject::ToAddr(raw_obj); |
| 29 ASSERT(raw_addr >= start_); | 41 ASSERT(raw_addr >= start_); |
| 30 ASSERT(raw_addr < end_); | 42 ASSERT(raw_addr < end_); |
| 31 uword i = raw_addr >> kWordSizeLog2; | 43 uword i = raw_addr >> kWordSizeLog2; |
| 32 uword mask = (static_cast<uword>(1) << (i % kBitsPerWord)); | 44 uword mask = (static_cast<uword>(1) << (i % kBitsPerWord)); |
| 33 return (data_[i / kBitsPerWord] & mask) != 0; | 45 return (data_[i / kBitsPerWord] & mask) != 0; |
| 34 } | 46 } |
| 35 | 47 |
| 36 void Add(RawObject* raw_obj) { | 48 void Add(RawObject* raw_obj) { |
| 37 uword raw_addr = RawObject::ToAddr(raw_obj); | 49 uword raw_addr = RawObject::ToAddr(raw_obj); |
| 38 ASSERT(raw_addr >= start_); | 50 ASSERT(raw_addr >= start_); |
| 39 ASSERT(raw_addr < end_); | 51 ASSERT(raw_addr < end_); |
| 40 uword i = raw_addr >> kWordSizeLog2; | 52 uword i = raw_addr >> kWordSizeLog2; |
| 41 data_[i / kBitsPerWord] |= (static_cast<uword>(1) << (i % kBitsPerWord)); | 53 data_[i / kBitsPerWord] |= (static_cast<uword>(1) << (i % kBitsPerWord)); |
| 54 min_ = Utils::Minimum(raw_addr, min_); | |
| 55 max_ = Utils::Maximum(raw_addr, max_); | |
| 56 } | |
| 57 | |
| 58 void Resize(uword start, uword end) { | |
| 59 if (start_ != start || end_ != end) { | |
| 60 delete[] allocation_; | |
| 61 Init(start, end); | |
| 62 } | |
| 42 } | 63 } |
| 43 | 64 |
| 44 void Clear() { | 65 void Clear() { |
| 45 memset(allocation_, 0, (size_ * sizeof(allocation_[0]))); | 66 memset(allocation_, 0, (size_ * sizeof(allocation_[0]))); |
| 67 min_ = end_; | |
| 68 max_ = start_; | |
| 69 } | |
| 70 | |
| 71 void FastClear() { | |
| 72 uword i = min_ >> kWordSizeLog2; | |
| 73 memset(&data_[i / kBitsPerWord], | |
| 74 0, | |
| 75 sizeof(uword) * SizeFor((max_ + 1 - min_) >> kWordSizeLog2)); | |
| 76 min_ = end_; | |
| 77 max_ = start_; | |
| 46 } | 78 } |
| 47 | 79 |
| 48 private: | 80 private: |
| 49 static intptr_t SizeFor(intptr_t length) { | 81 static intptr_t SizeFor(intptr_t length) { |
| 50 return 1 + ((length - 1) / kBitsPerWord); | 82 return 1 + ((length - 1) / kBitsPerWord); |
| 51 } | 83 } |
| 52 | 84 |
| 53 // Biased data pointer aliased to allocation_. This value can be | 85 // Biased data pointer aliased to allocation_. This value can be |
| 54 // indexed without adjusting for the starting address of the heap. | 86 // indexed without adjusting for the starting address of the heap. |
| 55 uword* data_; | 87 uword* data_; |
| 56 | 88 |
| 57 // Allocated data pointer. | 89 // Allocated data pointer. |
| 58 uword* allocation_; | 90 uword* allocation_; |
| 59 | 91 |
| 60 // Allocation size in uwords. | 92 // Allocation size in uwords. |
| 61 intptr_t size_; | 93 intptr_t size_; |
| 62 | 94 |
| 63 // Lowest possible heap address, inclusive. | 95 // Lowest possible heap address, inclusive. |
| 64 uword start_; | 96 uword start_; |
| 65 | 97 |
| 66 // Highest possible heap address, exclusive. | 98 // Highest possible heap address, exclusive. |
| 67 uword end_; | 99 uword end_; |
| 68 | 100 |
| 69 DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectSet); | 101 // The inclusive minimum address set in this ObjectMap. |
| 102 // Used by FastClear | |
| 103 uword min_; | |
| 104 | |
| 105 // The inclusive maximum address in this ObjectMap. | |
| 106 // Used by FastClear | |
| 107 uword max_; | |
| 108 | |
| 109 DISALLOW_COPY_AND_ASSIGN(ObjectSet); | |
| 70 }; | 110 }; |
| 71 | 111 |
| 72 } // namespace dart | 112 } // namespace dart |
| 73 | 113 |
| 74 #endif // VM_OBJECT_SET_H_ | 114 #endif // VM_OBJECT_SET_H_ |
| OLD | NEW |