1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/handles/local-handles.h" 6 7 #include "src/api/api.h" 8 #include "src/handles/handles.h" 9 10 namespace v8 { 11 namespace internal { 12 LocalHandles()13LocalHandles::LocalHandles() { scope_.Initialize(); } 14 Iterate(RootVisitor * visitor)15void LocalHandles::Iterate(RootVisitor* visitor) { 16 for (int i = 0; i < static_cast<int>(blocks_.size()) - 1; i++) { 17 Address* block = blocks_[i]; 18 visitor->VisitRootPointers(Root::kHandleScope, nullptr, 19 FullObjectSlot(block), 20 FullObjectSlot(&block[kHandleBlockSize])); 21 } 22 23 if (!blocks_.empty()) { 24 Address* block = blocks_.back(); 25 visitor->VisitRootPointers(Root::kHandleScope, nullptr, 26 FullObjectSlot(block), 27 FullObjectSlot(scope_.next)); 28 } 29 } 30 AddBlock()31Address* LocalHandles::AddBlock() { 32 DCHECK_EQ(scope_.next, scope_.limit); 33 Address* block = NewArray<Address>(kHandleBlockSize); 34 blocks_.push_back(block); 35 scope_.next = block; 36 scope_.limit = block + kHandleBlockSize; 37 return block; 38 } 39 RemoveBlocks()40void LocalHandles::RemoveBlocks() { 41 while (!blocks_.empty()) { 42 Address* block_start = blocks_.back(); 43 Address* block_limit = block_start + kHandleBlockSize; 44 45 if (block_limit == scope_.limit) { 46 break; 47 } 48 49 blocks_.pop_back(); 50 51 // TODO(dinfuehr): Zap handles in block 52 53 DeleteArray(block_start); 54 } 55 } 56 57 } // namespace internal 58 } // namespace v8 59