135 scoped_blocks_ = first_scoped_block_.next_block();
136 DeleteHandleBlocks(scoped_blocks_);
137 first_scoped_block_.ReInit();
138 scoped_blocks_ = &first_scoped_block_;
141template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
144 while (blocks !=
nullptr) {
145 HandlesBlock* block = blocks;
146 blocks = blocks->next_block();
151template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
152void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
153 SetupNextScopeBlock() {
154 if (FLAG_trace_handles) {
155 OS::PrintErr(
"*** Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n",
156 reinterpret_cast<intptr_t
>(
this), CountZoneHandles(),
157 CountScopedHandles());
159 if (scoped_blocks_->next_block() ==
nullptr) {
160 HandlesBlock* block =
new HandlesBlock(
nullptr);
161 scoped_blocks_->set_next_block(block);
163 scoped_blocks_ = scoped_blocks_->next_block();
164 scoped_blocks_->set_next_handle_slot(0);
166 scoped_blocks_->ZapFreeHandles();
173template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
176 const HandlesBlock* iterator = &first_scoped_block_;
177 while (iterator !=
nullptr) {
178 if (iterator->IsValidHandle(handle)) {
181 iterator = iterator->next_block();
186template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
189 const HandlesBlock* iterator = zone_blocks_;
190 while (iterator !=
nullptr) {
191 if (iterator->IsValidHandle(handle)) {
194 iterator = iterator->next_block();
199template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
202 if (FLAG_trace_handles) {
203 OS::PrintErr(
"*** Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n",
204 reinterpret_cast<intptr_t
>(
this), CountZoneHandles(),
205 CountScopedHandles());
207 zone_blocks_ =
new HandlesBlock(zone_blocks_);
210template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
214 const HandlesBlock* block = &first_scoped_block_;
216 count += block->HandleCount();
217 if (block == scoped_blocks_) {
220 block = block->next_block();
221 }
while (block !=
nullptr);
226template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
230 const HandlesBlock* block = zone_blocks_;
231 while (block !=
nullptr) {
232 count += block->HandleCount();
233 block = block->next_block();
238template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
246template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
247void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
248 HandlesBlock::ReInit() {
249 next_handle_slot_ = 0;
250 next_block_ =
nullptr;
256template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
257void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
258 HandlesBlock::VisitObjectPointers(ObjectPointerVisitor* visitor) {
259 ASSERT(visitor !=
nullptr);
260 for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) {
261 visitor->VisitPointer(
266template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
267void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
268 HandlesBlock::Visit(HandleVisitor* visitor) {
269 ASSERT(visitor !=
nullptr);
270 for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) {
271 visitor->VisitHandle(
reinterpret_cast<uword>(&data_[i]));
276template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
277void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
278 HandlesBlock::ZapFreeHandles() {
280 for (intptr_t i = next_handle_slot_;
281 i < (kHandleSizeInWords * kHandlesPerChunk); i++) {
287template <
int kHandleSizeInWords,
int kHandlesPerChunk,
int kOffsetOfRawPtr>
288int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::
289 HandlesBlock::HandleCount()
const {
290 return (next_handle_slot_ / kHandleSizeInWords);