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