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 |