1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met:
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions of source code must retain the above copyright
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       notice, this list of conditions and the following disclaimer.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions in binary form must reproduce the above
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       copyright notice, this list of conditions and the following
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       disclaimer in the documentation and/or other materials provided
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       with the distribution.
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       contributors may be used to endorse or promote products derived
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       from this software without specific prior written permission.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/global-handles.h"
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal;
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing v8::UniqueId;
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic List<Object*> skippable_objects;
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic List<Object*> can_skip_called_objects;
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic bool CanSkipCallback(Heap* heap, Object** pointer) {
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  can_skip_called_objects.Add(*pointer);
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return skippable_objects.Contains(*pointer);
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void ResetCanSkipData() {
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  skippable_objects.Clear();
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  can_skip_called_objects.Clear();
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TestRetainedObjectInfo : public v8::RetainedObjectInfo {
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestRetainedObjectInfo() : has_been_disposed_(false) {}
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_been_disposed() { return has_been_disposed_; }
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Dispose() {
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!has_been_disposed_);
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    has_been_disposed_ = true;
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsEquivalent(v8::RetainedObjectInfo* other) {
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return other == this;
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual intptr_t GetHash() { return 0; }
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual const char* GetLabel() { return "whatever"; }
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_been_disposed_;
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TestObjectVisitor : public ObjectVisitor {
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void VisitPointers(Object** start, Object** end) override {
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (Object** o = start; o != end; ++o)
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      visited.Add(*o);
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  List<Object*> visited;
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(IterateObjectGroupsOldApi) {
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CcTest::InitializeVM();
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = CcTest::i_isolate();
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GlobalHandles* global_handles = isolate->global_handles();
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::HandleScope handle_scope(CcTest::isolate());
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g1s1 =
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g1s2 =
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g2s1 =
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g2s2 =
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestRetainedObjectInfo info1;
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestRetainedObjectInfo info2;
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object** g1_objects[] = { g1s1.location(), g1s2.location() };
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object** g2_objects[] = { g2s1.location(), g2s2.location() };
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->AddObjectGroup(g1_objects, 2, &info1);
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->AddObjectGroup(g2_objects, 2, &info2);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate the object groups. First skip all.
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ResetCanSkipData();
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g1s1.location());
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g1s2.location());
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s1.location());
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s2.location());
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestObjectVisitor visitor;
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->IterateObjectGroups(&visitor, &CanSkipCallback);
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // CanSkipCallback was called for all objects.
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.length() == 4);
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g1s1.location()));
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g1s2.location()));
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s1.location()));
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s2.location()));
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Nothing was visited.
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.length() == 0);
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!info1.has_been_disposed());
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!info2.has_been_disposed());
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate again, now only skip the second object group.
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ResetCanSkipData();
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The first grough should still be visited, since only one object is
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // skipped.
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g1s1.location());
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s1.location());
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s2.location());
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestObjectVisitor visitor;
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->IterateObjectGroups(&visitor, &CanSkipCallback);
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // CanSkipCallback was called for all objects.
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.length() == 3 ||
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          can_skip_called_objects.length() == 4);
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g1s2.location()));
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s1.location()));
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s2.location()));
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The first group was visited.
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.length() == 2);
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g1s1.location()));
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g1s2.location()));
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(info1.has_been_disposed());
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!info2.has_been_disposed());
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate again, don't skip anything.
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ResetCanSkipData();
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestObjectVisitor visitor;
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->IterateObjectGroups(&visitor, &CanSkipCallback);
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // CanSkipCallback was called for all objects.
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.length() == 1);
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s1.location()) ||
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          can_skip_called_objects.Contains(*g2s2.location()));
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The second group was visited.
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.length() == 2);
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g2s1.location()));
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g2s2.location()));
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(info2.has_been_disposed());
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(IterateObjectGroups) {
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CcTest::InitializeVM();
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = CcTest::i_isolate();
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GlobalHandles* global_handles = isolate->global_handles();
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::HandleScope handle_scope(CcTest::isolate());
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g1s1 =
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g1s2 =
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g2s1 =
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g2s2 =
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->Create(*isolate->factory()->NewFixedArray(1));
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestRetainedObjectInfo info1;
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestRetainedObjectInfo info2;
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetObjectGroupId(g2s1.location(), UniqueId(2));
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetObjectGroupId(g2s2.location(), UniqueId(2));
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetRetainedObjectInfo(UniqueId(2), &info2);
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetObjectGroupId(g1s1.location(), UniqueId(1));
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetObjectGroupId(g1s2.location(), UniqueId(1));
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetRetainedObjectInfo(UniqueId(1), &info1);
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate the object groups. First skip all.
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ResetCanSkipData();
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g1s1.location());
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g1s2.location());
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s1.location());
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s2.location());
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestObjectVisitor visitor;
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->IterateObjectGroups(&visitor, &CanSkipCallback);
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // CanSkipCallback was called for all objects.
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.length() == 4);
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g1s1.location()));
221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g1s2.location()));
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s1.location()));
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s2.location()));
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Nothing was visited.
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.length() == 0);
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!info1.has_been_disposed());
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!info2.has_been_disposed());
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate again, now only skip the second object group.
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ResetCanSkipData();
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The first grough should still be visited, since only one object is
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // skipped.
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g1s1.location());
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s1.location());
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    skippable_objects.Add(*g2s2.location());
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestObjectVisitor visitor;
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->IterateObjectGroups(&visitor, &CanSkipCallback);
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // CanSkipCallback was called for all objects.
243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.length() == 3 ||
244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          can_skip_called_objects.length() == 4);
245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g1s2.location()));
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s1.location()));
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s2.location()));
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The first group was visited.
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.length() == 2);
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g1s1.location()));
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g1s2.location()));
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(info1.has_been_disposed());
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!info2.has_been_disposed());
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate again, don't skip anything.
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ResetCanSkipData();
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestObjectVisitor visitor;
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->IterateObjectGroups(&visitor, &CanSkipCallback);
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // CanSkipCallback was called for all objects.
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.length() == 1);
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(can_skip_called_objects.Contains(*g2s1.location()) ||
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          can_skip_called_objects.Contains(*g2s2.location()));
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The second group was visited.
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.length() == 2);
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g2s1.location()));
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(visitor.visited.Contains(*g2s2.location()));
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(info2.has_been_disposed());
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(ImplicitReferences) {
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CcTest::InitializeVM();
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = CcTest::i_isolate();
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GlobalHandles* global_handles = isolate->global_handles();
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::HandleScope handle_scope(CcTest::isolate());
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g1s1 =
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g1c1 =
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g1c2 =
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g2s1 =
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->Create(*isolate->factory()->NewFixedArray(1));
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g2s2 =
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->Create(*isolate->factory()->NewFixedArray(1));
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> g2c1 =
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    global_handles->Create(*isolate->factory()->NewFixedArray(1));
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetObjectGroupId(g1s1.location(), UniqueId(1));
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetObjectGroupId(g2s1.location(), UniqueId(2));
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetObjectGroupId(g2s2.location(), UniqueId(2));
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetReferenceFromGroup(UniqueId(1), g1c1.location());
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetReferenceFromGroup(UniqueId(1), g1c2.location());
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->SetReferenceFromGroup(UniqueId(2), g2c1.location());
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  List<ImplicitRefGroup*>* implicit_refs =
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      global_handles->implicit_ref_groups();
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  USE(implicit_refs);
309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->length() == 2);
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->at(0)->parent ==
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        reinterpret_cast<HeapObject**>(g1s1.location()));
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->at(0)->length == 2);
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->at(0)->children[0] == g1c1.location());
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->at(0)->children[1] == g1c2.location());
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->at(1)->parent ==
316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        reinterpret_cast<HeapObject**>(g2s1.location()));
317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->at(1)->length == 1);
318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(implicit_refs->at(1)->children[0] == g2c1.location());
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->RemoveObjectGroups();
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  global_handles->RemoveImplicitRefGroups();
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(EternalHandles) {
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CcTest::InitializeVM();
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = CcTest::i_isolate();
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EternalHandles* eternal_handles = isolate->eternal_handles();
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create a number of handles that will not be on a block boundary
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int kArrayLength = 2048-1;
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int indices[kArrayLength];
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::Eternal<v8::Value> eternals[kArrayLength];
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, eternal_handles->NumberOfHandles());
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kArrayLength; i++) {
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    indices[i] = -1;
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HandleScope scope(isolate);
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    v8::Local<v8::Object> object = v8::Object::New(v8_isolate);
340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    object->Set(v8_isolate->GetCurrentContext(), i,
341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                v8::Integer::New(v8_isolate, i))
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        .FromJust();
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Create with internal api
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    eternal_handles->Create(
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        isolate, *v8::Utils::OpenHandle(*object), &indices[i]);
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Create with external api
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(eternals[i].IsEmpty());
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    eternals[i].Set(v8_isolate, object);
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!eternals[i].IsEmpty());
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  isolate->heap()->CollectAllAvailableGarbage();
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < kArrayLength; i++) {
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int j = 0; j < 2; j++) {
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HandleScope scope(isolate);
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      v8::Local<v8::Value> local;
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (j == 0) {
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // Test internal api
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        local = v8::Utils::ToLocal(eternal_handles->Get(indices[i]));
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // Test external api
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        local = eternals[i].Get(v8_isolate);
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(local);
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Local<v8::Value> value =
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          object->Get(v8_isolate->GetCurrentContext(), i).ToLocalChecked();
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(value->IsInt32());
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(i,
370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               value->Int32Value(v8_isolate->GetCurrentContext()).FromJust());
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2*kArrayLength, eternal_handles->NumberOfHandles());
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an eternal via the constructor
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HandleScope scope(isolate);
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    v8::Local<v8::Object> object = v8::Object::New(v8_isolate);
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    v8::Eternal<v8::Object> eternal(v8_isolate, object);
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!eternal.IsEmpty());
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(object == eternal.Get(v8_isolate));
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(2*kArrayLength + 1, eternal_handles->NumberOfHandles());
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(PersistentBaseGetLocal) {
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CcTest::InitializeVM();
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Isolate* isolate = CcTest::isolate();
392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::HandleScope scope(isolate);
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Local<v8::Object> o = v8::Object::New(isolate);
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(!o.IsEmpty());
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Persistent<v8::Object> p(isolate, o);
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(o == p.Get(isolate));
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(v8::Local<v8::Object>::New(isolate, p) == p.Get(isolate));
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Global<v8::Object> g(isolate, o);
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(o == g.Get(isolate));
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(v8::Local<v8::Object>::New(isolate, g) == g.Get(isolate));
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid WeakCallback(const v8::WeakCallbackInfo<void>& data) {}
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(WeakPersistentSmi) {
410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CcTest::InitializeVM();
411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Isolate* isolate = CcTest::isolate();
412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::HandleScope scope(isolate);
414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Local<v8::Number> n = v8::Number::New(isolate, 0);
415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Global<v8::Number> g(isolate, n);
416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Should not crash.
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  g.SetWeak<void>(nullptr, &WeakCallback, v8::WeakCallbackType::kParameter);
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
420