// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/handles/local-handles.h" #include "src/api/api.h" #include "src/handles/handles.h" namespace v8 { namespace internal { LocalHandles::LocalHandles() { scope_.Initialize(); } void LocalHandles::Iterate(RootVisitor* visitor) { for (int i = 0; i < static_cast(blocks_.size()) - 1; i++) { Address* block = blocks_[i]; visitor->VisitRootPointers(Root::kHandleScope, nullptr, FullObjectSlot(block), FullObjectSlot(&block[kHandleBlockSize])); } if (!blocks_.empty()) { Address* block = blocks_.back(); visitor->VisitRootPointers(Root::kHandleScope, nullptr, FullObjectSlot(block), FullObjectSlot(scope_.next)); } } Address* LocalHandles::AddBlock() { DCHECK_EQ(scope_.next, scope_.limit); Address* block = NewArray
(kHandleBlockSize); blocks_.push_back(block); scope_.next = block; scope_.limit = block + kHandleBlockSize; return block; } void LocalHandles::RemoveBlocks() { while (!blocks_.empty()) { Address* block_start = blocks_.back(); Address* block_limit = block_start + kHandleBlockSize; if (block_limit == scope_.limit) { break; } blocks_.pop_back(); // TODO(dinfuehr): Zap handles in block DeleteArray(block_start); } } } // namespace internal } // namespace v8