blob: 26e4fb596a4a0b68ee135f1143a1e6d673fb9b75 [file] [log] [blame]
// 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<int>(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<Address>(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