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()13 LocalHandles::LocalHandles() { scope_.Initialize(); }
14 
Iterate(RootVisitor * visitor)15 void 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()31 Address* 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()40 void 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